私には次のような簡単な戦略があります。
- 最後の 5 秒間のローリング ボリュームの合計が 20 以上になるとロングになります。
- ロングエントリー時に 1% のテイクプロフィット注文を提出し、
- ロングエントリー時に-1%のストップロス注文を出します。
最初のエントリ注文は、OCO 注文でもある次の 2 つの保護注文の親であり、いずれか 1 つが約定され、後者はキャンセルされる必要があります。
ストラテジーのオーダーブックを調べたところ、OCO 注文がすべての場合に正しく機能していないことがわかりました。
Order.Qty Order.Price Order.Type Order.Side Order.Threshold Order.Status Order.StatusTime Prefer Order.Set Txn.Fees
2014-09-24 22:00:16 "1" "407" "market" "long" NA "closed" "2014-09-24 22:00:17" "Close" NA "0"
2014-09-24 22:00:17 "all" "411.07" "limit" "long" "4.07" "closed" "2014-09-24 22:35:18" "Close" "ocolong" "0"
2014-09-24 22:00:17 "all" "402.93" "stoplimit" "long" "-4.07" "canceled" "2014-09-24 22:35:18" "Close" "ocolong" "0"
2014-09-24 23:09:09 "1" "410" "market" "long" NA "closed" "2014-09-24 23:09:10" "Close" NA "0"
2014-09-24 23:09:10 "all" "414.1" "limit" "long" "4.1" "canceled" "2014-09-25 01:17:11" "Close" "ocolong" "0"
2014-09-24 23:09:10 "all" "405.9" "stoplimit" "long" "-4.1" "closed" "2014-09-25 01:17:11" "Close" "ocolong" "0"
2014-09-25 01:17:09 "1" "406" "market" "long" NA "closed" "2014-09-25 01:17:10" "Close" NA "0"
2014-09-25 01:17:10 "all" "410.06" "limit" "long" "4.06" "canceled" "2014-09-25 01:17:11" "Close" "ocolong" "0"
2014-09-25 01:17:10 "all" "401.94" "stoplimit" "long" "-4.06" "canceled" "2014-09-25 01:17:11" "Close" "ocolong" "0"
2014-09-25 01:22:47 "1" "405.2" "market" "long" NA "closed" "2014-09-25 01:22:48" "Close" NA "0"
2014-09-25 01:22:48 "all" "409.252" "limit" "long" "4.052" "canceled" "2014-09-25 04:03:57" "Close" "ocolong" "0"
2014-09-25 01:22:48 "all" "401.148" "stoplimit" "long" "-4.052" "canceled" "2014-09-25 04:03:57" "Close" "ocolong" "0"
最初の 2 つのポジションはうまく機能します。1 つの成行注文がクローズされ、2 つの OCO 注文のうち 1 つがクローズされ、1 つがキャンセルされます。
しかし、3 番目のポジションには 2014-09-25 01:17:11 にストップロス注文とテイクプロフィット注文の両方がキャンセルされており、いずれも約定されていません。
指値は 410.06 と 401.94 でしたが、その時のデータは次のようになります。
data.Open data.High data.Low data.Close data.Volume
2014-09-25 01:17:00 406.423 406.423 406.423 406.423 0.0000000
2014-09-25 01:17:01 406.425 406.425 406.425 406.425 0.0300000
2014-09-25 01:17:02 406.425 406.425 406.425 406.425 0.0000000
2014-09-25 01:17:03 406.425 406.425 406.425 406.425 0.0000000
2014-09-25 01:17:04 406.425 406.425 406.425 406.425 0.0000000
2014-09-25 01:17:05 406.425 406.425 406.425 406.425 0.0000000
2014-09-25 01:17:06 408.821 408.821 408.821 408.821 0.0110000
2014-09-25 01:17:07 408.821 408.821 408.821 408.821 0.0000000
2014-09-25 01:17:08 408.821 408.821 408.821 408.821 0.0000000
2014-09-25 01:17:09 406.000 406.000 406.000 406.000 20.0000011
2014-09-25 01:17:10 406.000 406.000 406.000 406.000 2.3411120
2014-09-25 01:17:11 405.882 405.882 405.882 405.882 0.2399996
2014-09-25 01:17:12 405.882 405.882 405.882 405.882 0.0000000
2014-09-25 01:17:13 406.000 406.000 406.000 406.000 1.0000000
2014-09-25 01:17:14 406.000 406.000 406.000 406.000 0.0110000
OCO 注文が両方ともキャンセルされ、どれも約定されなかった理由を教えてください。
全体の戦略コードは次のとおりです。
### Initial setup
rm(strategy.st)
try(rm("account.st","portfolio.st"),silent=TRUE)
.blotter <- new.env()
.strategy <- new.env()
initDate <- as.character(as.Date(from) - 1)
currency("USD")
Sys.setenv(TZ = "UTC")
symbols <- "data"
stock(symbols, currency = "USD", multiplier = 1) # Initialisation of the instrument
tradeSize <- 1 # Initialisation of trade size
initEq <- 1000 # Initialisation of initial equity
strategy.st <- "btc" # Initialisation of the strategy
portfolio.st <- "btc" # Initialisation of the strategy, must be after strategy
account.st <- "btc" # Initialisation of the strategy, must be after strategy and portolio
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)
### Parametres
lookBackVol <- 5
thresholdVol <- 20
stopLoss <- -0.01
profitTarget <- 0.01
### Indicators
add.indicator(strategy.st, name = "runSum", arguments = list(x = quote(Vo(data)), n = lookBackVol), label = "volRunSum")
### Signals
add.signal(strategy.st, name = "sigThreshold", arguments = list(column = "volRunSum", threshold = thresholdVol, relationship = "gte", cross = TRUE), label = "longSig")
### Rules
add.rule(strategy = strategy.st, name = "ruleSignal",
arguments = list(sigcol = "longSig", sigval = 1,
orderqty = tradeSize,
ordertype = "market",
orderside = "long",
prefer = "Close",
replace = FALSE
),
type = "enter",
label = "enterLong",
path.dep = TRUE
)
add.rule(strategy.st, name = "ruleSignal",
arguments = list(sigcol = "longSig", sigval = 1,
orderqty = "all",
ordertype = "limit",
orderside = "long",
prefer = "Close",
replace = FALSE,
tmult = TRUE,
threshold = quote(profitTarget),
orderset = "ocolong"
),
type = "chain",
parent = "enterLong",
label = "profitTargetLong",
path.dep = TRUE
)
add.rule(portfolio.st, name = "ruleSignal",
arguments = list(sigcol = "longSig", sigval = 1,
orderqty = "all",
ordertype = "stoplimit",
orderside = "long",
prefer = "Close",
replace = FALSE,
tmult = TRUE,
threshold = quote(stopLoss),
orderset = "ocolong"
),
type = "chain",
parent = "enterLong",
label = "stopLossLong",
path.dep = TRUE
)
test <- applyIndicators(strategy.st, data)
test <- applySignals(strategy.st, test)
head(test, 20)
### Results
results <- applyStrategy(strategy.st, portfolio.st)
編集1:
セッション情報は次のとおりです。
> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Czech_Czech Republic.1250 LC_CTYPE=Czech_Czech Republic.1250 LC_MONETARY=Czech_Czech Republic.1250
[4] LC_NUMERIC=C LC_TIME=Czech_Czech Republic.1250
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] base64enc_0.1-2 Defaults_1.1-1 quantstrat_0.8.2 foreach_1.4.2
[5] blotter_0.8.18 PerformanceAnalytics_1.4.3541 FinancialInstrument_1.1.9 quantmod_0.4-2
[9] TTR_0.22-0.1 xts_0.9-7 zoo_1.7-11 RCurl_1.95-4.3
[13] bitops_1.0-6
loaded via a namespace (and not attached):
[1] codetools_0.2-8 grid_3.0.1 iterators_1.0.7 lattice_0.20-29 tools_3.0.1
編集2
同時に複数のポジションが開かれている場合にエラーが表示されることを発見しました。最初のエントリー注文は、ストップロス注文とテイクプロフィット注文の送信をトリガーします。このような注文は、2 番目のポジションが開かれたときにまだ開かれています (約定されていません)。
保護命令を特定のエントリーオーダーにリンクする方法はありますか?