rquantstrat

No transactions/positions to Chart Quantstrat, "logical" error?


I get the error message that the are no transactions/positions to chart despite the use of signals and rules. Can someone explain me what I am doing wrong? Is it maybe in the logical development of rules? I want my rules to do what follows: Enter long AND exit short if CNOwma crosses above 0.6. Enter short AND exit long if CNOwma crosses below 0.6. Please refer to the following code. The error is in the last line.

Thank you.

library(devtools)
library(quantmod)
library(quantstrat)
library(TTR)
library(IKTrading)

rm(list = ls(.blotter), envir = .blotter)
initdate <- "2010-01-01"
from <- "2012-01-01" #start of backtest
to <- "2017-31-12" #end of backtest

Sys.setenv(TZ= "EST") #Set up environment for timestamps

currency("USD") #Set up environment for currency to be used

symbols <- c("RUT") #symbols used in our backtest
getSymbols("^RUT",src="yahoo", from="2012-01-01", to="2017-12-31", periodicity="daily")

stock(symbols, currency = "USD", multiplier = 1) #tells quanstrat what instruments present and what currency to use

n <- 30

wma <-  WMA(Cl(RUT), n=4, wts=c(1:4))
wmamaxt <-  rollmaxr(wma, n, fill = NA)
wmamint <- - rollmaxr(- wma, n, fill = NA)
CNOwma <- function (RUT) {(wma - wmamint) / (wmamaxt - wmamint)}

tradesize <-10000 #default trade size
initeq <- 100000 #default initial equity in our portfolio

strategy.st <- portfolio.st <- account.st <- "firststrat" #naming strategy, portfolio and account

#removes old portfolio and strategy from environment
rm.strat(portfolio.st)
rm.strat(strategy.st) 

#initialize portfolio, account, orders and strategy objects
initPortf(portfolio.st, symbols = symbols, initDate = initdate, currency = "USD")

initAcct(account.st, portfolios = portfolio.st, initDate = initdate, currency = "USD", initEq = initeq)

initOrders(portfolio.st, initDate = initdate)
strategy(strategy.st, store=TRUE)

add.indicator(strategy = strategy.st,
name = 'CNOwma',
arguments = list(x = quote(Cl(mktdata)), n=4),
label = 'CNOwma4')
add.signal(strategy.st, name = "sigThreshold",
arguments = list(column = "CNOwma4", threshold = 0.6,
relationship = "gt", cross = TRUE),
label = "longthreshold")


add.signal(strategy.st, name = "sigThreshold",
arguments = list(column = "CNOwma4", threshold = 0.6,
relationship = "lt", cross = TRUE),
label = "shortthreshold")




add.rule(strategy.st, name = "ruleSignal",
arguments = list(sigcol = "longthreshold", sigval = TRUE,
orderqty = "all", ordertype = "market",
orderside = "long", replace = FALSE,
prefer = "Open"), osFUN = IKTrading::osMaxDollar,
tradeSize = tradesize, maxSize = tradesize, type = "enter")


add.rule(strategy.st, name = "ruleSignal",
arguments = list(sigcol = "shortthreshold", sigval = TRUE,
orderqty = "all", ordertype = "market",
orderside = "long", replace = FALSE,
prefer = "Open"),
type = "exit")

add.rule(strategy.st, name = "ruleSignal",
arguments = list(sigcol = "shortthreshold", sigval = TRUE,
orderqty = "all", ordertype = "market",
orderside = "short", replace = FALSE,
prefer = "Open"),osFUN = IKTrading::osMaxDollar, 
tradeSize = tradesize, maxSize = tradesize, type = "enter")

add.rule(strategy.st, name = "ruleSignal",
arguments = list(sigcol = "longthreshold", sigval = TRUE,
orderqty = "all", ordertype = "market",
orderside = "short", replace = FALSE,
prefer = "Open"),
type = "exit")



out <- applyStrategy(strategy = strategy.st, portfolios = portfolio.st)
updatePortf(portfolio.st)
daterange <- time(getPortfolio(portfolio.st)$summary)[-1]

updateAcct(account.st, daterange)
updateEndEq(account.st)


for(symbol in symbols){

chart.Posn(Portfolio = portfolio.st, Symbol = symbol, 
TA= c("add_SMA(n=50, col='blue')", "add_SMA(n=200, col='red')"))
}

Error in chart.Posn(Portfolio = portfolio.st, Symbol = symbol, TA = c("add_SMA(n=50, col='blue')",  : 
  no transactions/positions to chart

Solution

  • I solved the issue.

    A lot of errors arising with backtesting in Quantstrat are due to misspecification of column names.

    The problem was solved by changing the code to:

    add.signal(strategy.st, name = "sigThreshold",
    arguments = list(column = "X1.CNOwma4", threshold = 0.6,
    relationship = "gt", cross = TRUE),
    label = "longthreshold")
    
    add.signal(strategy.st, name = "sigThreshold",
    arguments = list(column = "X1.CNOwma4", threshold = 0.6,
    relationship = "lt", cross = TRUE),
    label = "shortthreshold")
    

    That is, column = "CNOwma4" was substituted by column = "X1.CNOwma4"