シストレどうですか

  Algorithmic Trading for Dummies

FXボット とりあえず動かしてみた編 その2 ー テストしてみた

もうクリスマスの時期が来てしまいました。2021年ももう終わりですね。
クリスマスと言えば毎年のように12月の初めくらいから我が家でも家を電飾で飾っています。
5年位前に外用の飾りつけをまだ使えるものを少し除いてLCDに変えたのですが、アマゾンをみていたら太陽電池で光らせるものが売っていたので試しに購入してみました。
コンセントにつなぐものに比べて光が弱いですが、コードを気にせずに配線できるので離れた木に巻き付けて使うにはちょうどよい感じで、また夜寝る前に電源をオフにする必要もないので大変便利です。

f:id:jantzen:20211221081938p:plain:w150:left

ソーラータイプのライトを購入した後にまたアマゾンを見ていたら携帯電話を充電するモバイルバッテリーを接続して光らせるタイプのものもある事に気が付きました。
家に余っているモバイルバッテリーもたくさんあり、こちらのほうが日照時間が短いような場所でも使え明るい気もしますので来年のクリスマスはそれを買ってみようかなと思いまいした。

さて本題ですが、Ubuntu上でボットのテスト環境ができたところでボットを動かしてみました。
作成したボットのソースコードとテスト環境についての詳細は以下のブログ参照。

jantzen.hatenablog.com jantzen.hatenablog.com


テスト方法


まずはテストというにはおこがましいのですが、2週間ほど完成したプログラムを動かし続けてみました。

手順

  1. 実行タイミング

    現在のボットはマーケットが閉まると停止する設計になっています。
    トレードできる時間帯は原則NY時間の日曜日の午後5時から金曜日の午後5時までですので、日曜日のトレードの開始時間以降にボットを手動でスタートさせます。
    途中で停止していた場合は気づいた時点で再始動。

  2. プログラムの始動

    プログラムがおいてあるフォルダーのターミナルから以下のコマンドで開始。

    $ pipenv run python パッケージ名

    (パッケージ名が存在しているディレクトリ上のターミナルから実行しています。)

  3. 監視方法

    取引の発生自体はOandaの携帯アプリで確認可能ですが、監視する方法もまだ貧弱ですので動いているプログラムのターミナルを定期的にチェックし、ボットが停止していないか確認。

        {'status': 'GO', 'bid': '112.952', 'ask': '112.966', 'spread': 0.014}
        継続-トレード可能
        ポジなし。 継続
        シグナルなし
          complete  volume                        time_UTC  ...     pair  ashi  trend
        6      True     400  2021-11-09T07:55:00.000000000Z  ...  USD_JPY    M5   -1.0
        7      True     556  2021-11-09T08:00:00.000000000Z  ...  USD_JPY    M5    1.0
        8      True     258  2021-11-09T08:05:00.000000000Z  ...  USD_JPY    M5    1.0
        [3 rows x 10 columns]
        待機中  310
    


結果


2週間にわたりボットを走らせた結果になります。途中でボットが長時間停止していた期間もありかつ正確に結果を記録したわけではありませんのでだいたいな感じになります。

24時間稼働のボットを初めて動かしたわりには思ったていたより安定していると感じましたが、やはりテスト期間中サーバーからのエラーのレスポンスが何回か発生しボットが自動停止しました。

確認ポイント

新規レートの取得

スプレッドが拡大した場合取引を行わないようにしたり、マーケットがクローズした際にはボットが自動停止した事を確認しました。

注文処理

成績はともかく1日平均6件ほどの成行注文を執行しています。
ポジションのオープン/クローズまわりに関しては、ポジションがどんどん膨らんでいったり設定以上の利益や損失がでるような現象は特にでていません。

エンドポイント全般

エラーによる停止

今回のテスト期間中に3回サーバーからのエラーレスポンス戻りボットが自動停止しました。

  • 104 : Connection rest by peer → 2回

    ('Connection aborted.', ConnectionResetError(104, 'Connection rest by peer'))

  • 502 : Bad Gateway → 1回

    <html>
    <head>
    <title>502 Bad Gateway</title></head>
    <body>
    <center><h1>502 Bad Gateway</h1></center>
    <hr><center>cloudflare</center>
    </body>
    </html>

エラーコードの内容からどちらも何らかの原因サーバーとの通信がタイムアウトをしたようです。 現行の仕様ではこのようなタイプのエラーについてはどこのエンドポイントでエラーが発生したか正確にわかりません。

マーケットクローズによる停止

また、今回のテスト期間中に1回平日にもかかわらずNY時間の午後5時頃にマーケットがクローズのためボットが停止しました。
これはメンテナンス等による一時的な停止と予想されます。

その他

その他では特に変な処理をするようなこともなく、設計通りに稼働しているように見えます。


改善点


とりあえず問題がいくつか見つかったのでどのように改善していくか考えてみました。

エラーの検知

既知のエラー

今回のテストで発生した104と502のエラーに関しては、すぐに回復する可能性も高いためボットを停止せずに何回か再呼び出しを行いリトライするように変更する事を検討する。
他の500番台のコードを受け取った場合は、502と同様に扱ってよいかどうかまだわからないので何もせずに停止させる。

未知のエラー

当然今回のテストで発生した以外のエラーも起こりうるので、どこのステートメントで発生したのかわかるような仕組みを組み込めるようにする。

エラーの通知

ボットが自動で停止した場合にすぐに気づかず停止したまま放置されていることがあるので、そのような場合は携帯電話に通知が飛ぶようにして停止時間を最低限に抑える工夫を加える。
この機能を加えてたところで家のネットがダウンしてしまった場合はそもそも通知ができませんし、当然寝ている間は気がつかないと思いますがないよりマシという事で・・・。

その他

マーケットのクローズによる停止

平日の一時的なマーケットクローズでも停止させないように処理を変更する。


まとめ


ひとまずの感想としましては、サーバーとの通信エラーを除けば以外と安定して稼働してくれていたので安心しました。
また今回お恥ずかしながらCloudflareなるものが存在することも初めて知ることができました。
(ネットでCloudflareについて調べてみました。実のところいまだあまり理解できていないのですが、ボットとは直接関係ないのでこれ以上は調べるのはやめておきます・・・)
ただ実際にやってみないと学べないことが今後もいろいろでてきそうですのでめげずに頑張ってみたいと思います。

もうしばらくこのバージョンのボットを動かしてみて他にもどんなエラーが発生するか見極めていきたいと思います。 また、通貨銘柄を変更すれば同時並行で複数のボットを稼働する事も可能と考えていますので、改善点を考慮したバージョンを作成して同時にテストしていきます。

今回洗い出した改善点の中で、エラーの通知の部分に関しては簡単に追加できそうですのでまずはここから始めていきたいと思います。