[R-SIG-Finance] Trailing stop not working in R (Luxor example)

Peter Neumaier peter.neumaier at gmail.com
Sun Mar 6 17:47:45 CET 2016


I am trying to implement a trailing stop in the Luxor example.

I have tried many approaches to debug/find the error, i.e.

   - run with and without stoploss enabled
   - different levels of stoptrailingpercent
   - the list goes on

But my orderbook (ob.df at the of code) simply is not showing any trailing
stops executed.

Anyone got any suggestions why my trailing stop is not working? Here is my
code:


## ----results='hide'------------------------------------------------------
library(quantstrat)

options(width = 240)#options(warn=1)

Sys.setenv(TZ="UTC")
###
initDate = '2003-10-21'
.from='2012-01-01'
.to='2016-03-01'

currency(c('EUR', 'USD'))
exchange_rate('EURUSD', tick_size=0.0001)

# moving average lengths
.fast = 6
.slow = 21
# optimization range
.FastSMA = (1:30)
.SlowSMA = (20:80)
# trade parameters
.threshold = 0.0005
.orderqty = 100000
.txnfees = -6  # round-trip fee
# stop loss amount
.stoploss <- 0.30/100
# trading window
.timespan = 'T00:00/T23:59'
# number of optimization samples
.nsamples=80

## ------------------------------------------------------------------------portfolio.st
= 'forex'account.st = 'IB1'strategy.st = 'luxor'

.trailingStopPercent <- 0.001

rm.strat(portfolio.st)
rm.strat(account.st)
rm.strat(strategy.st)
## ----results='hide'------------------------------------------------------
initPortf(portfolio.st, symbols='EURUSD', initDate=initDate, currency='USD')
addPosLimit(portfolio=portfolio.st,symbol='EURUSD',
timestamp=initDate,maxpos=.orderqty)

    initAcct(account.st,portfolios=portfolio.st,initDate=initDate,currency='USD')
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)

getSymbols("EUR/USD", src="oanda", from=.from, to=.to,
index.class="POSIXct",adjust=T)

EURUSD = to.minutes30(EURUSD)
EURUSD = align.time(EURUSD, 1800)



add.indicator(strategy.st, name = "SMA",
          arguments = list(
            x = quote(Cl(mktdata)[,1]),
            n = .fast
          ),
          label="nFast")

add.indicator(strategy.st, name="SMA",
          arguments = list(
            x = quote(Cl(mktdata)[,1]),
            n = .slow
          ),
          label="nSlow")


add.signal(strategy.st, name='sigCrossover',
       arguments = list(
         columns=c("nFast","nSlow"),
         relationship="gte"
       ),
       label='long')

add.signal(strategy.st, name='sigCrossover',
       arguments = list(
         columns=c("nFast","nSlow"),
         relationship="lt"
       ),
       label='short')


add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='long' , sigval=TRUE,
                    replace=FALSE,
                    orderside='long' ,
                    ordertype='stoplimit',
                    prefer='High',
                    threshold=.threshold,
                    TxnFees=0,
                    orderqty=+.orderqty,
                    osFUN=osMaxPos,
                    orderset='ocolong'
     ),
     type='enter',
     timespan = .timespan,
     label='EnterLONG')


add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='short', sigval=TRUE,
                    replace=FALSE,
                    orderside='short',
                    ordertype='stoplimit',
                    prefer='Low',
                    threshold=.threshold,
                    TxnFees=0,
                    orderqty=-.orderqty,
                    osFUN=osMaxPos,
                    orderset='ocoshort'
     ),
     type='enter',
     timespan = .timespan,
     label='EnterSHORT')


add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='short', sigval=TRUE,
                    replace=TRUE,
                    orderside='long' ,
                    ordertype='market',
                    TxnFees=.txnfees,
                    orderqty='all',
                    orderset='ocolong'
     ),
     type='exit',
     timespan = .timespan,
     label='Exit2SHORT')


add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='long' , sigval=TRUE,
                    replace=TRUE,
                    orderside='short',
                    ordertype='market',
                    TxnFees=.txnfees,
                    orderqty='all',
                    orderset='ocoshort'
     ),
     type='exit',
     timespan = .timespan,
     label='Exit2LONG')


add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='long' , sigval=TRUE,
                    replace=FALSE,
                    orderside='long',
                    ordertype='stoplimit',
                    tmult=TRUE,
                    threshold=quote(.stoploss),
                    TxnFees=.txnfees,
                    orderqty='all',
                    orderset='ocolong'
     ),
     type='chain', parent='EnterLONG',
     label='StopLossLONG',
     enabled=FALSE)

add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='long' , sigval=TRUE,
                    replace=FALSE,
                    orderside='long',
                    ordertype='stoptrailing',
                    tmult=TRUE,
                    threshold=quote(.trailingStopPercent),
                    orderqty='all',
                    orderset='ocolong'
     ),
     type='chain', parent='EnterLong',
     label='StopTrailingLong',
     enabled=FALSE)

add.rule(strategy.st, name = 'ruleSignal',
     arguments=list(sigcol='short' , sigval=TRUE,
                    replace=FALSE,
                    orderside='short',
                    ordertype='stoplimit',
                    tmult=TRUE,
                    threshold=quote(.stoploss),
                    TxnFees=.txnfees,
                    orderqty='all',
                    orderset='ocoshort'
     ),
     type='chain', parent='EnterSHORT',
     label='StopLossSHORT',
     enabled=FALSE)
# add.rule(strategy.st, name = 'ruleSignal',#
arguments=list(sigcol='short' , sigval=TRUE,#
replace=FALSE,#                         orderside='short',#
             ordertype='stoptrailing',#
tmult=TRUE,#
threshold=quote(trailingStopPercent),#
orderqty='all',#                         orderset='ocoshort'#
),#          type='chain', parent='EnterShort',#
label='StopTrailingShort',#          enabled=FALSE# )

enable.rule('luxor', 'chain', 'StopLoss')
enable.rule('luxor', 'chain', 'StopTrailingLong')


out <- applyStrategy(strategy.st, portfolio.st)
updatePortf(portfolio.st, Symbols='EURUSD',
        Dates=paste('::',as.Date(Sys.time()),sep=''))

ob <- getOrderBook(portfolio.st)$forex$EURUSD
ob.df <- data.frame(Date=time(ob),coredata(ob))
View(ob.df)

	[[alternative HTML version deleted]]



More information about the R-SIG-Finance mailing list