前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
はじめに
この記事では、Bot(プログラム)がSlackに送っている「Total PnL(累積損益)」が更新されず、いつも同じ数字のまま止まってしまう問題について、プログラミング初心者の方にもわかりやすく解説します。専門用語は都度説明を入れていますので、安心して読み進めてください。
1. 用語の説明
- Bot:取引を自動で行うプログラムのこと。
- Cycle(サイクル):Botが「買い→売り」を一回行う一連の流れ。
- PnL(Profit and Loss):利益と損失。プラスなら利益、マイナスなら損失を表す数字。
- Cycle PnL:1サイクル分だけの損益。
- Total PnL:これまでのすべてのサイクルを合計した累積損益。
- 変数:プログラムの中でデータを一時的に保存しておく「箱」のようなもの。
- ループ:同じ処理を何度も繰り返す仕組み。
2. 問題の現象:何が起きている?
- Botを動かすと、1回ごとのCycle PnLはちゃんと更新される。
- しかしSlackに出力されるTotal PnLは、ずっと「–0.0130」のまま増えない。
→ 表示された数字だけを見ると「プログラムが計算をミスしている?」と勘違いしがちですが、実は「累積用の変数をループごとに更新していない」だけです。
3. 原因をかんたんにイメージしよう
- プログラムの最初に「累積用の変数(
total_pnl
)に一度だけ計算結果を入れる」 - その後、ループ(繰り返し処理)の中で変数を増やしていないので、ずっと同じ数字が使われ続ける
→ まるで「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. 確認方法と再発防止のポイント
- 少しだけテスト
- まずは2~3サイクルだけ回して、Slackに出るTotal PnLが変化するか確認しましょう。
- ログ(記録)もチェック
- 端末(ターミナル)に出るログとSlackの数字が一致すればOK。
- 「変数の初期化忘れ」「ループでの更新漏れ」に注意
- 初心者がはまりやすいミスなので、コードを書くときは
- 変数は必ず使う前に初期値をセット
- 繰り返しの中で更新が必要な変数は漏れなく書く
と意識しましょう。
- 初心者がはまりやすいミスなので、コードを書くときは
6. まとめ
- 問題点:累積損益をためる変数がループで更新されていなかった
- 解決策:「
total_pnl += pnl
」をループ内に追加するだけ! - 初心者向けポイント:
- 変数は使う前に初期化
- ループで変化させたいデータは必ず中で更新
これで、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時間動かすのではなく、まずは2〜3サイクル動かしてみる。 - Slackやログの数字を比較する
画面に出てる数字が、思ってた通りに動いてるか確認するクセをつけましょう。 - コードを声に出して読む(おすすめ!)
「total_pnlにpnlを足す…って書いてる?いや書いてないじゃん!」
こんなふうに、**“読んで説明できるか”**が見落とし防止に効きます。
エラーって、実は「ミス」じゃなくて「ヒント」なんです。
見落としに気づける目を養っていきましょう。
というわけで、今回は
SlackのTotal PnLが更新されない理由と、1行で直す方法について解説しました。
あなたのBotでも似たような現象が起きていたら、ぜひコードを見直してみてください。
それでは、次回の開発ログもお楽しみに!
よだかでした。