CCXTでBitMEXのOCOとかの特殊注文を出してみるチャレンジ1
BitMEXの特殊注文。
前回はこちら。
まあ前置きは置いといて、早速やってみます。
参考資料
OCO
One Cancels the Otherとかいうらしいやつ。
あらかじめ利確と損切りのポジションを決めて、どちらもストップを置いておくわけですね。
参考資料に曰く。
OCO: One Cancels the Other. A very flexible version of the standard Stop / Take Profit technique.
(OCOはいい感じに利確と損切を実現するテクニックです。)Multiple orders may be linked together using a single clOrdLinkID.
共通の「clOrdLinkID」を設定することで複数の注文を紐づけます。Send a contingencyType of OneCancelsTheOther on the orders.
「contingencyType」にはOneCancelsTheOther
を指定してください。The first order that fully or partially executes (or activates for Stop orders) will cancel all other orders with the same clOrdLinkID.
(いずれかの注文が執行された時点で、同じ「clOrdLinkID」を持つ他の注文はすべてキャンセルされます。)
というわけで、パラメータを設定して注文を出すだけっぽいです。
パラメータはこんな感じですかね?
パラメータ | 注文1 | 注文2 |
---|---|---|
symbol | BTC/USD | BTC/USD |
type | StopLimit | Limit |
side | buy | sell |
amount | 10 | 10 |
price | 7000 | 7500 |
stopPx | 6900 | - |
clOrdLinkID | hoge | hoge |
contingencyType | OneCancelsTheOther | OneCancelsTheOther |
やってみた
最初のポジションを取ったタイミングで他の注文がキャンセルされました。
うーん?
なんか勘違いしてるな。
よく見てみると、先ほどの説明に書いてありました。
雑に訳してたからスルーしてましたが。
The first order that fully or partially executes (or activates for Stop orders) will cancel all other orders with the same clOrdLinkID.
(いずれかの注文が(ストップの執行を含め)部分的か完全かを問わず執行された時点で、同じ「clOrdLinkID」を持つ注文がキャンセルされます。)
ストップやストップ指値であっても、残りのすべての注文をキャンセルするということですね。
まじか。
ただしStopLimitに関しては、Stopに突入してLimitが発動しただけではキャンセルはされないようです。
うーん。
ということはとりあえずStopで建てておいて、Stopが成立したら上と下に注文を出して元の注文はキャンセルするとか……?
そもそもの間違い
さらにいろいろ試行錯誤しつつ、気付きました。
StopとかStopLimitってストップ付きの注文じゃなくて、ストップそのものなんですね。
成行でポジションを建てつつ指定したところにストップを入れるのではなく、ストップで入るだけ。
めっちゃ勘違いしてました。
注文が速攻で成立してたのも、現在価格より低い位置に買いのストップが入ってたから、というだけのことでした。
そりゃ速攻でストップして注文成立しますわ。
買いで入って売りのストップが入る便利機能だと思っていたので気付かなかった……。
しばらく見てたらストップが消えて、それでようやく気付きました。
いやはやお恥ずかしい。
というか前回の記事間違えてたな。
……しれっと修正しました。
あるいは
edit_orderでStopをOCO注文に変更しつつ、上の指値を追加するとかできないのかな?
とか思ったものの。
これは試してみたけどできない模様。
edit_order自体は通るんですが、clOrdLinkIDとcontingencyTypeは変更されませんでした。
ふむ。
決済のパラメータがある?
いろいろ調べてたら注文の画面には決済というパラメータがあることを知りました。
決済、つまりポジションを手仕舞うよようにしか注文を出さない方法らしいです。
これを設定してないと前述の自分のようにストップでポジションを立てるというよくわからない状況になって混乱するわけですね。
設定していれば損切から先に入るということはなくなると。
なるほど。
注文を出して確認してみましたが、execInst
に'ReduceOnly'
をセットすればいけるっぽいです。
思いついた。
INのOCOとOUTのOCOを分けて指定すればいいのでは?
とか思いついたものの時間切れ終了。
続きは次回。
社畜になって日が浅いため時間配分がまだまだ不慣れです……というクソみたいな言い訳をしつつ。