2

我想在我的自定义指标函数中访问当前的符号字符串,例如“GOOG”。这是我能做的最基本的例子。

require(quantstrat)
Sys.setenv(TZ="UTC")
symbols <- c("GOOG", "AAPL")
getSymbols(symbols, src="yahoo")
strategy.st  <- "test"
strategy(strategy.st, store=TRUE)


test_fun <- function(x){
  print(symbol)  ##### i want to access the current symbol eg "GOOG"
  return(x)
} 



add.indicator(strategy = strategy.st,
              name = "test_fun",
              arguments = list(x = quote(Cl(mktdata))),
              label = "test_ind")


mktdata <- applyIndicators(strategy = strategy.st, GOOG)

Error in print(symbol) : object 'symbol' not found
Called from: print(symbol)
4

1 回答 1

2

好问题。

从你的函数中获取符号applyIndicator作为一个独立的函数调用并没有多大意义,因为mktdata = GOOG参数已经包含了你想要的数据。我怀疑您想在applyIndicator通话中获得符号,但当您打电话时工作时applyStrategy...

你可以这样做:

require(quantstrat)
Sys.setenv(TZ="UTC")
symbols <- c("GOOG", "AAPL")
getSymbols(symbols, src="yahoo")

currency("USD")
stock(c("GOOG", "AAPL"), "USD")

strategy.st  <- "test"
portfolio.st  <- "test"
rm.strat(strategy.st)
initPortf(portfolio.st, symbols = symbols)
strategy(strategy.st, store=TRUE)


account.st  <- "test"
initAcct(account.st, portfolios = portfolio.st, initEq = 1000)
initOrders(portfolio.st)



test_fun <- function(x){
  symbol <- parent.frame(n = 2)$symbol
  print(symbol)  ##### i want to access the current symbol eg "GOOG"
  return(x)
} 



add.indicator(strategy = strategy.st,
              name = "test_fun",
              arguments = list(x = quote(Cl(mktdata))),
              label = "test_ind")
applyStrategy(strategy.st, portfolio.st)

这是applyStrategy因为父环境向上几个级别循环围绕符号循环(applyIndicators在每次迭代中调用),并symbol保留正在计算指标的当前符号。

这显然允许您从您的全局环境或其他环境中提取外部数据,如果您想要做更高级的指标构建,而不仅仅是mktdata传递给的当前符号的对象中的数据applyIndicators

(一种更简单的方法也是简单地从 OHLC 列名中提取符号名,如果列名包含符号标签,则该列名可能存在于x内部的对象中。)testfun

于 2017-11-12T04:35:50.733 回答