coincheckのAPIでシステムトレードプログラムを作る際に必須の機能なのが発注と同時に損切りの発注を出す処理です。これFXの世界ではイフダン(if done)というらしいです。今回はこの処理の実装方法について書きます。
処理の流れ
coincheckのAPIの実行順としては下記のようになります。
- 新規注文API
- ポジション一覧API
- 新規注文API
ポジション一覧APIを利用しなければならないというのが味噌です。これが分かるのに時間がかかりました。
なぜポジション一覧を取得しないといけないのか
損切り発注の場合も新規注文APIを使用するのですが、損切りの場合はどのポジションに対しての注文なのかIDを指定しなければなりません。例えばロングポジションに対する損切り発注は下記のようなリクエストとなります。
{ "pair": "btc_jpy", "position_id": 12345, "stop_loss_rate": 900000, "amount": 0.1, "order_type": "close_long" }
このposition_idとamountをポジション一覧APIから取得しなければならないのです。新規注文APIのレスポンスにidが含まれているのですが、これはあくまで注文IDであってポジションIDではないようです。そんなことcoincheckのAPI仕様には書いてないので大変困りました。実際に動かしてみて恐らくそうだろうと理解するしかないのが現状です。また、最初はamountは新規注文時のパラメータから計算した値を使っていたのですが、発注後の値動きによっては計算値と異なるBTCが決済されるので、必ずポジション一覧APIから取得したamountを利用しましょう。
ポジションの取得方法
ポジションの取得には新規注文APIのレスポンスの注文IDを使用します。とは言っても注文IDからポジションを取得するAPIは存在しません。ポジション一覧から探します。
{ "success": true, "pagination": { "limit": 1, "order": "desc", "starting_after": null, "ending_before": null }, "data": [ { "id": 10, "pair": "btc_jpy", "status": "open", "created_at": "2015-12-02T05:27:53.000Z", "closed_at": null, "open_rate": "43553.0", "closed_rate": null, "amount": "1.51347797", "all_amount": "1.51045705", "side": "sell", "pl": "-8490.81029287", "new_order": { "id": 23104033, "side": "sell", "rate": null, "amount": null, "pending_amount": "0", "status": "complete", "created_at": "2015-12-02T05:27:52.000Z" }, "close_orders": [ { "id": 23755132, "side": "buy", "rate": "10000.0", "amount": "1.0", "pending_amount": "0.0", "status": "cancel", "created_at": "2015-12-05T05:03:56.000Z" } ] } ] }
この中のnew_orderのidが注文IDです。なかなか刺激的な仕様です。
ポジション取得の注意事項
当たり前ですが、新規注文APIを叩いた後にポジション一覧APIを叩いていても注文が確定指定するまではポジション一覧にポジションは存在しません。ただイフダシをするのは成行注文だと思うので数秒で反映されるはずです。ここはポジションが現れるまでループするしかないでしょう。
また、coincheckの一覧取得APIはページネーションという仕様が使われているのですが、ここに不具合や説明不足があってカオスなことになっています。これも実際に売買しながら動作確認しないといけないので大変でした。ページネーションについてはまた別記事にまとめます。
www.k-karakuri.com