[R] Error custom indicator Quantstrat colnames

Pietro Fabbro f@bbropietro @ending from y@hoo@it
Sat Jul 14 15:04:07 CEST 2018


I will try to be as clear as possible as I have been rebuked by some users. I deleted the last questions and I will try to be sufficiently explicative in this one. I apologize if the data I will insert will not be enough.

So, I am trying to run a strategy through the package Quantstrat.

install.packages("quantstrat")
My problem is that I get the following error

Error incolnames<-(tmp, value = seq(ncol(tmp_val))) : 
attempt to set 'colnames' on an object with less than two dimensions

when I try to run the following command:

> out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st)
I do not have this problem if I use, as indicator, one or more indicators, which are already defined by the package TTR.

I have this error only when I try to use a custom indicator. Here is the code for the custom indicator that I use:

wma <-  WMA(Cl(mktdata), 4, wts=c(1:4)) 
wmamaxt <- rollmaxr(wma, 30, fill = NA)
wmamint <- - rollmaxr(- wma, 30, fill = NA)
CNOwma <- function (mktdata=quote(mktdata),x) {(wma - wmamint) / (wmamaxt - wmamint)}
Please refer to the following code:

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

wma <-  WMA(Cl(mktdata), 4, wts=c(1:4)) 
wmamaxt <- rollmaxr(wma, 30, fill = NA)
wmamint <- - rollmaxr(- wma, 30, fill = NA)
CNOwma <- function (mktdata=quote(mktdata),x) {(wma - wmamint) / (wmamaxt - wmamint)}
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", "IXIC") #symbols used in our backtest
getSymbols(Symbols = symbols, src = "google", from=from, to=to, adjust = TRUE) #receive data from google finance,  adjusted for splits/dividends

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

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"),
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"),
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)
When I run the traceback() of the error, this is what I get:

> traceback()
4: stop("attempt to set 'colnames' on an object with less than two dimensions")
3: `colnames<-`(`*tmp*`, value = seq(ncol(tmp_val)))
2: applyIndicators(strategy = strategy, mktdata = mktdata, parameters = parameters, 
...)
1: applyStrategy(strategy = strategy.st, portfolios = portfolio.st)



More information about the R-help mailing list