bitmexのタートルズシステムbot作成時にやったこと。
やっとこ安定したのでまず問題点と解決方法を(忘れちゃうので)まとめとこうと思います。現在は約20日ほど実際に動作させていますが、今のところ特に問題がでなくなり目的のトレードを手を加えることなく施行できるようになりました。
作成したものはかの有名なタートルズシステムの1部に多少の自前のロジックを加えたものです。ほとんどかわりません。
http://www.metastocktools.com/downloads/turtlerules.pdf
(PDFであったんですが、本物ですよね?)ポジション作成の値段とポジションクローズの値段は違うのとPDFの損切のロジックが入っているのでドテンはしません。
1. bitmexのサーバーはよく応答がなくなる。
チャートがちょっと動くと、すべてのリクエストに対してoverload,timeoutが発生します。その頻度も結構なもので1時間に1回位はあるのではないでしょうか。またその期間も10分ぐらいあったり1分足でのトレードなど足の時間の短いものはかなり厳しそうです。また取得できる情報は価格を含め15秒程度遅れることがあります。
さらに高値、安値を更新する際などはほぼoverloadが発生しています。ms単位で時間を空けて何度もリトライする事でオーダーを施行することもできます。しかしAPI LIMITの規約による限界がありますし、なによりオーダーが遅れてしまいます。
turtle ruleではオーダーの値段が決まっているので、stop market orderで常にオーダーを配置し尚且つすべてのREST APIのリクエストをリトライするようにしました。
takerの手数料がとられてしまうのは痛いですが、makerになるならstop limit orderで値段が0.5でもいったん戻ってくれないといけません。ちなみに実行する値段と取引の値段を同じにしてstop limitいれてみたら普通に貫通しました。
2. socket通信もよく切れる
socket通信用の公式のライブラリがありますが、エラー処理が貧弱で死にます。最近(2018/5あたりで)やっと50x系のエラー処理を入れたみたいなのでそのうちよくなりそうですが、使用することはできませんでした。
公式は無視しているのですが、marge requestを送ってくれている方のほうを使ってみたところ安定していたのでそちらを使っています。
自分で作る羽目になるかと思いました。
3. 1,2が原因でオーダーが約定されてても取得できてないことがある。
rest apiをpollingし情報取得をしていましたが、rest apiでは実際に取得できる情報が遅れていることがあるので、オーダーが指値で実行されて無くなっているのに、なくなったオーダーを変更しようとしてエラーになったりしていました。
またsocket通信では通信が切れている途中の情報は仕様より取得できません。この為すべての情報の取得をsocketで取得しながら、rest apiをpollingしつつmargeする必要がありました。
マーケット情報はsocketで最新の足を取りながら、rest apiをpollingしてヒストリカルデータを取得し穴埋めしています。
オーダーの情報もsocketで最新の情報を取りつつ、rest apiをpollingしています。rest apiから取得したオーダーの情報は約定したオーダー情報のみ参照し、あとはsocketからの情報を使用しています。
その他細かい事
ccxtのprivate_put_order_bulkからリクエストしたオーダーの順番とレスポンスの順番が違うことがあった。
turtle ruleでは1つのマーケットでは3回買い増しがあるので、売り買い合わせて最大8本のオーダーがいります。bitmexでは複数のオーダーを同時に作成、変更できるAPIがあるのでこれを使用します。ccxtでは「private_put_order_bulk」が複数オーダーの変更「private_post_order_bulk」が複数オーダーの作成のAPIとして用意されています。
private_put_order_bulkは結果とリクエストのマッチングはオーダーのidから探せばいいのですが、private_post_order_bulkも心配になってリクエストした価格、数量などからちゃんとフィルターかけて手元の情報を更新するようにしました。
さいご
上記の対応をしたことで朝起きてがっかりすることがなくなりました。いろいろ書きましたがCRYPTのFXでBOTを作成するのであればbitmexがいいのではないかと思っています。
bitmex <-こちらから登録すると半年間手数料が10%引きになります。
次は何を書こうかなぁ。