Closed1

仮想通貨 bot のクラス設計

まちゅけんまちゅけん

クラス図

クラス詳細

  • Bot
    • bot、つまりアルゴで条件計算、API でオーダーをリクエストするなど取引戦略を執行してくれるロボット。
    • initialize
      • 初期化処理。 必要があれば WebSocket や DB に接続したりする。
    • execute
      • 売買戦略を実行するメソッド (One-shot) 。
      1. Exchange クラスから必要な情報を取得する。
      2. Algo クラスの売買判断メソッドに渡して可否の bool を受け取る。
      3. 売買判断が True なら Exchange クラスで売買する。
    • wait
      • bot のループサイクル、スリープまたは何かのイベントを待つ処理。
    • run_forever
      • 無限ループで取引戦略をキックさせるメソッド。 initialize 後、while True で executewait を実行する。
  • SomeExchange
    • 取引所クラス、API のリクエスト・レスポンスを担う。
    • インスタンス変数に HTTP /WebSocket クライアントとして pybotters や ccxt を持っておいて、売買ロジックに必要な API リクエストをメソッドとして実装する。
  • Algo
    • 売買条件を担うクラス。
    • judge_condition
      • Bot クラスからの情報をインプットに売買条件を bool で返す。

main 関数の見通し

async def main():
    async with pybotters.Client() as client:
        exchange = SomeExchange(client=client)
        algo = Algo(base_param1=42, base_param2=100.0)
        bot = Bot(exchange=exchange, algo=algo)

        await bot.run_forever()


asyncio.run(main())

テスト

ネットワークアクセスを利用する Exchange クラス、それを利用する Bot クラス、アルゴリズムを担う Algo クラスと分けていることで、それぞれのテストがしやすくなる。
例えば、責任を全く分けずに API で取得したデータをアルゴリズムに渡す設計になっていると、売買条件判断のロジックの単体テストが非常にやりづらくなてしまう (実稼働のみでのテスト) 。

この設計であれば以下のように、自ら価格などを用意して簡単にテストできる (bot を稼働しなくてもロジックをデバッグできる) 。

def test_algo():
    algo = Algo()
    cond = algo.judge_condition(side="buy", price=1234.5, ohlc=[...])
    assert cond is True
このスクラップは2023/08/03にクローズされました