前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
**この記事は “自宅 PC × Docker Compose × Python‐bot” を初めて回し始めたときに私が **“ハマって → 抜け出した” トラブル集 です。
同じ所ではまった未来の自分&読者さんのために、
- 何が起きた?(症状)
- なぜ?(原因)
- どう直した?(応急処置)
- 次は迷わないコツ(再発防止)
をまとめました。
※ API キーや Slack URL など “秘密情報” は すべて伏せ字 にしてあります。
1. config_mainnet.json
が「フォルダ扱い」になって読めない
内容 | |
---|---|
症状 | コンテナ内で cat /app/config_mainnet.json → Is a directory と怒られる |
原因 | ホスト側に 同じ名前のディレクトリ を作ってしまい、 Docker が “ディレクトリ over ファイル” でマウントした |
応急処置 | bash mv config_mainnet.json config_mainnet_backup_dir → 改めて JSON ファイルを作成 |
もう迷わない | コマンドを習慣に:ls -ld config_mainnet.json → 先頭が -rw ならファイル、drw ならフォルダ |
2. --profile
オプションが効かない
内容 | |
---|---|
症状 | unknown flag: --profile |
原因 | Docker Compose v2 はdocker compose --profile live up -d の順番じゃないと読んでくれない |
応急処置 | コマンドを並び替え |
もう迷わない | bash alias dcu='docker compose --profile live up -d' |
3. ソースを書き換えても古いコードが動く(.pyc
の罠)
内容 | |
---|---|
症状 | 直したはずのバグがコンテナ内で再現… |
原因 | Python は先に .pyc を読む。タイムスタンプが古いと新ファイルを無視することも |
応急処置 | bash find . -name '*.pyc' -delete touch *.py で更新時間を前に出す |
もう迷わない | 開発中は環境変数 PYTHONDONTWRITEBYTECODE=1 に。.dockerignore に __pycache__/ を追加 |
4. from __future__ import annotations
なのに SyntaxError
内容 | |
---|---|
症状 | 「future import はファイル冒頭に置け」と怒られる |
原因 | #!/usr/bin/env… と docstring の さらに後ろ に書いていた |
応急処置 | docstring の直後 に移動 |
もう迷わない | VS Code / PyCharm の Linter を有効化(位置ズレで即警告) |
5. envsubst
で作るはずの設定ファイルが空
内容 | |
---|---|
症状 | /app/config_mainnet.json が 0 byte |
原因 | 同じパスを volume マウントすると、 生成された直後にホストの空ファイルで上書き |
応急処置 | テンプレートは /tmp/config.tpl として 読み取り専用 でマウントし、entrypoint で /app/config_mainnet.json を生成 |
黄金パターン | ```yaml |
volumes: | ./config.tpl:/run/config.tpl:ro entrypoint: > /bin/sh -c " envsubst < /run/config.tpl > /app/config_mainnet.json && exec python … "``` | |
6. Bybit エラー retCode 110007 (InsufficientAB)
内容 | |
---|---|
症状 | 注文が弾かれ “証拠金不足” メッセージ |
原因 | MAX_NOTIONAL_USD を超えるロット/レバが低すぎ |
応急処置 | ロットを半分 (0.0005 ) にし、環境変数 DEFAULT_LEVERAGE=10 を設定 |
もう迷わない | 注文前に “余力 API” を叩いてログ出力 → 門前払い するコードを仕込む |
7. Slack 通知が毎回 “Cancel” になる
内容 | |
---|---|
症状 | 取引所では約定しているのに Slack では全部 Cancel |
原因 | 約定チェックを Order List REST でポーリング。 実際の Fill は Execution WebSocket で流れてくる |
応急処置 | 現在 WS 版に書き換え中(TODO) |
もう迷わない | 原則: 「口座残高が動くイベント=WebSocketで即時検知」 |
迷ったら使う“5 ステップ”デバッグ
- 1.症状の種類をラベル付け(ビルド?ランタイム?API?)
- 2.最小再現を 1 コマンドに↓
docker compose exec mmbot python - <<'PY' # 20 行以下で症状を再現 PY
- 3.ログを絞る
docker compose logs -f mmbot | grep -E 'ERROR|retCode'
- 4.ホストとコンテナの差分を疑う
docker compose exec mmbot env | sort | head docker inspect mmbot-mmbot-1 --format '{{ json .Mounts }}'
- 5.1 問題 = 1 コミット / 1 メモ
Notion や Git の PR に “現象→原因→Fix” を残すと未来の自分が助かる
そもそもトラブルを減らす仕掛け
仕組み | 何が嬉しい? |
---|---|
CI で docker build && pytest | 変な import や空 JSON をプッシュ前に検知 |
.dockerignore を整理 | 古い .pyc や .env がイメージに混入しない |
Secrets Manager or .env ファイル | API キーをシェル履歴に残さない |
Makefile / bash alias | make up , make logs でタイプ量 1/3 |
Runbook | 「110007 が出たら余力チェック」など 判断を手順化 |
次の To Do
- Execution WS で約定検知 → Slack 完全同期
- DB に正しく保存 → PnL 計算ロジックをテスト
- パラメータ (lot / s_entry) チューニング
- GitHub Actions で CI 設定 → “壊しても怖くない” フローへ
このサイクルを回せば、ほとんどのトラブルは 「仕組みで未然防止 or 1 コマンドで再現&修正」 できるようになります。
それでは楽しい自動売買ライフを!🚀