TL;DR
- CI にフル E2E を組み込み、1 分以内で “ユニット → モック E2E” を完走
- main/Release タグは常にグリーン。v1.0.0 を無事リリース
- 次フェーズは「実 API 24h 監視」「可視化ダッシュボード」「アルゴ v0.2」へ
1. 背景と狙い — 「利益よりも、まずは安全停止」
1-1. なぜ“安全停止”が最優先なのか
暗号資産のマーケットメイクは 24 時間 × 365 日。
– 過剰レバレッジ
– アップデート直後の想定外挙動
– 取引所 API 停止
こうしたイベントは深夜でも一瞬で証拠金を吹き飛ばします。
MMBot では――
- ドローダウン (DD) が所定の閾値に達したら自動クローズ
- Slack へ即通知して人間が再確認
を“収益ロジックよりも前”に実装しました。
1-2. 自動テストを「保険」から「必須条件」へ
手動 QA だけでは、
- “たまたま” エラーを踏まない
- “深夜リリース” でカバレッジが低下
というリスクが残ります。
そこで今回、「テストが落ちた PR は絶対マージできない」 仕組みを導入。
昔の流れ | 今回から |
---|---|
開発 → 手動テスト → うっかりマージ → 本番でバグ | 開発 → Push → CI (ユニット → モック E2E) → Green ならレビュー → Merge |
バグ調査に最長半日 | テスト失敗時点で即検知:修正→再 Push のみ |
1-3. 狙った効果
- 安全性: main / Release が常にグリーン → “いつ壊れたか” を即特定。
- 速度 : モック E2E により 1 分以内 でフィードバック → PDCA 短縮。
- スケール: 新機能を足しても「テスト追加 → Green」で品質担保が可能に。
2. 達成したこと
軸 | 具体的な成果 | インパクト |
---|---|---|
コア安定化 | CLI → Execution → Guard → Notify の本番/テストネット運用がワンコマンド | 想定外の DD や通信エラーでも Slack に即報告 & 自動クローズ |
テスト体制 | ユニット 84 件(カバレッジ 96 %) GitHub Actions 上で E2E(Testnet→Real) 自動実行 | 仕様追加しても“壊れたら即検知” |
高速 E2E | MOCK_STREAM=1 で WS/HTTP を完全モック化 → CI 内 1 分 で A–H フェーズ完走 | PR レビュー前に結果が返ってくるので PDCA が加速 |
CI/CD | ci.yml (ユニット)→e2e.yml →e2e-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 へフェイルオーバ。
- pytest マークで
- 高速 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 が前提
ポイント
- needs: でジョブ依存を宣言し、失敗したら後続をスキップ。
- 並列より安全性重視:合計時間は伸びても“壊れた場所”が一目で分かる。
- 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 E2E | Testnet 上で BOT を 24 時間ノンストップ稼働させ、Bybit 実 API/ネットワーク変動を継続監視するジョブを追加 |
★★☆ | メトリクス可視化 | Prometheus + Grafana で PnL・DD・レイテンシ・約定率などを可視化し、Slack アラートと連動 |
★★☆ | アルゴ v0.2 | Adaptive Spread Entry、Funding Rate 最適化など次世代ロジックを設計・実装 |
★☆☆ | 設定バリデーション | .env や config_*.json の必須項目を起動前に一括チェックし、漏れを即時エラーに |
4-1. 24 h Live E2E(最優先 ★★★)
- 狙い:CI がモックで担保できない「長時間運転 × 実ネットワーク」の不確実性を解消。
- 実装案
- GitHub Actions の定期ワークフロー (
schedule:
) で 2 時間ごとに起動。 - 実 API のレスポンス遅延・エラー率を収集し、閾値超で Slack 通知。
- 成果物(ログ / PnL)を Artifacts に保存して回帰分析。
- GitHub Actions の定期ワークフロー (
4-2. メトリクス可視化(★★☆)
- 狙い:DD が迫った瞬間やレイテンシ劣化を “グラフで一目” に。
- 実装案
statsd-exporter
+asyncio-middleware
で Execution の各種タイミングを push。- Grafana にダッシュボードテンプレを用意 → Slack の
/grafana
コマンドで即共有。
4-3. アルゴ v0.2(★★☆)
- 狙い:スプレッドが狭い相場でも取りこぼさない “賢いエントリー” を実現。
- ロードマップ
- Adaptive Spread Entry:市場ボラに応じて
s_entry
を動的変更。 - Funding Rate 管理:資金調達コスト込みでポジション時間を最適化。
- テスト:モックに price noise generator を追加し、挙動を自動検証。
- Adaptive Spread Entry:市場ボラに応じて
4-4. 設定バリデーション(★☆☆)
- 狙い:新環境セットアップ時の「env が足りなくて起動エラー」をゼロに。
- 実装案
- 起動直後に
pydantic.ValidationError
で必須キーをチェック。 - チェック結果をカラー表示し、欠損があれば即終了。
- ユニットテストに “env 欠落パターン” を追加して回帰防止。
- 起動直後に
5. まとめ
今回のアップデートで、「壊さず早く回す」 基盤が整いました。
次は実ネットでの 24 時間観測とダッシュボード可視化に挑みます。
今後もアップデートを追っていただけると嬉しいです!