Когда у меня есть стратегия, которая идет как длинная, так и короткая, и я установил функцию addPosLimit()
, чтобы иметь maxpos=1 and minpos=-1
. Он по-прежнему занимает больше одного длинной и одной короткой позиции. Но если я сделаю стратегию только длинной или короткой, она работает так, как ожидалось.Функция quantstrat addPosLimit() не ограничивает мои позиции при переходе как длинной, так и короткой по той же стратегии.
Я создал базовую стратегию для этого примера. Он имеет 3 скользящих средних, один долговременный SMA как фильтр с длинным/коротким смещением, а два краткосрочных SMA - как крест, чтобы идти долго, когда есть длинный уклон, и перекрестный до короткого, когда есть короткий смещение. У меня есть цель прибыли и стоп-лосс, помещенный на фиксированное расстояние после открытия торгов.
Стратегия.
require(quantstrat)
require(IKTrading)
symbols <- "mySymbol"
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
currency('USD')
Sys.setenv(TZ="UTC")
stock(symbols, currency="USD", multiplier=1)
initDate="1980-01-01"
tradeSize <- 1000
initEq <- tradeSize*length(symbols)
account.st <- 0
strategy.st <- portfolio.st <- account.st <- "smatest"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD',initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
addPosLimit(portfolio.st, symbols, timestamp=initDate, maxpos=1, minpos=-1)
nSMAquick = 15
nSMAslow = 30
nSMAbias= 300
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAquick), label="quickMA")
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAslow), label="slowMA")
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAbias), label="bias")
add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"),
relationship="gt"), label="smaup")
add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"),
relationship="lt"), label="smadown")
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"),
relationship="gt"), label="biasup")
#
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"),
relationship="lt"), label="biasdown")
add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smaup", "biasup"), cross=F),
label="longentry")
add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smadown", "biasdown"), cross=F),
label="shortEntry")
#enter rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="longentry",
sigval=TRUE,
ordertype="market",
orderside="long",
replace=FALSE,
prefer="Open",
orderqty=1,
orderset="orderslong",
osFUN=osMaxPos),
type="enter",path.dep=TRUE,label="long")
#
#take profit
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry",
sigval=TRUE,
ordertype="limit",
orderside="long",
replace=FALSE,
orderqty=-1,
threshold=quote(.75),
orderset="orderslong"),
type="chain",
parent="long",
label="takeProfitLong",
path.dep=TRUE)
#stop loss
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry",
sigval=TRUE,
ordertype="stoplimit",
orderside="long",
replace=FALSE,
orderqty=-1,
threshold=quote(.25),
orderset="orderslong"),
type="chain",
parent="long",
label="stopLossLong",
path.dep=TRUE)
#
# ###########
# #short rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="shortEntry",
sigval=TRUE,
ordertype="market",
orderside="short",
replace=FALSE,
prefer="Open",
orderqty=-1,
orderset="ordersshort",
osFUN=osMaxPos),
type="enter",path.dep=TRUE,label="short")
#
#take profit
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry",
sigval=TRUE,
ordertype="limit",
orderside="short",
replace=FALSE,
orderqty=1,
threshold=quote(.75),
orderset="ordersshort"),
type="chain",
parent="short",
label="takeProfitShort",
path.dep=TRUE)
#stop loss
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry",
sigval=TRUE,
ordertype="stoplimit",
orderside="short",
replace=FALSE,
orderqty=1,
threshold=quote(.25),
orderset="ordersshort"),
type="chain",
parent="short",
label="stopLossShort",
path.dep=TRUE)
#apply strategy
t1 <- Sys.time()
out2 <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st)
Это образец результата торгов.
[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51"
[1] "2015-08-04 14:43:00 mySymbol -1 @ 45.87"
[1] "2015-08-04 14:44:00 mySymbol 1 @ 45.96"
[1] "2015-08-04 15:00:00 mySymbol 1 @ 46.12"
[1] "2015-08-04 15:22:00 mySymbol -1 @ 46.15"
[1] "2015-08-04 16:41:00 mySymbol -1 @ 45.96"
[1] "2015-08-04 17:00:00 mySymbol 1 @ 46.03"
[1] "2015-08-04 17:12:00 mySymbol -1 @ 45.91"
[1] "2015-08-04 17:36:00 mySymbol -1 @ 45.86"
[1] "2015-08-04 17:42:00 mySymbol -1 @ 45.78"
[1] "2015-08-04 19:09:00 mySymbol 1 @ 45.79"
[1] "2015-08-04 20:33:00 mySymbol 1 @ 45.95"
[1] "2015-08-04 20:34:00 mySymbol 1 @ 46.04"
> transactions <- getTxns(Portfolio=portfolio.st, symbols)
> transactions
Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL
1980-01-01 00:00:00 0 0.00 0 0.00 0.00 0.00
2015-08-04 05:23:00 1 45.51 0 45.51 45.51 0.00
2015-08-04 14:43:00 -1 45.87 0 -45.87 45.87 0.36
2015-08-04 14:44:00 1 45.96 0 45.96 45.96 0.00
2015-08-04 15:00:00 1 46.12 0 46.12 46.12 0.00
2015-08-04 15:22:00 -1 46.15 0 -46.15 46.15 0.11
2015-08-04 16:41:00 -1 45.96 0 -45.96 45.96 -0.08
2015-08-04 17:00:00 1 46.03 0 46.03 46.03 0.00
2015-08-04 17:12:00 -1 45.91 0 -45.91 45.91 -0.12
2015-08-04 17:36:00 -1 45.86 0 -45.86 45.86 0.00
2015-08-04 17:42:00 -1 45.78 0 -45.78 45.78 0.00
2015-08-04 19:09:00 1 45.79 0 45.79 45.79 0.03
2015-08-04 20:33:00 1 45.95 0 45.95 45.95 -0.13
2015-08-04 20:34:00 1 46.04 0 46.04 46.04 0.00
Я хочу, чтобы стратегия идти долго, то либо достичь цели по прибыли или получить стопу, или для того, чтобы быть закрытым, когда короткий сигнал подается, и наоборот.
Если я прокомментирую код короткого кода, он работает как ожидалось. Ниже приведен пример транзакций, когда короткая сторона закомментирована.
[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51"
[1] "2015-08-05 06:24:00 mySymbol -1 @ 46.26"
[1] "2015-08-05 07:35:00 mySymbol 1 @ 46.24"
[1] "2015-08-05 08:31:00 mySymbol -1 @ 45.99"
[1] "2015-08-05 12:01:00 mySymbol 1 @ 46.03"
[1] "2015-08-05 14:51:00 mySymbol -1 @ 45.78"
[1] "2015-08-05 21:00:00 mySymbol 1 @ 45.14"
[1] "2015-08-06 06:16:00 mySymbol -1 @ 44.89"
[1] "2015-08-06 18:29:00 mySymbol 1 @ 44.56"
Я вижу, что он не торгуется снова, пока не достигнет цели/остановки.
Без минимального, воспроизводимого примера, это очень сложно вам помочь. Я получил ошибку из вашего использования 'mktdata $ Close', который исчез, если вместо этого я использовал' Cl (mktdata) '. Я также не мог воспроизвести это поведение, когда использовал данные SPY от Yahoo Finance. –