2016-06-26 3 views
1

У меня возникли проблемы при записи пользовательской функции индикатора для использования с quanstrat::add.indicatorПользовательская функция индикатора для quantstrat

Ошибка:

Error in inherits(x, "xts") : object 'price' not found 

Мой код:

library(quantstrat) 
symbols<-getSymbols("USD/EUR",src="oanda") 
strat<-acct<-portfolio<-"tempTest" 
initEq<-1000 

initDate <- '2009-12-31' 
currency("USD") 
exchange_rate(symbols, currency="USD") 
rm.strat(strat) # remove portfolio, account, orderbook if re-run 
initPortf(name=portfolio, symbols, initDate=Sys.Date()) 
initAcct(name=acct, portfolios=portfolio,initDate=Sys.Date(), initEq=initEq) 
initOrders(portfolio=portfolio, initDate=Sys.Date()) 
strategy(strat, store=TRUE) 

colnames(USDEUR)<-"Close" 
################################################################################################# 

RSI.lagged<-function(lag=1,n=2,...){ 
    RSI <- RSI(price) 
    RSI <- lag(RSI, lag) 
    out <- RSI$rsi 
    colnames(out) <- "rsi" 
    return(out) 
} 

########RSI indicator 
####THIS IS LAGGED TO PREVENT FOREKNOWLEDGE 
add.indicator(strat, name="RSI.lagged", arguments=list(price = quote(Cl(mktdata)), n=2), label="rsiIndLagged") 
test <- applyIndicators(strat, mktdata=USDEUR) 

После добавления параметра price к функции RSI.lagged, например RSI.lagged<-function(lag=1,n=2,price,...) Я получаю сообщение об ошибке:

Error in `colnames<-`(`*tmp*`, value = "rsi") : attempt to set 'colnames' on an object with less than two dimensions 
+1

Где функция 'add.indicator'? Единственной функцией, которую вы показываете для кода, является 'RSI.lagged' (и если вы хотите, чтобы она использовала' price' внутри нее, тогда вы должны передать аргумент с именем 'price'), но вы не показываете код, который его вызывает , – Gregor

+0

Мои извинения, 'library (quantstrat)' является необходимой библиотекой. Я редактировал мой код, чтобы включить это. – Rilcon42

+0

Я все еще смущен --- Я считаю, что вы ответили на первые 5 слов моего комментария, но проигнорировали остальные 40 слов. Или я пропустил что-то еще? – Gregor

ответ

2

Вы пытались получить доступ к имени столбца, который не существует. Попробуйте это вместо того, чтобы получить ваш индикатор работы:

RSI.lagged<-function(price, lag=1,n=2,...){ 
    # Stick in a browser to see your problem more clearly: 
    # browser() 
    rsi <- RSI(price) 
    rsi <- lag(rsi, lag) 
    # This column name does not exist: "rsi". The name of the column gets the default "EMA" 
    # tail(rsi) 
    #     EMA 
    # 2017-11-04 63.48806 
    # 2017-11-05 66.43532 
    # 2017-11-06 64.41188 
    # 2017-11-07 66.02659 
    # 2017-11-08 67.96394 
    # 2017-11-09 66.08134 
    colnames(rsi) <- "rsi" 
    return(out) 
} 

(Кроме, также настоятельно рекомендуем вам не попробовать использовать данные Oanda для Backtest с, так как цены не являются «реальным», они представляют собой средневзвешенную цену для каждого дня. См.: Exact time stamp on quantmod currency (FX) data)

+0

WOW Эта последняя строка невероятно важна ..... Большое спасибо за указание на это! – Rilcon42

Смежные вопросы