У меня есть код, в котором я пытаюсь добавить 2% стоп-лосс к своей торговой стратегии. Проблема, с которой я столкнулся, заключается в том, что стоп-лосс отменяет мой короткий ордер. Так, например, если у меня длинная позиция и сработал мой стоп-лосс, я закрою свою позицию, но не буду go в короткую, даже если сработает мой короткий сигнал. Вот воспроизводимый код.
Это простая торговая стратегия Луксора.
Спасибо.
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")