[R-SIG-Finance] Trailing Stop Loss Execution at Custom Levels

Brian G. Peterson brian at braverock.com
Tue May 24 19:03:02 CEST 2016


Add a custom price column either before calling applyStrategy or
preferably using an indicator and set a prefer= argument for which price
to use as the reference price for your stop order. 


On Tue, 2016-05-24 at 19:39 +0300, Atakan Okan wrote:
> Hi r-sig-finance,
> 
> I want Trailing stops to execute at levels different than the default level, which I assume is the High-TrailingStopDistance. How can I implement trailing stops that get executed at levels different than this? For example: ((High-TrailingStopDistance)+Low)/2 or at the Low of the bar (maybe for stress testing). Below is a reproducible example with prefer=".." arguments commented out. I tried using the prefer argument with different levels such as "High","Low","Open" in add.rule() with ordertype argument passed as "stoptrailing". 
> 
> Any help is appreciated, thanks.
> 
> Atakan Okan
> 
> Code:
> 
> library(quantstrat) 
> Sys.setenv(TZ="UTC")                                                                                 
> .strategy<- new.env();.blotter<- new.env()                                                                                                                             
> 
> currency('USD')                                                                                                                                                                      
> stock("AAPL", currency="USD", multiplier=1,tick_size= 0.01)
> 
> getSymbols('AAPL',src = 'yahoo', from="2014-01-01", to="2015-05-31")
> AAPL <- adjustOHLC(AAPL)
> 
> strategy.st <- paste("AAPL","SMA_D1",sep = "_")
> rm.strat(strategy.st) 
> initialEquity = 100000                                                                               
> initDate = "2013-12-30" 
> initPortf(strategy.st, "AAPL", initDate=initDate, currency = "USD")
> initAcct(strategy.st, portfolios=strategy.st, initDate=initDate, initEq=initialEquity, currency = "USD")
> initOrders(portfolio=strategy.st,initDate=initDate) 
> strategy(strategy.st,store=TRUE)
> 
> txn.model <- 0    
> positionSizeLong  =  1000     
> positionSizeShort =  -1000
> 
> longStopLossDistance <- 0.025   
> shortStopLossDistance <- 0.025  
> longTrailingStopDistance <- 0.01
> shortTrailingStopDistance <- 0.01
> 
> add.indicator(strategy.st,                                               
>               name = "SMA",                                               
>               arguments = list(x=Cl(eval(parse(text = "AAPL")))
>                                ,n=5                                 
>               ),                                                            
>               label='fastsma')                                           
> 
> add.indicator(strategy.st,                                                 
>               name = "SMA",                                                
>               arguments = list(x=Cl(eval(parse(text = "AAPL")))
>                                ,n=50                                
>               ),                                                           
>               label='slowsma')                                             
> 
> add.signal(strategy.st,
>            name="sigCrossover",
>            arguments = list(columns=c("fastsma","slowsma"),relationship="gt"),
>            label="fastsma.gt.slowsma")                                                        
> 
> add.signal(strategy.st,
>            name="sigCrossover",
>            arguments = list(columns=c("fastsma","slowsma"),relationship="lt"),
>            label="fastsma.lt.slowsma")
> 
> # Long Entry Rule-------------------------------------------------------------------
> add.rule(strategy.st,
>          name='ruleSignal',
>          arguments = list(sigcol="fastsma.gt.slowsma",
>                           sigval=TRUE,
>                           prefer="Open", 
>                           orderqty= positionSizeLong, 
>                           #osFUN="osAllInLong",  
>                           ordertype='market',
>                           orderside='long',
>                           orderset='ocolong',
>                           TxnFees = txn.model),
>          type='enter',
>          label='longenter',
>          enabled=TRUE
> )
> 
> # Long Exit Rule-------------------------------------------------------------------
> add.rule(strategy.st,
>          name='ruleSignal',
>          arguments = list(sigcol="fastsma.lt.slowsma",
>                           sigval=TRUE,
>                           prefer="Open", 
>                           orderqty='all',
>                           ordertype='market',
>                           orderside='long',
>                           orderset='ocolong',
>                           TxnFees = txn.model),
>          type='exit',
>          label='longexit',
>          enabled=TRUE
> )
> 
> # Long StopLoss Rule---------------------------------------------------------------------------
> add.rule(strategy.st,name='ruleSignal',
>          arguments = list( sigcol="fastsma.lt.slowsma", sigval=TRUE,
>                            replace=FALSE,
>                            orderside='long',
>                            ordertype='stoplimit',
>                            tmult=TRUE,
>                            threshold=quote( longStopLossDistance ),
>                            orderqty='all',
>                            orderset='ocolong',
>                            TxnFees = txn.model),
>          type='chain', parent="longenter",
>          label='StopLossLong',
>          enabled=TRUE)
> 
> # Long Trailing Stop Rule--------------------------------------------------------
> add.rule(strategy.st, name = 'ruleSignal',
>          arguments=list(sigcol="fastsma.lt.slowsma" , sigval=TRUE,
>                         replace=FALSE,
>                         orderside='long',
>                         #prefer="High",
>                         ordertype='stoptrailing',
>                         tmult=TRUE,
>                         threshold=quote(longTrailingStopDistance),
>                         orderqty='all',
>                         orderset='ocolong',
>                         TxnFees = txn.model),
>          type='chain', parent="longenter",
>          label='StopTrailingLong',
>          enabled=TRUE
> )
> 
> 
> # Short Entry Rule--------------------------------------------------------------------
> add.rule(strategy.st,
>          name='ruleSignal',
>          arguments = list(sigcol="fastsma.lt.slowsma",
>                           sigval=TRUE,
>                           prefer="Open", 
>                           orderqty=positionSizeShort, 
>                           #osFUN="osAllInShort",  
>                           ordertype='market',
>                           orderside='short',
>                           orderset='ocoshort',
>                           TxnFees = txn.model),
>          type='enter',
>          label='shortenter',
>          enabled=TRUE
> )
> 
> # Short Exit Rule---------------------------------------------------------------------
> add.rule(strategy.st,
>          name='ruleSignal',
>          arguments = list(sigcol="fastsma.gt.slowsma",
>                           sigval=TRUE,
>                           prefer="Open", 
>                           orderqty='all',
>                           ordertype='market',
>                           orderside='short',
>                           orderset='ocoshort',
>                           TxnFees = txn.model),
>          type='exit',
>          label='shortexit',
>          enabled=TRUE
> )
> 
> # Short Stop Loss Rule-----------------------------------------------------------------
> add.rule(strategy.st,name='ruleSignal',
>          arguments = list( sigcol="fastsma.gt.slowsma", sigval=TRUE,
>                            replace=FALSE,
>                            orderside='short',
>                            ordertype='stoplimit',
>                            tmult=TRUE,
>                            threshold=quote( shortStopLossDistance ),
>                            orderqty='all',
>                            orderset='ocoshort',
>                            TxnFees = txn.model),
>          type='chain', parent="shortenter",
>          label='StopLossShort',
>          enabled=TRUE)
> 
> # Short Trailing Stop Loss Rule-------------------------------------------------------
> add.rule(strategy.st, name = 'ruleSignal',
>          arguments=list(sigcol="fastsma.gt.slowsma" , sigval=TRUE,
>                         replace=FALSE,
>                         orderside='short',
>                         #prefer="Open",
>                         ordertype='stoptrailing',
>                         tmult=TRUE,
>                         threshold=quote( shortTrailingStopDistance),
>                         orderqty='all',
>                         orderset='ocoshort',
>                         TxnFees = txn.model),
>          type='chain', parent="shortenter",
>          label='StopTrailingShort',
>          enabled=TRUE
> )
> 
> 
> 
> summary(getStrategy(strategy.st))                                              
> 
> applyStrategy( strategy=strategy.st , portfolios=strategy.st
>                #,parameters=list(n = 5)
>                ,verbose=TRUE)
> updatePortf(strategy.st)
> updateAcct(strategy.st)
> updateEndEq(strategy.st)
> 
> results.df.2 <- data.frame(tradeStats(strategy.st))
> 
> chart.Posn(strategy.st, Symbol = "AAPL"
>            , Dates = '2014-04-01::2014-06-25'
> )              
> 
>  		 	   		  
> _______________________________________________
> 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