[R-SIG-Finance] quanstrat: stop trailing with variable stops size
Brian Moretta
bmresearch at mac.com
Thu Sep 27 18:31:32 CEST 2012
Jan
That seems to working now. Thanks for your help.
Brian
PS saw on one of the forums you may be interested in an example of Donchian breakouts for the package. Have coded one so if you are still interested let me know & I'll tidy it up & forward it.
On 27 Sep 2012, at 00:16, OpenTrades wrote:
> Hi Brian,
>
> We have now implemented support for using an indicator column in the mktdata object as threshold values. So in your source code, I suggest that you use:
>> add.indicator(strat.st, name = "stopATR", arguments = list(HLC=quote(HLC(mktdata)), n=14, maType="SMA", noATR=2) )
> to add your ATR values, and then refer to these in the rule:
>> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold='stopATR.ind.atr', tmult=FALSE, orderset='exit2'), type='risk',label='trailingexit')
>
> Please note that you cannot pass a column of threshold values as a vector. You can also not pass the name of a function: use the indicator method instead (see above).
>
> Hope this helps,
>
> Jan Humme.
>
>
>
> On 25-09-12 16:10, Brian Moretta wrote:
>> Thanks for the suggestion. Now I'm getting interesting differences.
>>
>> If I redefine my stopATR function (below) and use quote(mktdata$stopATR) as you suggest then I get an error message:
>> Error in if (order.side == "long" && as.numeric(Lo(mktdataTimestamp)) < :
>> missing value where TRUE/FALSE needed
>> This followed by two identical warnings : In max(i) : no non-missing arguments to max; returning -Inf
>> This is the same error as if I used quote(mktdata$stopATR.ind.atr) with my original function.
>> stopATR <- function(HLC, n=14, maType, noATR=2){
>> stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)$atr
>> colnames(stop.atr) <- c("stopATR")
>> stop.atr
>> }
>>
>> If I'm lazy & use my original stopATR function then using quote(mktdata$atr) in the add.rule runs without any error messages. However the trailing stop doesn't seem to affect anything. Even using an ATR multiple of .1 (not realistic but gives a threshold of 2-3 points on the GSPC data) gives exactly the same transactions as with the add.rule for the stop commented out. Have checked the data and some should be affected but such a tight stop.
>> add.indicator(strat.st, name = "stopATR", arguments = list(HLC=quote(HLC(mktdata)), n=14, maType="SMA", noATR=.1) )
>> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=quote(mktdata$atr), tmult=FALSE, orderset='exit2'), type='risk',label='trailingexit')
>>
>> I've also tried the following definition for stopATR with quote(mktdata$atr) as in the second case and I get the same error as in the first example.
>> stopATR <- function(HLC, n=14, maType, noATR=2){
>> stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)$atr
>> }
>>
>> Not sure if I'm missing something obvious or if there is something else going on.
>>
>> Thanks
>>
>> Brian
>>
>> On 22 Sep 2012, at 03:00, Brian G. Peterson wrote:
>>
>>> 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
>>>
>>> _______________________________________________
>>> 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.
>>
>> [[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.
>>
>
>
> --
> Jan Humme - OpenTrades
>
> WWW: http://www.opentrades.nl
> Email: jan at opentrades.nl
> Twitter: @opentrades
>
> _______________________________________________
> 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.
More information about the R-SIG-Finance
mailing list