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:
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
c(length(x), 1L), if (!is.null(names(x))) list(names(x), : 'data'
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
in
Cl(mktdata) rather than OHLC.
This error doesn't occur when I am using RT function with a single
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:
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]>
checkBlotterUpdate("AD26", "AD26")
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]]