У меня возникли проблемы с написанием пользовательской функции индикатора для использования с quanstrat::add.indicator
Ошибка:
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
add.indicator
? Единственная функция, для которой вы показываете код, этоRSI.lagged
(и если вы хотите, чтобы внутри нее использовалосьprice
, вы должны передать аргумент с именемprice
), но вы не показываете никакого кода, который ее вызывает. - person Gregor Thomas   schedule 27.06.2016library(quantstrat)
необходимая библиотека. Я отредактировал свой код, чтобы включить это. - person Rilcon42   schedule 27.06.2016...
означает, что все аргументы (например, цена), указанные в параметрахadd.indicator
arguments
, будут волшебным образом переданы в функцию RSI.lagged. Я как-то неправильно понимаю значение...
? - person Rilcon42   schedule 27.06.2016...
дляadd.indicator
. Он имеет как параметрarguments
(который вы используете), так и параметр...
, который вы не используете... хотя документация не делает разницу между ними очень ясной. - person Gregor Thomas   schedule 27.06.2016...
вRSI.lagged
. Единственная причина, по которой функцияfoo
должна иметь...
в своем определении, заключается в том, чтоfoo
ничего не сделает с аргументами...
, кроме передачи их другой функции - какими бы они ни были. Ваша функцияRSI.lagged
специально использует аргумент с именемprice
, поэтомуprice
должен быть формальным именованным аргументомRSI.lagged
. - person Gregor Thomas   schedule 27.06.2016...
наprice
в своем определенииRSI.lagged
. Хотя не тестировал... - person Gregor Thomas   schedule 27.06.2016price
. (см. ошибку выше) - person Rilcon42   schedule 27.06.2016colnames(out) <- "rsi"
? У векторов нет имен столбцов, поэтому либо удалите эту строку, либо приведитеrsi
к фрейму данных с 1 столбцом. Возможно, вы хотите вернуть вектор. Или, может быть, вы хотите вернутьRSI["rsi"]
. - person Gregor Thomas   schedule 27.06.2016