[R-SIG-Finance] Multi Asset portfolio failing at applyStrategy with 'data' must be of a vector type, was 'NULL'

Joshua Ulrich josh.m.ulrich at gmail.com
Wed Aug 10 01:41:16 CEST 2016


Please keep your replies on-list, so others can follow/contribute.

On Mon, Aug 8, 2016 at 9:59 AM, golam sakline <golam.sakline at gmail.com> wrote:
> RT is the function you wrote here...
>
> http://stackoverflow.com/questions/5554220/r-statistics-average-true-range-trailing-stop-indicator
>
> RT <- function(x)
> {
>   x$stopLongATR <- -3.5*ATR(HLC(x),5)[,"atr"]
>   x$stopShortATR <- 3.5*ATR(HLC(x),5)[,"atr"]
>
>
>   x$CR <- Cl(x)
>   x$x.lagCl <- lag(Cl(x))
>
>   for(i in 6:NROW(x)) {
>     trail1 <- coredata(x$CR[i-1])
>
>     if(Cl(x)[i] > trail1 && x$x.lagCl[i] > trail1) {
>       x$CR[i] <- max(trail1,coredata(Cl(x)[i]+x$stopLongATR[i]))
>     } else
>       if(Cl(x)[i] < trail1 && x$x.lagCl[i] < trail1) {
>         x$CR[i] <- min(trail1,coredata(Cl(x)[i]+x$stopShortATR[i]))
>       } else
>         if(Cl(x)[i] > trail1) {
>           x$CR[i] <- coredata(Cl(x)[i]+x$stopLongATR[i])
>         } else {
>           x$CR[i] <- coredata(Cl(x)[i]+x$stopShortATR[i])
>         }
>   }
>   x$CR
> }
>
You still need to provide data, and _all_ the relevant functions.
osFixedDollar is still missing.  I assume the function you used is a
version of the function from Guy Yollin's presentations:

osFixedDollar <- function(timestamp, orderqty, portfolio, symbol, ruletype, ...)
{
  ClosePrice <- as.numeric(Cl(mktdata[timestamp,]))
  orderqty <- round(tradeSize/ClosePrice,-2)
  return(orderqty)
}


Your strategy runs fine for me using SPY data from Yahoo Finance, and
the latest version of quantstrat, blotter, and xts from GitHub. Here's
a version with many extraneous components removed.


require(quantstrat)

symbols <- c("SPY")
Sys.setenv(TZ="UTC")

getSymbols(symbols)

initEq <- 100000
tradeSize <- initEq/length(symbols)
currency("USD")
stock(symbols, currency="USD",multiplier=1)

if(exists('.strategy')) rm.strat(qs.strategy)
if(!exists('.blotter')) .blotter <- new.env()
if(!exists('.strategy')) .strategy <- new.env()

qs.strategy <- "AD26"
initPortf(qs.strategy, symbols)
initAcct(qs.strategy,portfolios=qs.strategy, initEq=initEq)
initOrders(portfolio=qs.strategy)
strategy(qs.strategy,store=TRUE)

add.indicator("AD26", name = "RT",
              arguments = list(x=quote(OHLC(mktdata))),label= "RT")

add.signal(qs.strategy, name="sigCrossover",
arguments=list(columns=c("Close", "RT"), relationship="gte"), label="Buy")

add.signal(qs.strategy, name="sigCrossover",
arguments=list(columns=c("Close", "RT"), relationship="lt"), label="Sell")

add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Buy", sigval=TRUE,
                          prefer ="open",
                          replace = FALSE,
                          orderqty = 10,
                          osFUN = "osFixedDollar",
                          ordertype='market',
                          orderside='long',
                          TxnFees=-5,
                          orderset ="ocolong"
         ),
         type='enter',
         label = 'LE'
)

add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Sell", sigval=TRUE,
                          replace = TRUE,
                          prefer ="open",
                          orderqty="all",
                          ordertype='market',
                          orderside='long',
                          TxnFees=-5,
                          orderset = "ocolong"
         ),
         type='exit',
         label = "LX"
)

add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Buy", sigval=TRUE,
                          replace =FALSE,
                          orderqty="all",
                          ordertype='stoplimit',
                          orderside='long',
                          tmult = TRUE,
                          threshold = quote(stopLossPercent),
                          TxnFees=-5,
                          orderset = "ocolong"
         ),
         type='chain',
         parent = "LE",
         label = "StopLossLong",
         enabled = FALSE
)

applyStrategy(strategy=qs.strategy , portfolios=qs.strategy, verbose=TRUE)

updatePortf(qs.strategy)
updateAcct(qs.strategy)
updateEndEq(qs.strategy)



Here's my sessionInfo() output:
R> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.1 LTS

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] quantstrat_0.9.1739           foreach_1.4.2
[3] blotter_0.10.2                PerformanceAnalytics_1.4.3541
[5] FinancialInstrument_1.2.0     quantmod_0.4-5
[7] TTR_0.23-1                    xts_0.10-0
[9] zoo_1.7-13

loaded via a namespace (and not attached):
[1] codetools_0.2-14 grid_3.3.1       iterators_1.0.7  boot_1.3-18
[5] lattice_0.20-33

>
> On Mon, Aug 8, 2016 at 4:58 PM, Joshua Ulrich <josh.m.ulrich at gmail.com>
> wrote:
>>
>> On Mon, Aug 8, 2016 at 7:48 AM, golam sakline <golam.sakline at gmail.com>
>> wrote:
>> > Hi All,
>> >
>> > I have an error at applyStrategy that is failing with "Error in array(x,
>> > c(length(x), 1L), if (!is.null(names(x))) list(names(x),  : 'data' must
>> > be
>> > of a vector type, was 'NULL'" .
>> > I believe the problem is occurring at add.indicator function "RT" that
>> > takes in OHLC(mktdata) data and outputs an univariate series.
>> > This error doesn't occur when I replace RT with MACD function that takes
>> > in
>> > Cl(mktdata) rather than OHLC.
>> > This error doesn't occur when I am using RT function with a single asset
>> > in
>> > the symbol i.e. the length(symbol) = 1.
>> >
>> > What am I doing wrong or missing here?
>> >
>> It is nearly impossible for anyone to help you because your example
>> uses data (CSVs on your local hard drive) and functions (in
>> functions.R) that no one else has access to.  And you suspect the
>> error is related to one of those functions...
>>
>> > Thanks in advance. Much appreciated.
>> >
>> > G
>> >
>> >
>> > ##########################################################################
>> > rm(list = ls(all = TRUE))
>> > setwd("/Users/mm/Documents/R")
>> > library(lattice)
>> > library(timeSeries)
>> > library(timeDate)
>> > library(PerformanceAnalytics)
>> > library(quantmod)
>> > library(xts)
>> > library(blotter)
>> > library(TTR)
>> > library(quantstrat)
>> > library(FinancialInstrument)
>> > source("functions.R")
>> >
>> > setwd("/Users/mm/Documents/R/UAE")
>> > options("getSymbols.warning4.0" = FALSE)
>> > #sessionInfo()
>> >
>> > startDate = "2015-07-01"
>> > symbols <- c("DFMC", "ARTC", "EMAARMALLS", "DUBAIPARKS")
>> > Sys.setenv(TZ="UTC")
>> >
>> > getSymbols("DFM", src="csv",
>> > col.names=c("Open","High","Low","Close","Volume"))
>> > getSymbols(symbols, src="csv",
>> > col.names=c("Open","High","Low","Close","Volume"))
>> >
>> >
>> > initDate <- "2015-07-01"
>> > initEq <- 100000
>> > tradeSize <- initEq/length(symbols)
>> > currency("USD")
>> > stock(symbols, currency="USD",multiplier=1)
>> >
>> > myTheme<-chart_theme()
>> > myTheme$col$dn.col<- 'lightblue'
>> > myTheme$col$dn.border <-  'lightgray'
>> > myTheme$col$up.border <-  'lightgray'
>> >
>> >
>> > par(mfrow=c(2,2))
>> > for(symbol in symbols)
>> > {
>> >   plot(chart_Series(get(symbol),name=symbol))
>> > }
>> > par(mfrow=c(1,1))
>> >
>> >
>> > if(exists('.strategy')) rm.strat(qs.strategy)
>> > if(!exists('.blotter')) .blotter <- new.env()
>> > if(!exists('.strategy')) .strategy <- new.env()
>> >
>> > qs.strategy <- "AD26"
>> > initPortf(qs.strategy, symbols, initDate=initDate)
>> > initAcct(qs.strategy,portfolios=qs.strategy, initDate=initDate,
>> > initEq=initEq)
>> > initOrders(portfolio=qs.strategy,initDate=initDate)
>> > strategy(qs.strategy,store=TRUE)
>> >
>> > add.indicator("AD26", name = "RT",
>> >               arguments = list(x=quote(OHLC(mktdata))),label= "RT")
>> >
>> > summary(getStrategy(qs.strategy))
>> >
>> >
>> > #########################################################################
>> >
>> > add.signal(qs.strategy, name="sigCrossover",
>> > arguments=list(columns=c("Close", "RT"), relationship="gte"),
>> > label="Buy")
>> >
>> > add.signal(qs.strategy, name="sigCrossover",
>> > arguments=list(columns=c("Close", "RT"), relationship="lt"),
>> > label="Sell")
>> >
>> >
>> > #########################################################################
>> >
>> > summary(getStrategy(qs.strategy))
>> >
>> >
>> > #########################################################################
>> >
>> > add.rule(qs.strategy, name='ruleSignal',
>> >          arguments = list(sigcol="Buy", sigval=TRUE,
>> >                           prefer ="open",
>> >                           replace = FALSE,
>> >                           orderqty = 10,
>> >                           osFUN = "osFixedDollar",
>> >                           ordertype='market',
>> >                           orderside='long',
>> >                           TxnFees=-5,
>> >                           orderset ="ocolong"
>> >          ),
>> >          type='enter',
>> >          label = 'LE'
>> > )
>> >
>> > add.rule(qs.strategy, name='ruleSignal',
>> >          arguments = list(sigcol="Sell", sigval=TRUE,
>> >                           replace = TRUE,
>> >                           prefer ="open",
>> >                           orderqty="all",
>> >                           ordertype='market',
>> >                           orderside='long',
>> >                           TxnFees=-5,
>> >                           orderset = "ocolong"
>> >          ),
>> >          type='exit',
>> >          label = "LX"
>> > )
>> >
>> > add.rule(qs.strategy, name='ruleSignal',
>> >          arguments = list(sigcol="Buy", sigval=TRUE,
>> >                           replace =FALSE,
>> >                           orderqty="all",
>> >                           ordertype='stoplimit',
>> >                           orderside='long',
>> >                           tmult = TRUE,
>> >                           threshold = quote(stopLossPercent),
>> >                           TxnFees=-5,
>> >                           orderset = "ocolong"
>> >          ),
>> >          type='chain',
>> >          parent = "LE",
>> >          label = "StopLossLong",
>> >          enabled = FALSE
>> > )
>> >
>> > summary(getStrategy(qs.strategy))
>> >
>> > #enable.rule(qs.strategy, type="chain", label ="StopLoss")
>> >
>> > applyStrategy(strategy=qs.strategy , portfolios=qs.strategy,
>> > verbose=TRUE)
>> >
>> > updatePortf(qs.strategy)
>> > updateAcct(qs.strategy)
>> > updateEndEq(qs.strategy)
>> >
>> > checkBlotterUpdate("AD26", "AD26")
>> >
>> > ##################################################################
>> >
>> > OUTPUT:
>> >
>> <snip>
>> >> applyStrategy(strategy=qs.strategy , portfolios=qs.strategy,
>> >> verbose=TRUE)
>> > *Error in array(x, c(length(x), 1L), if (!is.null(names(x)))
>> > list(names(x),
>> >  : *
>> > *  'data' must be of a vector type, was 'NULL'*
>> > *In addition: Warning messages:*
>> > *1: In min(j, na.rm = TRUE) :*
>> > *  no non-missing arguments to min; returning Inf*
>> > *2: In max(j, na.rm = TRUE) :*
>> > *  no non-missing arguments to max; returning -Inf*
>> > *Called from: array(x, c(length(x), 1L), if (!is.null(names(x)))
>> > list(names(x), *
>> > *    NULL) else NULL)*
>> > Browse[1]>
>> >> updatePortf(qs.strategy)
>> > [1] "AD26"
>> >> updateAcct(qs.strategy)
>> > [1] "AD26"
>> >> updateEndEq(qs.strategy)
>> > [1] "AD26"
>> >>
>> >> checkBlotterUpdate("AD26", "AD26")
>> > [1] TRUE
>> >>
>> >> sessionInfo()
>> > R version 3.2.4 (2016-03-10)
>> > Platform: x86_64-apple-darwin13.4.0 (64-bit)
>> > Running under: OS X 10.11.6 (El Capitan)
>> >
>> > locale:
>> > [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
>> >
>> > attached base packages:
>> > [1] stats     graphics  grDevices utils     datasets  methods   base
>> >
>> > other attached packages:
>> >  [1] quantstrat_0.9.1739           foreach_1.4.3
>> > blotter_0.9.1741
>> >  [4] FinancialInstrument_1.2.0     quantmod_0.4-5
>> > TTR_0.23-1
>> >
>> >  [7] PerformanceAnalytics_1.4.3541 xts_0.9-7
>> > zoo_1.7-13
>> >
>> > [10] timeSeries_3022.101.2         timeDate_3012.100
>> > lattice_0.20-33
>> >
>> > loaded via a namespace (and not attached):
>> > [1] rsconnect_0.4.2.2 tools_3.2.4       codetools_0.2-14  grid_3.2.4
>> >  iterators_1.0.8
>> >
>> >         [[alternative HTML version deleted]]
>> >
>> > _______________________________________________
>> > R-SIG-Finance at r-project.org mailing list
>> > https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> > -- Subscriber-posting only. If you want to post, subscribe first.
>> > -- Also note that this is not the r-help list where general R questions
>> > should go.
>>
>>
>>
>> --
>> Joshua Ulrich  |  about.me/joshuaulrich
>> FOSS Trading  |  www.fosstrading.com
>> R/Finance 2016 | www.rinfinance.com
>
>



-- 
Joshua Ulrich  |  about.me/joshuaulrich
FOSS Trading  |  www.fosstrading.com
R/Finance 2016 | www.rinfinance.com



More information about the R-SIG-Finance mailing list