noteのタイトル画像

「ビットコイン自動売買用ccxt拡張」に「OTO注文」機能を実装しました

目次
・OTO注文を実装(BitMEX)
・OTO注文とは
・動作状況
・他の特殊注文も実装準備中
・課題

●OTO注文を実装(BitMEX)

先日公開させて頂きました「ビットコイン自動売買用ccxt拡張」にOTO注文機能を実装し、v0.0.2でgitlabへプッシュを完了しました。

すでにnoteを購入済みの方はgitlabから最新版(もしくはv0.0.2のタグ)をPullくだされば、OTO注文機能が利用できるようになります。
(OTO注文の詳細はこちらを参照ください)

●OTO注文とは

bitflyerでいうところの「IFD注文」と同様な注文になります。
・2つの注文を発行するが、1番目の注文だけが有効になり、
・1番目の注文が約定した後で、2番目の注文が有効になる
という注文形態です。

例えば、
「6000USDでロング指値注文を発注し、先のロングが約定したらショート指値注文で6500USDを発注する予約を入れる」
というような感じです。

最初の注文の約定をいちいち監視しなくて良い分、後の処理が楽になります。

●動作状況

以下のソースコードで確認しました。

const mex = new cBitMEX({
    fSimulation: false,
    fOrigin: false,
    resolution: 60,
    apiKey: ApiKey,
    secret: ApiSecret,
});

// 最終売買価格を取得
ret = await mex.fetchTicker();
// 指値でbuyは最終売買価格の-100, sellは+100を指定
// otoOrder( side, 数量, トリガー価格, 手仕舞い価格)
ret = await mex.otoOrder('buy', 1, ret.last - 100, ret.last + 100);
console.log(ret);
// 注文キャンセル
await mex.cancelOrder(ret.order1.id);
await mex.cancelOrder(ret.order2.id);

// 最終売買価格を取得
ret = await mex.fetchTicker();
// 指値でsellは最終売買価格の+100, buyは-100を指定
// otoOrder( side, 数量, トリガー価格, 手仕舞い価格)
ret = await mex.otoOrder('sell', 1, ret.last + 100, ret.last - 100);
console.log(ret);
// 注文キャンセル
await mex.cancelOrder(ret.order1.id);
await mex.cancelOrder(ret.order2.id);

まず、cBitMEXクラスのオブジェクトを取得します。
(例では、シミュレーション機能OFF, ターゲットはデモサイト)

次にfetchTicker(擬似fetchTickerです)で最終価格を取得して
・買い(buy)
・数量:1
・トリガー価格: 最終価格から−100
・手仕舞い価格:最終価格に+100
を設定し「otoOrder」メソッドを呼び出します。

上記の例ではわざと約定しないような設定で発注しています。

実行してみましょう。

買いと売りの注文が発行されました。

アクティブになっているのは「買い」の方です。

逆に
・売り(sell)
・数量:1
・トリガー価格: 最終価格に+100
・手仕舞い価格:最終価格からー100
を設定し「otoOrder」メソッドを呼び出します。

の2つの注文が発行され

アクティブになっているのは「売り」の方です。

●他の特殊注文も実装準備中

今後は、OTOの他に
・OCO
・OUOA
・OUOP
などの注文にも対応していきたいと思います。
(ドテンしている分にはあまり必要ないかもしれませんが)

●課題

今回の注文は内部的には指値注文を2回呼び出しています。

それほど頻繁に起きるとは思いませんが、以下のケースで問題になる可能性があります。

・1番目の注文が正常に実行され、2番目の注文が失敗する。

場合です。
今回の実装では、どちらかの注文で失敗した場合は有効になった注文をキャンセルするように実装しましたが、そのキャンセルさえも失敗するケースも考えられます。

OTO注文を発行しても注文数が1個しか登録されていない場合は何らかの不都合があったと考えてアプリ側で再度キャンセル処理を組み込むなどの防御策が必要になると考えています。

もしくは、注文をまとめて1回のAPI呼び出しで完了させられれば問題はないと思います。
(BitMEX側で複数個の注文がアトミッックに処理される保証があればの話ですが)
おそらく「privatePostOrder」あたりの”ほぼ素の"APIを呼べばよいと思うのですが、今後の調査項目としておきます。

ご期待いただければ「スキ」ボタンをポチっと、「フォロー」ボタンをクリック、よろしくお願いいたします。

note: https://note.mu/o_matsuo

twitter: @o_matsuo
もフォローしてくださると、喜びます。

あ、それから私の師匠である
コンドウ様のnoteもポチっとしていただけると、さらに喜びます。



ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。