首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quantstrat不适用于ADX

Quantstrat不适用于ADX
EN

Stack Overflow用户
提问于 2017-06-25 01:45:17
回答 1查看 221关注 0票数 0

我正在运行一个基于R quantstrat的脚本,取自R的回溯测试策略)。它起作用了。直到我加入ADX作为指示器和信号。如果是这样,那么我将得到以下错误:

代码语言:javascript
复制
Error in `colnames<-`(`*tmp*`, value = "ADXsig") : 
length of 'dimnames' [2] not equal to array extent

讨论这里是量化商在r.789695.n4.nabble.com这里的假定解决方案是将ADX add.indicator代码从x=quote(Cl(mktdata))更改为quote(Cl(mktdata)[,1])。它不起作用,可能是因为ADX使用的是HLC而不是ClHLC引用的是三列而不是一列。需要明确的是:将HLC=quote(HLC(mktdata))更改为quote(HLC(mktdata)[,1])不起作用。

下面是完整的工作代码,下面是ADX代码:

代码语言:javascript
复制
# INSTALL PACKAGES
# install.packages("devtools")
# require(devtools)
# install_github("braverock/FinancialInstrument")
# install_github("joshuaulrich/xts") 
# install_github("braverock/blotter")
# install.packages("quantstrat", repos="http://R-Forge.R-project.org")
# install_github("braverock/PerformanceAnalytics")

# LIBRARIES
library(quantstrat)   

# INITIAL SETUP
Sys.setenv(TZ = "EST")
currency('USD') 
start_date <- "2015-01-01"
end_date <- "2016-12-31"
init_equity <- 1e4 # $10,000
adjustment <- FALSE

# GET DATA
basic_symbols <- function() {symbols <- c("SPY")}
symbols <- basic_symbols()
getSymbols(Symbols = symbols, src = "google", index.class = "POSIXct", 
           from = start_date, to = end_date, adjust = adjustment)
stock(symbols,currency = "USD", multiplier = 1)

# DEFINE STRATEGY/PORTFOLIO/ACCOUNT NAMES
portfolio.st <- "Port.Luxor"
account.st <- "Acct.Luxor"
strategy.st <- "Strat.Luxor"

# REMOVE PRIOR STRATEGY/PORTFOLIO, INITIALIZE PORTFOLIO/ACCOUNT/STRATEGY, STORE STRATEGY
rm.strat(portfolio.st)
rm.strat(account.st)
initPortf(name = portfolio.st, symbols = symbols)
initAcct(account.st, portfolios = portfolio.st, initEq = init_equity)
initOrders(portfolio.st)
strategy(strategy.st, store = TRUE)

# INDICATORS & SIGNALS

add.indicator(strategy = strategy.st,
              name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), 
                               n = 10),
              label = "nFast")

add.indicator(strategy = strategy.st, 
              name = "SMA", 
              arguments = list(x = quote(Cl(mktdata)), 
                               n = 30), 
              label = "nSlow")

add.signal(strategy = strategy.st,
           name="sigCrossover",
           arguments = list(columns = c("nFast", "nSlow"),
                            relationship = "gte"),
           label = "long")

add.signal(strategy = strategy.st,
           name="sigCrossover",
           arguments = list(columns = c("nFast", "nSlow"),
                            relationship = "lt"),
           label = "short")

# TRADING RULES
add.rule(strategy = strategy.st,
         name = "ruleSignal",
         arguments = list(sigcol = "long",
                          sigval = TRUE,
                          orderqty = 100,
                          ordertype = "stoplimit",
                          orderside = "long", 
                          threshold = 0.0005,
                          prefer = "High", 
                          TxnFees = -10, 
                          replace = FALSE),
         type = "enter",
         label = "EnterLONG")

add.rule(strategy.st, 
         name = "ruleSignal", 
         arguments = list(sigcol = "long", 
                          sigval = TRUE, 
                          orderside = "short", 
                          ordertype = "market", 
                          orderqty = "all", 
                          TxnFees = -10, 
                          replace = TRUE), 
         type = "exit", 
         label = "Exit2LONG")

# APPLY STRATEGY 
applyStrategy(strategy.st, portfolios = portfolio.st)

当添加以下代码(用于、ADX、指示器和信号)时,会产生错误。即使没有被策略引用-它在mktdata xts对象中的存在就是产生错误的原因。add.indicator的存在本身并不会导致错误,而是add.signal的存在。认为错误可能是add.signal引用column = "ADX"引起的,但不知道要引用哪个ADX,因为add.indicator创建了三个ADX列。

代码语言:javascript
复制
add.indicator(strategy.st, name="ADX", 
              arguments=list(HLC=quote(HLC(mktdata)), n=14), 
              label="ADX")

add.signal(strategy.st, name = "sigThreshold",
           arguments = list(column = "ADX",
                            threshold = 30,
                            relationship = "gt",      
                            cross = TRUE),            
           label = "ADXsig")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-25 04:37:21

找到解决方案:将column = "ADX"更改为column = "ADX.ADX"。详情如下:

代码语言:javascript
复制
add.indicator(strategy.st, name="ADX", 
          arguments=list(HLC=quote(HLC(mktdata)), n=14), 
          label="ADX")

add.signal(strategy.st, name = "sigThreshold",
       arguments = list(column = "ADX.ADX",
                        threshold = 30,
                        relationship = "gt",      
                        cross = TRUE),            
       label = "ADXsig")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44742466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档