Функция пользовательского индикатора для quantstrat

У меня возникли проблемы с написанием пользовательской функции индикатора для использования с 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 

person Rilcon42    schedule 26.06.2016    source источник
comment
Где функция add.indicator? Единственная функция, для которой вы показываете код, это RSI.lagged (и если вы хотите, чтобы внутри нее использовалось price, вы должны передать аргумент с именем price), но вы не показываете никакого кода, который ее вызывает.   -  person Gregor Thomas    schedule 27.06.2016
comment
Приношу свои извинения, library(quantstrat) необходимая библиотека. Я отредактировал свой код, чтобы включить это.   -  person Rilcon42    schedule 27.06.2016
comment
Я все еще в замешательстве --- я полагаю, вы ответили на первые 5 слов моего комментария, но проигнорировали остальные 40 слов. Или я что-то еще упускаю?   -  person Gregor Thomas    schedule 27.06.2016
comment
У меня сложилось впечатление, что ... означает, что все аргументы (например, цена), указанные в параметрах add.indicator arguments, будут волшебным образом переданы в функцию RSI.lagged. Я как-то неправильно понимаю значение ...?   -  person Rilcon42    schedule 27.06.2016
comment
Вы вообще не используете аргумент ... для add.indicator. Он имеет как параметр arguments (который вы используете), так и параметр ..., который вы не используете... хотя документация не делает разницу между ними очень ясной.   -  person Gregor Thomas    schedule 27.06.2016
comment
Однако вы неправильно понимаете ... в RSI.lagged. Единственная причина, по которой функция foo должна иметь ... в своем определении, заключается в том, что foo ничего не сделает с аргументами ..., кроме передачи их другой функции - какими бы они ни были. Ваша функция RSI.lagged специально использует аргумент с именем price, поэтому price должен быть формальным именованным аргументом RSI.lagged.   -  person Gregor Thomas    schedule 27.06.2016
comment
Чтобы было ясно, я думаю, что это сработает, если вы замените ... на price в своем определении RSI.lagged. Хотя не тестировал...   -  person Gregor Thomas    schedule 27.06.2016
comment
Спасибо за объяснение - я безуспешно пытался пройти price. (см. ошибку выше)   -  person Rilcon42    schedule 27.06.2016
comment
Ну и в чем смысл твоей строки colnames(out) <- "rsi"? У векторов нет имен столбцов, поэтому либо удалите эту строку, либо приведите rsi к фрейму данных с 1 столбцом. Возможно, вы хотите вернуть вектор. Или, может быть, вы хотите вернуть RSI["rsi"].   -  person Gregor Thomas    schedule 27.06.2016
comment
Круто, не могли бы вы опубликовать комментарии 5 и 6 в качестве ответа с некоторыми ссылками на документацию, чтобы я мог принять ее и решить вопрос?   -  person Rilcon42    schedule 29.06.2016


Ответы (1)


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

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 для ретроспективного тестирования, поскольку цены не являются «реальными»; это средневзвешенная цена за каждый день. См.: Точная отметка времени в данных валюты quantmod (FX))

person FXQuantTrader    schedule 10.11.2017
comment
ВАУ Эта последняя строка невероятно важна..... Большое спасибо, что указали на это! - person Rilcon42; 10.11.2017