Bot mmnot Tips 開発ログ

🛠️開発記録#214(2025/5/8)MMBot 開発ログ 19「Slack × DD ガードで“事故らない”テストネット 20 周回」

2025年5月8日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

前回(#212)では Loguru × MakefileWARN だけをリアルタイム監視 する方法を紹介しました。
今回はその続きとして 「まず安全」 を徹底するために入れた ミニ改善 と、実際に テストネットを 20 サイクル回してみた結果_ をまとめます。


🎯 対象読者

  • VS Code & Docker で Python を書き始めたばかりの方
  • 「まず動く」「まず安全」に興味がある仮想通貨 Bot 初学者

目次

  1. この記事で学べること
  2. Makefile 改造──任意パラメータを一発で切替
  3. DD(ドローダウン)ガード & Slack 通知を安全装備
  4. テストネット 20 周の実測レポート
  5. “見落としがち” 追加チェックリスト
  6. 今日の学び・まとめ

1. この記事で学べること

トピックざっくり一言
make run1 行で自由にチューニングmake run LOT=0.001 MAX_NOTIONAL_USD=50 …
DD ガード + Slack で“即死”を回避実損 + 未実損を監視し、閾値で自動停止
Slack ノイズを減らす TipsSLACK_LEVEL 変数で WARN をミュート
テストネット 20 サイクルのリアルデータ+1.757 USDT、DD -0.00 USDT で完走
実弾前に仕込むと安心な 5 つの保険Checklist 付き

2. Makefile 改造──任意パラメータを一発で切替

# 抜粋
run: $(CONFIG)
	set -a && source $(ENV) && set +a && \
	docker compose run --rm --entrypoint "" $(SERVICE) \
	  python -m MMbotbybit.MMbotbybit \
	  --mode $(MMBOT_MODE) \
	  --config /app/$(CONFIG) \
	  --s_entry $(S_ENTRY) \
	  --max_loss_usd $(LOSS) \
	  --lot $(LOT) \
	  --max_cycles $(CYCLES) \
	  --timeout $(TIMEOUT)
  • ポイント
    • TIMEOUT, LOSS, MAX_NOTIONAL_USD など、後ろに = を付けるだけで変更可能
    • make run ENV=.env.test LOT=0.001 LOSS=20 MAX_NOTIONAL_USD=50 のように 1 行実行

3. DD ガード & Slack 通知を安全装備

3-1. Code Diff(概念)

# ─ new: get_unreal_pnl()
if realised + unreal <= -max_loss_usd:
    logger.error("DD guard hit → exit")
    await notify_slack(":fire: DD guard hit", ...)
    return
  • 実現損益 + 未実現損益 を常時計算
  • 閾値を超えたら 注文を全 cancel → ループ停止 → Slack 通知

3-2. Slack でこう見える

:fire: *MMBot* DD guard hit
Realised +0.0000   Unreal -9.5648

※ Webhook URL は .env.* に置き、config_*.jsonenvsubst で注入。
プライベートキー・URL をリポジトリに 書かない 方針です。


4. テストネット 20 周の実測レポート

指標
サイクル数20
Lot0.001 BTC
Spread 条件0.000001 (= 0.1 bps)
DD ガード-20 USDT
所要時間~56 min
累計 PnL+1.757 USDT
最大 DD-0.00 USDT (Guard未発火)

ログ全量は logs/mm_bot_*.log、DB は mmtrades_testnet.db に保存。
tools/agg.py(次節)で CSV → グラフ化予定。


5. “見落としがち” 追加チェックリスト

✅ チェックなぜ必要?具体アクション
Testnet / Mainnet 切替を完全分離誤発注保険ENV ?= .env.test をデフォ、make mainnet-loop のみに .env.prod
Slack ノイズ制御夜中の通知嵐防止SLACK_LEVEL=ERROR で WARNING を黙らせる
残高上限 Guard急変相場で破産を防ぐget_wallet_balance < reserve → 即 Exit
DB / ログ回転ストレージ枯渇防止loguru rotation 済→ DB を日次 VACUUM
集計スクリプト事後検証を 5 分に短縮tools/agg.pypandas 集計→Markdown 出力

6. 今日の学び・まとめ

学び初心者に刺さる要点
パラメータは Makefile に集約“1 行実行” = 試行回数 が増える
DD ガードは実損 + 未実損の合算で含み損を見逃さない
Webhook は環境変数で注入秘密情報をレポに 残さない文化
小さな commit × 多い pushリカバリが秒で終わる
Slack は LEVEL ごとに分流“静かな成功” と “響く失敗” を分ける

次の一歩(Tomorrow’s To-Do)

  1. pytest 導入 → 緑ランプが 0 件でもまず回る状態を作る
  2. GitHub Actionspytest + gitleaks 自動スキャン
  3. README に Quick Start(10 行)を追記
  4. tools/agg.py 雛形コミット → 実弾前に PnL 分布を可視化
  5. Mainnet ミニマム運用 (lot=0.0001, loss=10 USD, cycles=10)を 24 h 回す

「まず安全・まず可視化」——小さな保険を積み上げれば、
深夜 3 時に鳴るスマホ通知も“想定内”になります。
みなさんも DD ガード + Slack を 10 行でいいので試してみてください! 🚀


この記事は自分用ログを兼ねた学習アウトプットです。
サンプルコードは MIT License で公開、利用は自己責任で!

👇ラジオで話したこと

きょうの放送は “事故らないテスト運用” がテーマ。
まず全体像をさっと──Makefile のパラメータ上書きで「1 行チューニング」→ DD(ドローダウン)ガードと Slack 通知で“即死”ブレーキ→ 20 周テストの数字を公開──という流れでお送りします。途中 tail -F や Webhook って何?など初歩キーワードもかみ砕いて入れていきます。


0️⃣ ウォームアップ ─ 用語を 30 秒で

用語超ざっくり
DD(ドローダウン)口座残高が「ピーク→谷」で減った幅。投資の体力測定値。Investopedia
Makefile「どうビルド/実行するか」を書いた台本。後ろで VAR=値 を付けると上書きできる(?= 演算子も)Stack Overflow
Loguruimport logging_setup 1 行で高機能ログが使える軽量ライブラリ。Better Stack
tail -Fファイルの末尾を“追尾”表示。ローテーションで名前が変わっても付いて行く Fオプションが肝。Super User
WebhookURL へ POST するだけで Slack 等に通知を飛ばせる仕組み。Python なら slack_sdk.webhook.WebhookClient が楽。Slack開発者ツール

1️⃣ Makefile を“パラメータスイッチ”化

1 行実行デモ

make run ENV=.env.test LOT=0.001 LOSS=20 MAX_NOTIONAL_USD=50
  • ENV=.env.testテストネット用の鍵セットを読み込み
  • LOT=0.001 は最小ロット
  • どの変数も Makefile 側は ?= でデフォルト、コマンド行は後勝ち

変数を即上書きできるから“仮説→実行→数字確認”のサイクルが爆速になります。Stack Overflow


2️⃣ DD ガード × Slack ― 安全装備の心臓部

仕組み

  1. Bybit API /v5/position/list で未実現損益(unrealised PnL)を取得。bybit-exchange.github.io
  2. 累積確定損益と足し算。「-20 USDT を超えたら abort」という if。
  3. await notify_slack(":fire: DD guard hit …") ─ Slack Webhook が火を吹く。

Slack に出るメッセージ例 ↓

🔥 MMBot DD guard hit
Realised +0.0000   Unreal -9.5648

URL は .env に隠し、envsubst で config に注入──鍵は絶対コミットしないのが鉄則。Slack開発者ツール


3️⃣ テストネット 20 周実走レポート

指標
サイクル数20
ロット0.001 BTC
スプレッド条件0.1 bps
DD ガード-20 USDT
所要時間約 56 分
累計 PnL+1.757 USDT
最大 DD0.00 USDT(ガード未発火)
  • Testnet と Mainnet の完全分離は超重要。テストネットは板が薄く、約定仕様も違う──でも“通信・ロジック健全性”はここでしか安全に確かめられない。Trust Wallet
  • 全ログは logs/mm_bot_*.log、DB は mmtrades_testnet.db。日次で VACUUM を回してサイズを圧縮。Stack Overflow

4️⃣ “見落としがち” チェックリスト

✅ チェックねらい1 行アクション
Test vs Main 完全分離誤発注防止ENV ?= .env.test をデフォルトに
Slack ノイズ制御睡眠妨害回避SLACK_LEVEL=ERROR で WARN ミュート
残高上限 Guard破産防止if balance < reserve: exit()
DB / ログ回転ディスク枯渇防止Loguru rotation+VACUUM 日次
集計スクリプト後検証 5 分化tools/agg.py > report.md

5️⃣ 今日の学び

  1. パラメータは Makefile ─ コピペ・手打ちミスが激減。
  2. DD ガードは“実損+含み損”で評価 ─ 見かけプラスでも爆死を防ぐ。
  3. Webhook URL は環境変数で注入 ─ レポに秘密を残さない文化。
  4. 小さなコミットを多数git revert で秒ロールバック。
  5. Slack はレベル別チャンネル分流 ─ “静かな成功”と“響く失敗”を分ける。

6️⃣ 次の一歩

  • pytest を入れて「テスト 0 件でもグリーン」な土台をまず作る。
  • GitHub Actions + gitleaks で「push した瞬間キー混入チェック」。GitHub
  • tools/agg.py に pandas 集計を仕込み、PnL 分布を可視化。
  • Mainnet ミニマム(lot 0.0001)で 24 h 放置テスト。

7️⃣ wrap-up(番組締め)

“まず安全・まず可視化”──DD ガードと Slack が 10 行で組めると、
深夜 3 時にスマホが鳴っても「はい想定内」と言えるメンタルシールドが手に入ります。

次回は pytest 自動テスト × GitHub Actions で “壊さない開発ループ” を作り込む予定です。
また次回の放送でお会いしましょう。よだかでした。

おまけ:"分かっていそうで分かっていない用語"解説

① Makefile まわり

用語読み⾳意味 & ひとこと
VAR=値ばー・いこーる・あたいシェル変数の一時設定PORT=8080 python app.py のようにコマンド行だけ上書きできる。GeeksforGeeks
?=はてな・いこーる**「値が未設定なら代入」**という GNU make の演算子。環境変数やコマンド行で渡されたものが優先=“後勝ち”。GNUStack Overflow
“デフォルトは ?=Makefile側は LOT ?= 0.001 と書き標準値を用意→ LOT=0.003 make run で即差し替え可。
「コマンド行は後勝ち」こうまんど‐ぎょう…変数の優先順位ルール:①明示した環境変数 > ②コマンド行 > ③Makefile本体 > ④?= デフォルト。Stack Overflow

② ログ監視小技

用語読み⾳ひとこと
tail -Fている・だっしゅ・えふ**ファイル末尾を“Follow”**し続ける。-F は Logrotate などでファイル名が変わっても追従。Super User
Fオプションえふ・おぷしょん上と同じ。“Follow by name”。-f は inode 追跡 / -F は名前追跡+リトライ。
LoguruろぐるPython の高機能ロガーlogger.add(file, level="WARNING") 1 行で warn.log 切り出し。GNU
warn.log / debug.logうぉーん・ろぐ / でばっぐ・ろぐレベル別ファイル:warn.log は WARNING↑の要注意、debug.log は開発時の詳細トレース。

③ 環境変数とテンプレ

用語読み⾳ひとこと
envsubstえんぶさぶすとテキスト中の $VAR を実際の環境変数に置換するコマンド。Docker で config を量産するとき定番。Baeldung
環境変数庫 (Secrets Store)しーくれっつ・すとあGitHub Secrets など暗号保存の鍵置き場。YAML で secrets.API_KEY と呼び出す。

④ SQLite & ディスク

用語読み⾳ひとこと
VACUUMばきゅーむSQLite のファイル再編成コマンド。不要領域を詰めてサイズ縮小=「ディスク枯渇」防止。SQLite
ディスク枯渇でぃすく‐こかつログや DB が膨張→ 容量ゼロ で Bot 停止。Logrotate / VACUUM で回避。Support Portal

⑤ Git & セキュリティ

用語読み⾳ひとこと
git revertぎっと・りばーと“悪いコミットを逆向きに1個作って取り消す” 安全な巻き戻し。履歴は残る。Git
キー混入スキャナきー‐こんにゅう…gitleaks などで APIキーを含むパターンを自動検出。CI に挟んで防御。Jit

MEMO

  • MAX_NOTIONAL_USD など巨大数値をコマンド行で変えるときは "MAX_NOTIONAL_USD=50" のようにクォート不要。
  • VAR=value のシェル書式は「そのコマンドの実行環境だけに一時設定」。export とは別。GeeksforGeeks

-Bot, mmnot, Tips, 開発ログ