前回の記事に引き続き、今回も仮想通貨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も正しく増えていくようになります。ぜひ、ご自身のコードにこの変更を入れて動作を確認してみてくださいね!