1

我正在尝试在 R 中使用 quantstrat 来回测简单移动平均线、RSI 策略,但出现错误:

Error in if ((orderqty + pos) > PosLimit[, "MaxPos"]) { : 
  argument is of length zero

问题似乎是我的订单数量加上现有头寸大于最大头寸。我如何控制我的仓位限制来消除这个错误?

下面是代码。

library(quantstrat)
library(quantmod)
getSymbols("SPY")

Sys.setenv(TZ = "UTC")
currency("USD")
ticker = "SPY"
stock(ticker, currency  = "USD", multiplier = 1) 
strat.3 = "SMA/RSI.3"
strat=NULL
initPortf(strat.3, ticker)
initOrders(strat.3, ticker)
initAcct(strat.3, strat.3, initEq = 100000000)


addPosLimit(portfolio=strat.3,symbol='SPY',timestamp=startDate,maxpos=1000)
strategy(strat.3, store = T)
 add.indicator(strategy = strat.3, name = "RSI", arguments = list(price = quote(getPrice(mktdata))), label="RSI")


 add.indicator(strategy = strat.3, name = "SMA", arguments = list(x=quote(Cl(mktdata)[,1]), n=200),label= "ma200")

 add.signal(strat.3, "sigCrossover", arguments = list(columns = c("Close", "SMA200"),
                                                    relationship = "gte"),
            label= "Cross.FB")

 add.signal(strat.3, "sigCrossover", arguments = list(columns = c("Close", "SMA200"),
                                                    relationship = "lt"),
            label = "Cross.FA")


add.signal(strategy = strat.3, name="sigThreshold",arguments = list(threshold=70, column="RSI",relationship="gt", cross=TRUE),label="RSI.gt.70")
# The second is when RSI is less than 10
 add.signal(strategy = strat.3, name="sigThreshold",arguments = list(threshold=30, column="RSI",relationship="lt",cross=TRUE),label="RSI.lt.30")


 add.rule(strat.3, "ruleSignal", arguments = list(sigcol = "Cross.FB",
                                                sigval = T, 
                                                ordertype = "market", 
                                                orderqty = 1, 
                                                orderside = "long"),
          type = "enter",
          label = "Enter2Long")

 add.rule(strat.3, "ruleSignal", arguments = list(sigcol = "Cross.FA", 
                                                sigval = T, 
                                                orderqty = 1, 
                                                ordertype = "market",
                                                orderside = "long"),
          type = 'exit', 
          label = "Exit2Close")

  add.rule(strategy = strat.3, name='ruleSignal', arguments = list(sigcol="RSI.lt.30", sigval=TRUE, orderqty= 1, ordertype='market', orderside='long', pricemethod='market', replace=FALSE, osFUN=osMaxPos), type='enter', path.dep=TRUE)
 add.rule(strategy = strat.3, name='ruleSignal', arguments = list(sigcol="RSI.gt.70", sigval=TRUE, orderqty=1, ordertype='market', orderside='long', pricemethod='market', replace=FALSE), type='exit', path.dep=TRUE)


 out = applyStrategy(strat.3, strat.3)

您的帮助将不胜感激,因为这对我来说是一个非常重要的项目。谢谢

4

0 回答 0