前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
前回(#212)では Loguru × Makefile で WARN だけをリアルタイム監視 する方法を紹介しました。
今回はその続きとして 「まず安全」 を徹底するために入れた ミニ改善 と、実際に テストネットを 20 サイクル回してみた結果_ をまとめます。
🎯 対象読者
- VS Code & Docker で Python を書き始めたばかりの方
- 「まず動く」「まず安全」に興味がある仮想通貨 Bot 初学者
目次
- この記事で学べること
Makefile
改造──任意パラメータを一発で切替- DD(ドローダウン)ガード & Slack 通知を安全装備
- テストネット 20 周の実測レポート
- “見落としがち” 追加チェックリスト
- 今日の学び・まとめ
1. この記事で学べること
トピック | ざっくり一言 |
---|---|
make run を1 行で自由にチューニング | make run LOT=0.001 MAX_NOTIONAL_USD=50 … |
DD ガード + Slack で“即死”を回避 | 実損 + 未実損を監視し、閾値で自動停止 |
Slack ノイズを減らす Tips | SLACK_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_*.json
は envsubst で注入。
プライベートキー・URL をリポジトリに 書かない 方針です。
4. テストネット 20 周の実測レポート
指標 | 値 |
---|---|
サイクル数 | 20 |
Lot | 0.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.py で pandas 集計→Markdown 出力 |
6. 今日の学び・まとめ
学び | 初心者に刺さる要点 |
---|---|
パラメータは Makefile に集約 | “1 行実行” = 試行回数 が増える |
DD ガードは実損 + 未実損の合算で | 含み損を見逃さない |
Webhook は環境変数で注入 | 秘密情報をレポに 残さない文化 |
小さな commit × 多い push | リカバリが秒で終わる |
Slack は LEVEL ごとに分流 | “静かな成功” と “響く失敗” を分ける |
次の一歩(Tomorrow’s To-Do)
- pytest 導入 → 緑ランプが 0 件でもまず回る状態を作る
- GitHub Actions で
pytest + gitleaks
自動スキャン - README に Quick Start(10 行)を追記
- tools/agg.py 雛形コミット → 実弾前に PnL 分布を可視化
- 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 |
Loguru | import logging_setup 1 行で高機能ログが使える軽量ライブラリ。Better Stack |
tail -F | ファイルの末尾を“追尾”表示。ローテーションで名前が変わっても付いて行く Fオプションが肝。Super User |
Webhook | URL へ 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 ― 安全装備の心臓部
仕組み
- Bybit API
/v5/position/list
で未実現損益(unrealised PnL)を取得。bybit-exchange.github.io - 累積確定損益と足し算。「-20 USDT を超えたら abort」という if。
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 |
最大 DD | 0.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️⃣ 今日の学び
- パラメータは Makefile ─ コピペ・手打ちミスが激減。
- DD ガードは“実損+含み損”で評価 ─ 見かけプラスでも爆死を防ぐ。
- Webhook URL は環境変数で注入 ─ レポに秘密を残さない文化。
- 小さなコミットを多数 ─
git revert
で秒ロールバック。 - 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