前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
対象読者
- Bybit で “まずは 0.1 USDT/回の実弾” を試したい個人開発者
.env
とMakefile
で「公開しない設定ファイル」を安全に回す方法を知りたい人- ログを tail しながら“何も起こらない”を確認する運用フローを学びたい人
1. この記事で得られるもの
トピック | 一行まとめ |
---|---|
env 分離の最終形 | .env.prod / .env.test + config_mainnet.tpl で誤発注ゼロへ |
Makefile 自動生成 | make mainnet-loop で config_mainnet.json を envsubst → Docker 起動までワンショット |
Mainnet ミニマム回し | lot=0.0001 BTC, DD=10 USD, 無限ループで 24 h 放置 |
WARN だけリアルタイム監視 | make logs-warn を別タブで tail -F |
“Fill しない” の原因調査 | スプレッド/閾値/手数料を CLI 1 行で可視化&納得感 |
2. 本日の作業ログ
2-1. シークレットを env → tpl → json へ流す一本線
# 1) .env.prod に MAINNET キーだけ保管 BYBIT_KEY_MAIN=xxxxxxxx BYBIT_SECRET_MAIN=xxxxxxxx MAX_NOTIONAL_USD=50 LOT=0.0001 # ほか Slack URL 等… # 2) テンプレ (config_mainnet.tpl) には ${VAR} を書く { "bybit": { "apiKey": "${BYBIT_KEY_MAIN}", "secret": "${BYBIT_SECRET_MAIN}" }, "bot": { "max_notional": ${MAX_NOTIONAL_USD}, "lot": ${LOT}, ... } } # 3) Makefile で自動生成 ➜ Docker コンテナへ渡す make mainnet-loop ENV=.env.prod
ポイント
- 生成した
config_mainnet.json
には秘密キーが平文で入る。必ず.gitignore
。rm -f config_mainnet.json
後に再生成 → “古いキーが残る事故” を防止。
2-2. Mainnet 最小ロットで 24 h 監視フロー
ターミナル | コマンド | 役割 |
---|---|---|
A | make mainnet-loop S_ENTRY=1e-6 | Bot 本体(Docker) |
B | make logs-warn | logs/warn.log を tail -F |
C | `watch -n 60 'curl …orderbook… | jq'` |
- lot: 0.0001 BTC
- DD ガード: 10 USD
- max_notional: 50 USD
- 結果: 現在まで Fill 0、DD 0 — “静かな成功”
Why Quiet?
- ask-bid スプレッドが 0.1 bps しか開かず、
S_ENTRY=1bps (1e-6)
を超えなかった。- Bot が“何もしない”=想定どおり。間違って高値掴みするより 100 倍安全。
3. つまずき & 解決メモ
つまずき | 原因 | 解決 |
---|---|---|
envsubst 後に ${…} が残る | .env.prod に変数が未定義 | .env.prod に BYBIT_KEY_MAIN 等を追加 |
JSONDecodeError | config_mainnet.tpl 内の数値を Quote していた | ${MAX_NOTIONAL_USD} など 数値は裸に修正 |
TypeError: '>' not supported between float & str | MAX_NOTIONAL_USD が文字列 | float(env or cfg) へキャスト、テストコード追加 |
Fill が来ない | スプレッド激狭 | curl+jq 一行コマンドで即計測、S_ENTRY を再考 |
4. 今日の学び 🎓
学び | 初学者への刺さるポイント |
---|---|
“何もしない”もテスト | Mainnet 1 bps 条件で Fill 0 = 手数料負けしない安全証明 |
tpl → json パイプライン | envsubst 前後で jq を挟めばバグは 90 % 消える |
WARN だけ tail | 成功ログは黙らせ、異常だけ即 Slack & 端末に集約 |
Spread 可視化ワンライナー | ```bash curl -s 'https://api.bybit.com/v5/market/orderbook?category=linear&symbol=BTCUSDT' | jq -r '.result | (.a[0][0] |
5. 次の To-Do(優先順)
- 自動スプレッドログ
orderbook.1
の ask-bid を 10 秒ごとに DB へ → 可視化準備
- pytest + gitleaks CI
- env キャスト & JSON 生成テストを GitHub Actions に固定
- DD ガード閾値の昼夜切替
- 00:00 UTC で
daily_loss_cap
をリセット
- 00:00 UTC で
- tools/agg.py で 24 h PnL グラフ
- 1 行
python tools/agg.py
→ Markdown 出力
- 1 行
- パラメータ sweep
- Actions matrix で
S_ENTRY
&LOT
を自動検証(Testnet)
- Actions matrix で
6. botter スコア (by GPTo3)
項目 | 配点 | 評価 |
---|---|---|
問題切り分け力 | 30 | 26 – 401 / TypeError を即特定 |
自動化・再現性 | 20 | 15 – Makefile ◎、CI は雛形のみ |
リスク管理視点 | 20 | 17 – DD guard & MAX_NOTIONAL を実戦投入 |
ドキュメント整備 | 15 | 10 – README とコードコメントを随時更新 |
開発ペース & 共有 | 15 | 14 – Slack / Chat で高頻度共有 |
総合 = 82 / 100
80+ =「実弾長期運用ライン」突破
CI 緑化と PnL 可視化が完了すれば 90 点台が見えてきます。
7. まとめ
「静かな成功」を検証する日
今日は Fill 0 でも OK。‐ リスクを最小に絞った Mainnet 運用が 問題なく 6 h 以上走る ことを確認できました。今後はスプレッド/ボリュームに応じてダイナミックに S_ENTRY を調節するロジックを足しつつ、CI と可視化を整えて “寝ていても見える” ボットへ育てていきます。
この記事は学習目的の技術ログです。
コード断片は MIT License で公開、利用は自己責任で!