[R-SIG-Finance] quanstrat: stop trailing with variable stops size

Brian G. Peterson brian at braverock.com
Sat Sep 22 04:00:01 CEST 2012


why not label your stopATR indicator ouput and set the threshold to that?

quote(mktdata$stopATR)

?


On 09/21/2012 02:07 PM, Brian Moretta wrote:
> Hi
>
> I've been trying to modify the MACD example with trailing stop so that it uses a 2ATR stop rather than a fixed value or proportion. Key seems to be the threshold value. Help says
>
> If threshold is not numeric or NULL it should be the character string describing a function that can calculate a threshold. Ideally this will be a column lookup on a non-path-dependent indicator calculated in advance.
>
> I keep getting errors with the threshold set to something that uses a vector whether text or not. The add.rule line is (full code at end)
> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=stopvalue, tmult=FALSE, orderset='exit2'), type='risk',label='trailing exit')
>
> With stopvalue set to -20 it works fine. Tried stop.atr$atr, as a vector, inside quotes (help says character string) and inside quote() but to no avail. Tried similar for indicator mktdata$stopATR.ind.atr. Going through previous questions in this area I'm not sure if I'm just doing it wrong or pushing the limits of quanstrat's development, but any suggestions are welcome.
>
> Thanks
>
> Brian
>
> require(quantstrat)
> suppressWarnings(rm("order_book.macd",pos=.strategy))
> suppressWarnings(rm("account.macd","portfolio.macd",pos=.blotter))
> suppressWarnings(rm("account.st","portfolio.st","stock.str","stratMACD","initDate","initEq",'start_t','end_t'))
>
> #stock.str='AAPL' # what are we trying it on
> stock.str='GSPC'
> getSymbols("^GSPC", src='yahoo', index.class=c("POSIXt","POSIXct"), from='2007-01-01')
>
> stopATR <- function(HLC, n=14, maType, noATR=2){
> 	stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)
> }
> stop.atr <- -2 * ATR(HLC(get(stock.str)), n=14, maType='SMA')
> stopvalue <- -20
>
> #MA parameters for MACD
> fastMA = 12
> slowMA = 26
> signalMA = 9
> maType="EMA"
>
> currency('USD')
> stock(stock.str,currency='USD',multiplier=1)
>
> initDate='2006-12-31'
> initEq=1000000
> portfolio.st='macd'
> account.st='macd'
>
> initPortf(portfolio.st,symbols=stock.str, initDate=initDate)
> initAcct(account.st,portfolios=portfolio.st, initDate=initDate)
> initOrders(portfolio=portfolio.st,initDate=initDate)
>
> strat.st<-portfolio.st
> # define the strategy
> strategy(strat.st, store=TRUE)
>
> #one indicator
> add.indicator(strat.st, name = "MACD", arguments = list(x=quote(Cl(mktdata))) )
> add.indicator(strat.st, name = "stopATR", arguments = list(HLC=quote(HLC(mktdata)), n=14, maType="SMA", noATR=2) )
>
> #two signals
> add.signal(strat.st,name="sigThreshold",arguments = list(column="signal",relationship="gt",threshold=0,cross=TRUE),label="signal.gt.zero")
> add.signal(strat.st,name="sigThreshold",arguments = list(column="signal",relationship="lt",threshold=0,cross=TRUE),label="signal.lt.zero")
>
> ####
> # add rules
>
> # entry
> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty=100, ordertype='market', orderside='long', threshold=NULL),type='enter',label='enter',storefun=FALSE)
>
> #alternatives for risk stops:
> # alternately, use a trailing order, with 2ATR stop
> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=stop.atr$atr, tmult=FALSE, orderset='exit2'), type='risk',label='trailingexit')
>
> # exit
> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.lt.zero",sigval=TRUE, orderqty='all', ordertype='market', orderside='long', threshold=NULL,orderset='exit2'),type='exit',label='exit')
>
> #end rules
> ####
>
> start_t<-Sys.time()
> out<-try(applyStrategy(strat.st , portfolios=portfolio.st,parameters=list(nFast=fastMA, nSlow=slowMA, nSig=signalMA,maType=maType)))
> end_t<-Sys.time()
> print(end_t-start_t)
>
> start_t<-Sys.time()
> updatePortf(Portfolio=portfolio.st,Dates=paste('::',as.Date(Sys.time()),sep=''))
> end_t<-Sys.time()
> print("trade blotter portfolio update:")
> print(end_t-start_t)
>
> chart.Posn(Portfolio=portfolio.st,Symbol=stock.str)
> plot(add_MACD(fast=fastMA, slow=slowMA, signal=signalMA,maType="EMA"))
>
> 	[[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.
>


-- 
Brian G. Peterson
http://braverock.com/brian/
Ph: 773-459-4973
IM: bgpbraverock



More information about the R-SIG-Finance mailing list