Bot mmnot 開発ログ

🛠️開発記録#237(2025/5/26)— v1.0.0 安定版までの道のり

TL;DR

  • CI にフル E2E を組み込み、1 分以内で “ユニット → モック E2E” を完走
  • main/Release タグは常にグリーン。v1.0.0 を無事リリース
  • 次フェーズは「実 API 24h 監視」「可視化ダッシュボード」「アルゴ v0.2」へ

1. 背景と狙い — 「利益よりも、まずは安全停止」

1-1. なぜ“安全停止”が最優先なのか

暗号資産のマーケットメイクは 24 時間 × 365 日
– 過剰レバレッジ
– アップデート直後の想定外挙動
– 取引所 API 停止
こうしたイベントは深夜でも一瞬で証拠金を吹き飛ばします。
MMBot では――

  1. ドローダウン (DD) が所定の閾値に達したら自動クローズ
  2. Slack へ即通知して人間が再確認
    を“収益ロジックよりも前”に実装しました。

1-2. 自動テストを「保険」から「必須条件」へ

手動 QA だけでは、

  • “たまたま” エラーを踏まない
  • “深夜リリース” でカバレッジが低下
    というリスクが残ります。
    そこで今回、「テストが落ちた PR は絶対マージできない」 仕組みを導入。
昔の流れ今回から
開発 → 手動テスト → うっかりマージ → 本番でバグ開発 → Push → CI (ユニット → モック E2E) → Green ならレビュー → Merge
バグ調査に最長半日テスト失敗時点で即検知:修正→再 Push のみ

1-3. 狙った効果

  1. 安全性: main / Release が常にグリーン → “いつ壊れたか” を即特定。
  2. 速度 : モック E2E により 1 分以内 でフィードバック → PDCA 短縮。
  3. スケール: 新機能を足しても「テスト追加 → Green」で品質担保が可能に。

2. 達成したこと

具体的な成果インパクト
コア安定化CLI → Execution → Guard → Notify の本番/テストネット運用がワンコマンド想定外の DD や通信エラーでも Slack に即報告 & 自動クローズ
テスト体制ユニット 84 件(カバレッジ 96 %)
GitHub Actions 上で E2E(Testnet→Real) 自動実行
仕様追加しても“壊れたら即検知”
高速 E2EMOCK_STREAM=1 で WS/HTTP を完全モック化 → CI 内 1 分 で A–H フェーズ完走PR レビュー前に結果が返ってくるので PDCA が加速
CI/CDci.yml(ユニット)→e2e.ymle2e-real.yml 連鎖実行/PR が赤ならマージ禁止品質ゲートが常に動く
ドキュメントARCHITECTURE.md にシステム図+テストフロー図
PROGRESS.md に時系列ログ
新メンバーが 10 分で全体像を把握
リリース管理v1.0.0 タグを GitHub Releases へ公開“いつでも戻せる” 安定版を確保
開発スピードChatGPT(o4-mini) をリファクタ & CI 相談相手に活用作業時間を体感 30 % 削減

補足解説

  • コア安定化
    • run_loop()DD ガードsafe_exit を標準装備。
    • Slack 送信が 404 を返しても BOT が落ちずにリトライ可能。
  • テスト体制
    • pytest マークで unit / integration を分離。
    • E2E は Testnet-WS を実際に叩いた後、Real-REST へフェイルオーバ。
  • 高速 E2E
    • モック板を固定値 + 簡易スプレッド変化でエッジケースを再現。
    • 全 8 フェーズ (DD, Skip, API error, Slack 404 …) を 55 秒 で網羅。
  • CI/CD 連鎖
    • ジョブ依存 (needs:) で “ユニット OK → モック E2E → 実 E2E” を段階式に。
    • main もリリースタグも 常にグリーン を実現。
  • ドキュメント
    • Mermaid 図で「システム全体」と「テストパイプライン」を可視化。
    • 新規参入者が README → ARCHITECTURE → PROGRESS で即キャッチアップ。
  • リリース管理
    • タグ時のみ GitHub Actions がアーティファクトを生成。
    • “壊れたら前のタグに roll-back” がワンボタン。
  • 開発スピード
    • ChatGPT へ diff と要件を貼り付け → リファクタ案/テスト雛形を受け取り時短。
    • 人はレビューとロジック設計に集中できるサイクルへ移行。

3. キーテクニック ――「落ちないテストを 速く 回す仕組み」


3-1. 完全モック E2E ― “本番 API に 1 バイトも投げない”

# tests/e2e/testnet_checks.sh (抜粋)
export MOCK_STREAM=1          # WebSocket / REST をすべて stub
./testnet_checks.sh           # A–H 8 フェーズ ≒ 55 秒
仕掛け要点
環境変数フラグMOCK_STREAM=1 のとき src/mmbot/cli.py
‒ WebSocket 接続をスキップ
orderbook = {"bid":100,"ask":100} を注入
フェーズ設計A: 手動確認も CI では CI=true で自動スキップ
B–H: DD/spread-skip/API error … を一気に網羅
効果外部ネットワーク待ちゼロ → CI 1 分以内 で完走

3-2. CI 連鎖 ― “ユニット → モック → 実 E2E” を段階式で

# .github/workflows/e2e-real.yml (概略)
jobs:
  test:          # pytest + coverage
  e2e:
    needs: test  # ユニット GREEN が前提
  e2e-real:
    needs: e2e   # モックE2E GREEN が前提

ポイント

  1. needs: でジョブ依存を宣言し、失敗したら後続をスキップ。
  2. 並列より安全性重視:合計時間は伸びても“壊れた場所”が一目で分かる。
  3. main & tag だけ実 E2E:開発ブランチはモック E2E で高速回転、本番相当はリリース直前に。

3-3. AI 伴走 ― “差分だけ渡す” チャット駆動リファクタ

シーンChatGPT(o4-mini) への投げ方得られたアウトプット
依存の注入execution.place_limit_order を DI 化したい。cli.py のこの diff を見て最小改変案を」サンプルコード+副作用を壊さない順序
テスト生成guard.calc_cycle_pnl に境界値テストを足したい。pytest スタイルで書き出して」fixture・パラメタライズ済みスケルトン
CI エラー解析GitHub Actions のログを貼り付け →「原因と一行パッチ案は?」欠損 import の特定と __init__.py 追記案

結果: ループ 1 回あたりの修正時間を 約 30 % 削減。
人間は設計とレビューに集中、機械はパターン作業を担当——が理想形に近づいた。


4. ここからの一歩 ―― “守りを固めたら、攻めに転じる”

優先度項目概要
★★★24 h Live E2ETestnet 上で BOT を 24 時間ノンストップ稼働させ、Bybit 実 API/ネットワーク変動を継続監視するジョブを追加
★★☆メトリクス可視化Prometheus + Grafana で PnL・DD・レイテンシ・約定率などを可視化し、Slack アラートと連動
★★☆アルゴ v0.2Adaptive Spread Entry、Funding Rate 最適化など次世代ロジックを設計・実装
★☆☆設定バリデーション.envconfig_*.json の必須項目を起動前に一括チェックし、漏れを即時エラーに

4-1. 24 h Live E2E(最優先 ★★★)

  • 狙い:CI がモックで担保できない「長時間運転 × 実ネットワーク」の不確実性を解消。
  • 実装案
    1. GitHub Actions の定期ワークフロー (schedule:) で 2 時間ごとに起動。
    2. 実 API のレスポンス遅延・エラー率を収集し、閾値超で Slack 通知。
    3. 成果物(ログ / PnL)を Artifacts に保存して回帰分析。

4-2. メトリクス可視化(★★☆)

  • 狙い:DD が迫った瞬間やレイテンシ劣化を “グラフで一目” に。
  • 実装案
    • statsd-exporter + asyncio-middleware で Execution の各種タイミングを push。
    • Grafana にダッシュボードテンプレを用意 → Slack の /grafana コマンドで即共有。

4-3. アルゴ v0.2(★★☆)

  • 狙い:スプレッドが狭い相場でも取りこぼさない “賢いエントリー” を実現。
  • ロードマップ
    1. Adaptive Spread Entry:市場ボラに応じて s_entry を動的変更。
    2. Funding Rate 管理:資金調達コスト込みでポジション時間を最適化。
    3. テスト:モックに price noise generator を追加し、挙動を自動検証。

4-4. 設定バリデーション(★☆☆)

  • 狙い:新環境セットアップ時の「env が足りなくて起動エラー」をゼロに。
  • 実装案
    • 起動直後に pydantic.ValidationError で必須キーをチェック。
    • チェック結果をカラー表示し、欠損があれば即終了。
    • ユニットテストに “env 欠落パターン” を追加して回帰防止。

5. まとめ

今回のアップデートで、「壊さず早く回す」 基盤が整いました。
次は実ネットでの 24 時間観測とダッシュボード可視化に挑みます。
今後もアップデートを追っていただけると嬉しいです!

-Bot, mmnot, 開発ログ