BitflyerFXで注文が消えたり、約定拒否や二重注文になる場合の対策コードPythonでBOTを作ってBitflyerFXで運用していると、以下のようなトラブルにときどき遭遇します。いずれも「対策をしないと気付かないうちに意図しない建玉が残る」という種類のトラブルです。「約定拒否」というのが何かよくわからず、個人的には「注文が消える」と類似の問題と理解しているのですが、もし違ったら教えてください。問題点これらの共通の問題は、通信エラーが判定条件にならないことです。通信エラーが出てくれれば、単に例外処理をすればいいだけですが、通信エラーが出ていないのに注文が反映されない場合(または通信エラーが出たのに注文が執行された場合)、BOTの挙動がおかしくなる原因になります。注文の遅延とは、正常に指値注文のリクエストが受理されたのに、「注文一覧」か「建玉一覧」に注文が反映されない状態です。これはもし「信じて待っていればいつか必ず反映される」という前提であれば、ただひたすら待てばいいことになります。場合は実際それで問題ありません。基本的な遅延の対策コードは以下に紹介しています。参考:Bitflyerで自動売買の試作BOTを作ろう!消えた場合の対策しかしごく稀に「消えてしまう」という厄介なケースがあります。この場合、信じて待っていると永久に「反映待ち」の状態が続きます。そのため、少し気持ち悪いですが、一定の間隔でカウンターを回してどこかで諦めて「消えた」と判定しなければなりません。以下のような感じです。flag通常は多くても5~10行、遅延が続いたあとに注文一覧に反映されます。4月後半に注文が消えるという問題が何度か出たことがあったと思います。記事にしようと思いつつ時間が経ってしまい、少し前のテストなのでうろ覚えですが、たしかこのテストのときは注文が消えたと思います。「注文が消える」ケースはそう頻繁に再現できないので、なかなか対策の方法が難しいです。二重注文は、タイムアウトやサーバーエラーなどの通信エラーが出たにも関わらず、実際には注文が正常に受理されていたパターンです。それに気づかずに、例外処理をして注文を再送すると、ダブルで約定してしまいます。これは注文を連打せずに、ある程度、しっかり間隔をあけて間にポジションチェックを入れれば回避できる気もします。前述のように、遅延が酷いときは1~2分待ったくらいでは確信を持って判断できないときもあります。サーバーが混雑していないときまで毎回1~2分待つのも非効率です。タイムアウトエラーの対策1つの対策としては、接続のタイムアウトの判定時間を長めに設定しておくという方法があります。CCXTライブラリ経由でBitflyerに注文を出す場合、初期設定でのタイムアウトの判定は10秒に設定されています。10秒待って応答がなければエラーとして扱われるわけですが、以下のように記述することで、その待機時間を伸ばすことができます。上記の例では、タイムアウトエラーの判定時間を30秒にしています。抜本的な解決方法ではありませんが、個人的には、上記の設定でかなりエラー頻度が減ったように思います。定期的に建玉をチェックする結局のところ、あまりスマートではないですが、定期的に「意図しない建玉」が残っていないかをチェックするしかないかもしれません。現在の建玉を取得する関数の作り方は以下を参考にしてください。参考:BitflyerFXの平均建値とサイズを取得する例えば、以下のような関数を全体ループの中に入れることを考えます。このような処理をする場合は、今度は逆に「成行注文で決済したはずなのに遅延で建玉が残っている場合」に騙されないように注意しなければなりません。そのため、成行注文を出したときに、確実にすべて執行されたところまで見届けることが重要です。すべての成行注文が執行されたとしても、決済後も「建玉一覧」にポジションが解消されたことへの反映が遅延する可能性もあるため、上記のコードでは5回ほどカウンターを回して確認しています。良い方法も模索中です。コメントをキャンセルメールアドレスが公開されることはありません。