Предупреждение в течение цикла

Мой for цикл не работает должным образом. У меня есть следующее предупреждение: imaginary parts discarded in coercion, Что является решением этой проблемы? Кроме того, есть ли способ сделать мой код более эффективным или иметь лучший стиль?

# Load Packages
library(quantstrat) 

# Initialize Settings
start.date <- "2017-05-01"
end.date <- as.character(Sys.Date())

# Stock Tickers
tickers <- c("JPM", # JP Morgan
  "FB", # Facebook
  "SPY", # S&P 500
  "AMZN", # Amazon
  "WMT", # Wal-Mart
  "LVMUY", # LVMH
  "MCD", # Mac Donald's
  "BMW", # BMW
  "KO",  # Coca-Cola
  "G13.SI" # Genting Sg
)

# Retrieving Stock Data
options("getSymbols.yahoo.warning"=FALSE)
suppressMessages(getSymbols(Symbols = tickers, from = start.date, 
                            to = end.date, src = "yahoo", adjust = TRUE))

# Grouping Adjusted Prices and Interpoloating NA Values
ClPrices <- do.call(merge, lapply(tickers, function(x) Cl(get(x))))
ClPrices <- na.approx(ClPrices)

# Apply MACD
MACD.res <- do.call(merge, lapply(ClPrices, function(x, nFast, nSlow, nSig) {
  y <- MACD(x, nFast, nSlow, nSig) 
  colnames(y) <- paste0(colnames(y),".", gsub(pattern = ".Close", 
                        replacement = "", x = colnames(x)))
  y
}, nFast = 12, nSlow = 26, nSig = 9))

# Apply RSI
RSI.res <- do.call(merge, lapply(ClPrices, function(x, n) {
  t <- RSI(x, n=14)
  colnames(t) <- paste0(colnames(t), ".", 
                        gsub(pattern = ".Close", replacement = "", x = colnames(x)))
  t
}, n = 14))

# Generating Buy/Sell Signals
Signals <- "Initialise"
for (i in 1:ncol(ClPrices)){
  if((MACD.res[nrow(MACD.res),2i] > MACD.res[nrow(MACD.res),2i-1]) && 
     (MACD.res[nrow(MACD.res)-1,2i] < MACD.res[nrow(MACD.res)-1,2i-1]) && 
     (RSI.res[nrow(RSI.res),i] < 30)){
    Signals[i] <- paste("Buy", tickers[i])
  } else if ((MACD.res[nrow(MACD.res),2i] < MACD.res[nrow(MACD.res),2i-1]) && 
             (MACD.res[nrow(MACD.res)-1,2i] > MACD.res[nrow(MACD.res)-1,i]) && 
             (RSI.res[nrow(RSI.res),i] > 80)) {
    Signals[i] <- paste("Sell", tickers[i])
  } else {
    Signals[i] <-paste("No trade", tickers[i])
  }
}  
# Output
View(Signals)

1 ответ

Решение

Это может быть MACD.res[nrow(MACD.res),2i], Ты должен сделать MACD.res[nrow(MACD.res),2*i]

Другие вопросы по тегам