Ордер стоп-лосс отменяет мой короткий сигнал - Quantstrat - PullRequest
0 голосов
/ 26 мая 2020

У меня есть код, в котором я пытаюсь добавить 2% стоп-лосс к своей торговой стратегии. Проблема, с которой я столкнулся, заключается в том, что стоп-лосс отменяет мой короткий ордер. Так, например, если у меня длинная позиция и сработал мой стоп-лосс, я закрою свою позицию, но не буду go в короткую, даже если сработает мой короткий сигнал. Вот воспроизводимый код.

Это простая торговая стратегия Луксора.

Спасибо.

enter image description here

library(quantmod)
library(quantstrat)
getSymbols("CADUSD=X", from = "2007-01-03", to = "2015-01-01")
CADUSD = na.omit(`CADUSD=X`)

Sys.setenv(TZ="UTC")

.stoploss <- .02

Sys.setenv(TZ="UTC")
rm.strat(strategy.st)
startDate = "2007-01-05"
strategy.st = "luxor"
currency('USD')
stock("CADUSD",currency='USD',multiplier=1)

initPortf(strategy.st, symbols = 'CADUSD', currency = 'USD')
initAcct(strategy.st, portfolios = strategy.st, currency = "USD")
initOrders(strategy.st)
strategy(strategy.st, store = T)

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

add.indicator(strategy.st, name="SMA",
              arguments = list(
                x = quote(Cl(mktdata)[,1]),
                n = 49
              ),
              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,
                        orderside='short',
                        ordertype='market',
                        orderqty='all',
                        TxnFees=-1,
                        replace=TRUE,
                        orderset = "ocoshort"
         ),
         type='exit',
         label='Exit2LONG'
)

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

add.rule(strategy.st, name='ruleSignal',
         arguments=list(sigcol='long' , sigval=TRUE,
                        orderside='long' ,
                        ordertype='stoplimit', 
                        prefer='High', 
                        TxnFees = -1,
                        orderqty=+100000,
                        replace=FALSE,
                        orderset = "ocolong"
         ),
         type='enter',
         label='EnterLONG'
)

add.rule(strategy.st, name='ruleSignal',
         arguments=list(sigcol='short', sigval=TRUE,
                        orderside='short',
                        ordertype='stoplimit', prefer='Low', 
                        orderqty=-100000,
                        replace=FALSE,
                        orderset = "ocolong"
         ),
         type='enter',
         label='EnterSHORT'
)

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

## [1] "Strat.Luxor.Stop.Loss"

add.rule(strategy.st, 
         name = "ruleSignal",
         arguments = list(sigcol = "short", 
                          sigval = TRUE,
                          replace = FALSE,
                          orderside = "short",
                          ordertype = "stoplimit",
                          tmult = TRUE,
                          threshold = quote(.stoploss),
                          TxnFees = -1,
                          orderqty = "all",
                          orderset = "ocoshort"
                          ),
         type = "chain", 
         parent = "EnterSHORT",
         label = "StopLossSHORT",
         enabled = T)


applyStrategy(strategy.st,strategy.st)
updatePortf(strategy.st, Symbols='CADUSD')
chart.Posn(strategy.st, "CADUSD")
add_SMA(n=20 , on=1,col='blue')
add_SMA(n=49, on=1, col = "red")
...