Bitflyerでは毎日午前4時00分~午前4時10分にかけて定期メンテナンスが実施されます。このメンテナンスの時間中は新規の注文ができないだけでなく、事前に受け付けられた注文も約定しないまま消滅します。
参考リンク:Bitflyer公式「メンテナンスについて教えてください」
問題
1時間足を基準にトレードするBOTの場合、午前4時ちょうどにエントリーや決済のシグナルが出ることもあります。
このときBOTの新規注文が拒否されれば通常の例外処理で対応できますが、ギリギリで注文が通ってしまった場合、サーバー側ではそのまま約定することなく消滅するため、BOT側は永遠に約定を待つことになり、トラブルの原因になります。
そのため、この記事ではメンテナンス時間中にBOTを停止する方法を解説します。
解決策
以下のようなコードをメインのwhile文の中の先頭の部分に追加しましょう。
wait = 60 maintenance_start = "03:59:30" maintenance_end = "04:10:30" while True: # メンテナンス時間は稼働しない st = datetime.strptime(maintenance_start,"%H:%M:%S").strftime("%H:%M:%S") et = datetime.strptime(maintenance_end, "%H:%M:%S").strftime("%H:%M:%S") nt = datetime.now().strftime("%H:%M:%S") if nt>st and nt<et: print("メンテナンス時間中のため待機しています") time.sleep(wait) continue
現在の時刻が、メンテナンスの開始時刻(maintenance_start)と終了時刻(maintenance_end)の間に入っていれば、if文の中身が実行されます。continueは、それ以降の記述を実行せずに while文の先頭に戻る、という指示です。
このコード例では周期を60秒(wait=60)にしていますが、ここは各BOTに合わせて調整してください。
2か所datetime.が抜けています
誤datetime.strptime()⇒正datetime.datetime.strptime()
誤datetime.now()⇒正datetime.datetime.now()