Bot mmnot Tips 開発ログ

🛠️開発記録#209(2025/5/)MMbot開発ログ15「SlackのTotal PnLが更新されない原因と1行で直す即効修正ガイド」

2025年5月4日

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

はじめに
この記事では、Bot(プログラム)がSlackに送っている「Total PnL(累積損益)」が更新されず、いつも同じ数字のまま止まってしまう問題について、プログラミング初心者の方にもわかりやすく解説します。専門用語は都度説明を入れていますので、安心して読み進めてください。


1. 用語の説明

  • Bot:取引を自動で行うプログラムのこと。
  • Cycle(サイクル):Botが「買い→売り」を一回行う一連の流れ。
  • PnL(Profit and Loss):利益と損失。プラスなら利益、マイナスなら損失を表す数字。
    • Cycle PnL:1サイクル分だけの損益。
    • Total PnL:これまでのすべてのサイクルを合計した累積損益。
  • 変数:プログラムの中でデータを一時的に保存しておく「箱」のようなもの。
  • ループ:同じ処理を何度も繰り返す仕組み。

2. 問題の現象:何が起きている?

  1. Botを動かすと、1回ごとのCycle PnLはちゃんと更新される。
  2. しかしSlackに出力されるTotal PnLは、ずっと「–0.0130」のまま増えない。

→ 表示された数字だけを見ると「プログラムが計算をミスしている?」と勘違いしがちですが、実は「累積用の変数をループごとに更新していない」だけです。


3. 原因をかんたんにイメージしよう

  1. プログラムの最初に「累積用の変数(total_pnl)に一度だけ計算結果を入れる」
  2. その後、ループ(繰り返し処理)の中で変数を増やしていないので、ずっと同じ数字が使われ続ける

→ まるで「1日目の貯金額を出したあと、2日目以降の貯金を足し算し忘れている」ような状態です。


4. 解決方法:たった1行の追加!

ループ前に初期値を用意

total_pnl = 0   # ← まず0(ゼロ)で初期化しておく

ループの中で少しずつ足し算する

 for ... in ...:  
     pnl = calc_pnl(...)    # 1サイクル分の損益を計算する  
+    total_pnl += pnl        # ← ここで「累積=累積 + 今回の損益」を実行  
     await notify_slack(  
         f"Cycle PnL {pnl:+.4f}\nTotal PnL {total_pnl:+.4f}"  
     )
  • total_pnl += pnl は「total_pnl = total_pnl + pnl」と同じ意味です。
  • これで、1サイクルごとに累積損益が正しく増えていきます。

5. 確認方法と再発防止のポイント

  1. 少しだけテスト
    • まずは2~3サイクルだけ回して、Slackに出るTotal PnLが変化するか確認しましょう。
  2. ログ(記録)もチェック
    • 端末(ターミナル)に出るログとSlackの数字が一致すればOK。
  3. 「変数の初期化忘れ」「ループでの更新漏れ」に注意
    • 初心者がはまりやすいミスなので、コードを書くときは
      • 変数は必ず使う前に初期値をセット
      • 繰り返しの中で更新が必要な変数は漏れなく書く
        と意識しましょう。

6. まとめ

  • 問題点:累積損益をためる変数がループで更新されていなかった
  • 解決策:「total_pnl += pnl」をループ内に追加するだけ!
  • 初心者向けポイント
    1. 変数は使う前に初期化
    2. ループで変化させたいデータは必ず中で更新

これで、Botのテスト中にSlackに出るTotal PnLも正しく増えていくようになります。ぜひ、ご自身のコードにこの変更を入れて動作を確認してみてくださいね!

👇ラジオで話したこと

SlackのTotal PnLが更新されない原因と即効修正ガイド

こんにちは、よだかです。

今日は、仮想通貨Botを開発していて遭遇したある“地味だけど重要”なバグについてお話ししていきます。

タイトルはズバリ──
**「SlackのTotal PnLが更新されない原因と、1行で直す即効修正ガイド」**です。

初心者の方にも分かるよう、専門用語もかみくだいて説明しますので、開発を始めたばかりの方も安心して聴いてくださいね。


まず、今回の話を一言でいうと…
**「変数をループの中で更新し忘れただけで、Botが“損してるように見えた”」**というお話です。

でも、こういう小さな見落としって、実はめちゃくちゃ多い。
「ちゃんと書いてるつもりなのに、動かない」──この経験、あるんじゃないでしょうか?


🧾【セクション1:用語の説明】

今回出てくるキーワードを、まずは一緒に確認しておきましょう。

  • Bot:取引を自動で行うプログラム。
  • Cycle(サイクル):Botが「買って売る」までの1セット。
  • PnL(Profit and Loss):利益と損失。+なら利益、-なら損失。
  • Cycle PnL:1サイクルごとの損益。
  • Total PnL:これまでの全部を合計した損益。
  • 変数:データを一時的に保存しておく「箱」。
  • ループ:同じ処理を何度も繰り返す仕組み。

これだけ押さえておけば、話の流れについてこれます。


🕵️‍♂️【セクション2:何が起きたか?】

Botを動かしてみると──
Cycle PnLはちゃんと更新されてるんです。
つまり、1回1回の取引ごとの損益は、Slackに表示されてる。

でも……
Total PnLが、ずーっと「–0.0130」のまま変わらない。

これ、一見すると「計算バグか?」と思うんですが、実は違うんです。
ループの中で、Total PnLを更新してなかっただけ。


🧠【セクション3:イメージで理解しよう】

これ、イメージするとこうなります。

最初に「Total PnLは–0.0130です」と計算。
でも、そのあと「今日の損益」を一切足し算してない。

たとえるなら、
**「初日の貯金だけを記録して、2日目以降の入金をずっと忘れている」**感じ。

これでは当然、いつまでたっても同じ数字のまま。


🔧【セクション4:たった1行で直る】

解決方法はとってもシンプル。たったの1行追加するだけです。

total_pnl = 0  # 初期化

for ... in ...:
    pnl = calc_pnl(...)
    total_pnl += pnl  # ← ここが超大事!
    await notify_slack(f"Cycle PnL {pnl:+.4f}\nTotal PnL {total_pnl:+.4f}")

この total_pnl += pnl という1行がないと、何回ループしても最初の値のまま。

ちなみにこの式、初心者向けに言うと:

  • total_pnl += pnl は、
  • total_pnl = total_pnl + pnl とまったく同じ意味です。

🧪【セクション5:テストと再発防止】

修正したら、まずは少しだけテストしてみましょう。
2〜3サイクルだけ回して、Slackに出るTotal PnLがちゃんと変わるか確認。

あとは、ログ(ターミナルに出るメッセージ)とSlackの数字が一致しているかを見る。

そして、再発防止のためのポイントは2つ。

  • 変数は必ず使う前に初期化!
  • ループの中で変化させるなら、ちゃんと更新処理を書く!

どちらも初心者がよくハマるポイントなので、ぜひ意識して書いてみてください。

🔍【セクション補足1:変数の初期化ってなに?】

ところで、「変数の初期化って何?」という方もいらっしゃると思います。

これは簡単に言うと、
「この変数は、最初にこういう値を持たせておきますよ」と宣言すること。

たとえば、

total_pnl = 0

という一文は、「total_pnlという箱には、最初に0を入れておくよ」という意味。

初期化を忘れてしまうと、中身が空っぽのまま処理が進んだり、エラーになったりします。
特にPythonでは、使う前に「変数の存在を知らせる」必要があるんです。

初心者の方は、「変数を作ったらまず中身を入れる」くらいに覚えておくといいですね。


🧩【セクション6:まとめ】

今回のエラーの原因と解決法をまとめます。

  • 原因:累積損益(Total PnL)を更新していなかった
  • 対処:ループの中に total_pnl += pnl を入れるだけ

初心者へのメッセージとして、最後にこれだけは伝えておきたい。

エラーの多くは、「知らない」より「見落としてる」が原因です。

だからこそ、地道なログの確認、1つずつの動作の把握、こうした“見直し作業”が本当に大切です。

🛡️【セクション補足2:エラーの見落としを防ぐには?】

じゃあ、こういう見落としを防ぐにはどうしたらいいか?

ポイントは次の3つです。

  1. 小さく回してテストする
     いきなり1時間動かすのではなく、まずは2〜3サイクル動かしてみる。
  2. Slackやログの数字を比較する
     画面に出てる数字が、思ってた通りに動いてるか確認するクセをつけましょう。
  3. コードを声に出して読む(おすすめ!)
     「total_pnlにpnlを足す…って書いてる?いや書いてないじゃん!」
     こんなふうに、**“読んで説明できるか”**が見落とし防止に効きます。

エラーって、実は「ミス」じゃなくて「ヒント」なんです。
見落としに気づける目を養っていきましょう。


というわけで、今回は
SlackのTotal PnLが更新されない理由と、1行で直す方法について解説しました。

あなたのBotでも似たような現象が起きていたら、ぜひコードを見直してみてください。

それでは、次回の開発ログもお楽しみに!
よだかでした。

-Bot, mmnot, Tips, 開発ログ