2

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 in `colnames<-`(`*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(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)}

Please refer to the following code:

    if (!require("TTR")) {
  install.packages("TTR")
  library(TTR)
}
if (!require("quantstrat")) {
  if(!require("devtools")) {
    install.packages("devtools")
    require(devtools)
  }
  install_github("braverock/blotter") # dependency
  install_github("braverock/quantstrat")
}

if (!require("IKTrading")){
  install_github("IlyaKipnis/IKTrading", force=TRUE)
}

library(devtools)
library(quantmod)
library(quantstrat)
library(TTR)
library(png)
library(IKTrading)
install_github("braverock/blotter")
install_github("braverock/quantstrat")
install_github('IlyaKipnis/IKTrading')


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 = "yahoo", 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



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"),
             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)
Pietro
  • 347
  • 1
  • 3
  • 15

1 Answers1

1

it's quite hard to tell what's going on because your example is not reproducible. First of all, three of your packages are not CRAN packages so we are left to guess where you got them. My guess would be the following:

install_github("braverock/blotter")
install_github("braverock/quantstrat")
install_github('IlyaKipnis/IKTrading')

Then if we guess that correctly, on the very first line of your example (After the loading of packages) you use an object from the ether:

wma <-  WMA(Cl(mktdata), 4, wts=c(1:4)) 

so where did mktdata come from?

You'll get better help if you create examples that can be run by someone trying to help you.

JD Long
  • 59,675
  • 58
  • 202
  • 294
  • Thank you for your answer. I apologize for the mistake. I corrected the question. I hope that the code is reproducible now. Your guess about where I found the three packages is correct. – Pietro Jul 14 '18 at 13:40