Your code example should be in the form of a reproducible example which can easily be reproduced using the reprex package.
Here's a tutorial on reprex's Get help!
As is your code is not runable because it doesn't load the rugarch package. It's probably working on your Windows machine because it was already loaded into the session you ran your code. If instead you had used reprex to run it you would have spotted the missing package because a reprex always runs your code in a brand new session.
The main reason we would like code in reprex helps us help you by making it possible to run your code in the same environment as you. That way we spend less time working on issues unrelated to problem you are running into. Most everyone here who is answering questions is doing it in their spare time so you should do what you can to minimize the time they spend working out an answer. A reprex is the best way to do that.
Once I added the missing package to your code I got the same error as you... running on macOS.
Below is your code with plot.new() added. plot.new() cleans up the plot area so a new plot can be written into it. Now it plots but the plot are empty and one is missing.
My guess, and this is just a guess, there is something in the session you are running in on your Windows machine that is different than the session in your Ubuntu system.
Even outside of asking questions here reprex is a great development tool to catch errors like this.
If you have any issues getting a reprex to work please post a new topic with your questions about reprex. You will get all kinds of help to get it going.
suppressPackageStartupMessages( library(PerformanceAnalytics))
suppressPackageStartupMessages( library(quantmod))
suppressPackageStartupMessages( library(rugarch))
suppressPackageStartupMessages( library(rmgarch))
# download data
symbol.vec = c("MSFT", "^GSPC")
getSymbols(symbol.vec, from ="2005-01-01", to = "2018-01-01")
#> 'getSymbols' currently uses auto.assign=TRUE by default, but will
#> use auto.assign=FALSE in 0.5-0. You will still be able to use
#> 'loadSymbols' to automatically load data. getOption("getSymbols.env")
#> and getOption("getSymbols.auto.assign") will still be checked for
#> alternate defaults.
#>
#> This message is shown once per session and may be disabled by setting
#> options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
#>
#> WARNING: There have been significant changes to Yahoo Finance data.
#> Please see the Warning section of '?getSymbols.yahoo' for details.
#>
#> This message is shown once per session and may be disabled by setting
#> options("getSymbols.yahoo.warning"=FALSE).
#> [1] "MSFT" "GSPC"
# extract adjusted closing prices
MSFT = MSFT[, "MSFT.Adjusted", drop=F]
GSPC = GSPC[, "GSPC.Adjusted", drop=F]
# calculate log-returns
MSFT.ret = CalculateReturns(MSFT, method="log")
GSPC.ret = CalculateReturns(GSPC, method="log")
# remove first NA observation
MSFT.ret = MSFT.ret[-1,]
GSPC.ret = GSPC.ret[-1,]
colnames(MSFT.ret) ="MSFT"
colnames(GSPC.ret) = "GSPC"
# create combined data series
MSFT.GSPC.ret = merge(MSFT.ret,GSPC.ret)
# DCC estimation
# univariate normal GARCH(1,1) for each series
garch11.spec = ugarchspec(mean.model = list(armaOrder = c(0,0)),
variance.model = list(garchOrder = c(1,1),
model = "sGARCH"),
distribution.model = "norm")
# dcc specification - GARCH(1,1) for conditional correlations
dcc.garch11.spec = dccspec(uspec = multispec( replicate(2, garch11.spec) ),
dccOrder = c(1,1),
distribution = "mvnorm")
# fit DCC model
dcc.fit = dccfit(dcc.garch11.spec, data = MSFT.GSPC.ret)
# plot Conditional Sigma
plot.new()
plot(dcc.fit, which=2)