我几个月前一直在使用quantstrat修改后退测试。一切正常,直到我添加信号和规则6(donchian channel low) 我的完整代码如下。任何帮助将不胜感激。
提前致谢。
PS:对不起,如果代码看起来很乱,这是我第一次在这里提问。
library(blotter)
library(quantstrat)
library(xts)
library(quantmod)
Sys.setenv(TZ="UTC")
getSymbols('^DJI', from="2016-01-01", to="2016-12-31", index.class="POSIXct", adjust=T)
colnames(DJI)<- c("Open","High","Low","Close","Volume","Adjusted")
currency("AUD")
Sys.setenv(TZ="UTC")
initdate <- '2016-01-03'
startdate <- '2016-01-04'
enddate <- '2016-12-30'
portfolioname <- "Dow Jones"
accountname <- "Dow Jones"
contracts <- 1
txncost <- -0.79
margin <- 15000
strategyname <- accountname
startingcapital <- 1e+6
symbollist <- 'DJI'
instrument<-"DJI"
rm.strat(strategyname)
initPortf(portfolioname,
symbollist,initDate=initdate,currency="AUD")
initAcct(accountname,portfolios=portfolioname,initDate=initdate,initEq=startingcapital,currency="AUD")
initOrders(portfolio=portfolioname,initDate=initdate)
strategy(strategyname,store=TRUE)
strat <- getStrategy(strategyname)
summary(strat)
osInvestAll <- function (data, timestamp, orderqty, ordertype, orderside, equity, portfolio, symbol, ruletype, ..., orderprice)
{
datePos <- format(timestamp,"%Y-%m-%d")
updatePortf(Portfolio=portfolio,Symbol=symbol,Dates=datePos)
updateAcct(portfolio,Dates=datePos)
updateEndEq(portfolio,Dates=datePos)
Posn <- getPosQty(portfolio,Symbol=symbol,Date=datePos)
equity <- getEndEq(portfolio,datePos)
ClosePrice <- getPrice(get(symbol))[datePos]
#UnitSize <- as.numeric(trunc(equity*0.25/ClosePrice))
if (Posn == 0) {
osInvestAll <- UnitSize } else
{osInvestAll <- 0
}
}
Rule1<-function(price,SMA,...)
{ifelse(price>SMA,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=40),label="SMA40")
add.indicator(strategyname, name="Rule1", arguments=list(price = quote(mktdata$Close), SMA=quote(mktdata$SMA.SMA40)), label="Rule1Signal")
Rule2<-function(SMA2,SMA5,...)
{ifelse(SMA5>SMA2,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=2),label="SMA2")
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=5),label="SMA5")
add.indicator(strategyname, name="Rule2", arguments=list(SMA5=quote(mktdata$SMA.SMA5), SMA2=quote(mktdata$SMA.SMA2)), label="Rule2Signal")
#Daily range less than the 10 day average range, buy next day if todays close was higher (+1) or short if it was lower
#HLC <- HLC(DJI)
Rule3<-function(HLC, n)
{
DJI$TR <- ATR(HLC(DJI),10)[,1]
DJI$todays <-DJI$High-DJI$Low
Rule3 <- ifelse(DJI$todays>DJI$TR, ifelse((HLC$Close > lag.xts(HLC$Close)), -1,1), ifelse((HLC$Close > lag.xts(HLC$Close)), 1, -1))
}
add.indicator(strategyname, name="Rule3", arguments=list(HLC=quote(HLC(mktdata)), n=10), label="Rule3Signal")
##Donchian Channel
#High
Rule4 <- function(H,L,Close)
{ifelse(Close>H,1,0)}
add.indicator(strategy=strategyname,name="DonchianChannel",
arguments=list(HL=quote(mktdata$Close),n=50),label="DCH")
add.indicator(strategyname, name="Rule4", arguments=list(H=quote(mktdata$high.DCH),L=quote(mktdata$low.DCH),Close=quote(mktdata$Close)), label="Rule4Signal")
#Low
Rule6 <- function(H,L,Close)
{ifelse(Close<L,-1,0)}
add.indicator(strategy=strategyname,name="DonchianChannel",
arguments=list(HL=quote(mktdata$Close),n=50),label="DCH")
add.indicator(strategyname, name="Rule6", arguments=list(H=quote(mktdata$high.DCH),L=quote(mktdata$low.DCH),Close=quote(mktdata$Close)), label="Rule6Signal")
#Rule 5
Rule5<-function(H15,L15)
{
X<-(H15+L15)/2
ifelse(DJI$Close>X,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$High),n=15),label="H15")
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Low),n=15),label="L15")
add.indicator(strategyname, name="Rule5", arguments=list(Close=quote(mktdata$Close), H15=quote(mktdata$High),L15=quote(mktdata$Low)), label="Rule5Signal")
RuleSum <- function(R1,R2,R3,R4,R5,R6,...)
{
RuleSum <- ( R1 + R2 + R3 + R4 + R5 + R6 )
}
add.indicator(strategyname, name="RuleSum", arguments=list(R1=quote(mktdata$Close.Rule1Signal), R2=quote(mktdata$SMA.SMA5.Rule2Signal),R3=quote(mktdata$todays.Rule3Signal),R4=quote(mktdata$Rule4Signal),R5=quote(mktdata$Close.Rule5Signal),R6=quote(mktdata$Close.Rule6Signal)), label="RuleSum")
#Signals
add.signal(strategyname,name="sigThreshold",
arguments=list(column="Close.Rule1Signal.RuleSum",relationship="gt",threshold=0,cross=FALSE),
label="signal.gt.zero")
add.signal(strategyname,name="sigThreshold",
arguments=list(column="Close.Rule1Signal.RuleSum",relationship="lt",threshold=0,cross=FALSE),
label="signal.lt.zero")
#Rules
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.gt.zero", sigval=TRUE,
replace=FALSE,
prefer='open',
orderside='long',
ordertype='market',
orderqty=1,
orderset='ocolong'
),
type='enter',
label='LE'
)
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.gt.zero", sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='market',
orderqty='all',
orderset='ocolong'
),
type='exit',
label='LX'
)
trailingStopPercent <- .20
add.rule(strategyname, name = 'ruleSignal',
arguments=list(sigcol="signal.gt.zero" , sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='stoptrailing',
tmult=TRUE,
threshold=quote(trailingStopPercent),
orderqty='all',
orderset='ocolong'
),
type='chain', parent="LE",
label='StopTrailingLong',
enabled=TRUE
)
###short rules
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.lt.zero", sigval=TRUE,
replace=FALSE,
prefer='open',
orderside='short',
ordertype='market',
orderqty=-1,
orderset='ocoshort'
),
type='enter',
label='SE'
)
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.lt.zero", sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='short',
ordertype='market',
orderqty='all',
orderset='ocoshort'
),
type='exit',
label='SX'
)
trailingStopPercent <- .20
add.rule(strategyname, name = 'ruleSignal',
arguments=list(sigcol="signal.lt.zero" , sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='stoptrailing',
tmult=TRUE,
threshold=quote(trailingStopPercent),
orderqty='all',
orderset='ocoshort'
),
type='chain', parent="SE",
label='StopTrailingShort',
enabled=TRUE
)
summary(getStrategy(strategyname))
applyStrategy(strategy=strategyname,portfolios=portfolioname,verbose=TRUE,update.equity = TRUE, showEq = TRUE) #verbose=FALSE not to print
updatePortf(strategyname)
updateAcct(strategyname)
updateEndEq(strategyname)
答案 0 :(得分:1)
如果您在收到错误后运行traceback()
,则可以快速确定代码中的问题所在。
您尚未正确指定R4
指针中使用的列名称RuleSum
,R4=quote(mktdata$Close.Rule4Signal)
。
一旦您更正了add.indicator
的{{1}}:
RuleSum
提示:出于调试目的,您可以通过调用
来测试所有指标是否与信号和规则隔离开来add.indicator(strategyname, name="RuleSum", arguments=list(R1=quote(mktdata$Close.Rule1Signal), R2=quote(mktdata$SMA.SMA5.Rule2Signal),R3=quote(mktdata$todays.Rule3Signal),R4=quote(mktdata$Close.Rule4Signal),R5=quote(mktdata$Close.Rule5Signal),R6=quote(mktdata$Close.Rule6Signal)), label="RuleSum")
完成所有res <- applyIndicators(strategyname, DJI)
之后。 (在你添加add.indicator
之前,以及在运行add.signal
之前的方式。如果此代码按预期工作,那么你知道问题可能与信号或规则有关。然后你可以测试信号使用applyStrategy
等工作...