2026-05-06(水)。XAUUSD専用化したPT101は live 投入から44時間で 192件決済 / -¥20,008 と最大の出血源になった。原因を forward-only BT で掘ったところ、シグナルではなく 決済(TRAIL_RATIO=0.75)の早すぎが主犯と判明。代替案として「BB3にTP、届かなければBB2、それも届かなければ90%戻り」の階層TPを実装、派生1 (MAGIC 10111/10112) として現行PT101と並走させてA/B検証を開始した。

この記事のポイント

  • 現行PT101 livetrail0.75 の AvgWin は +¥10 = スプレッド以下 → 構造的に勝てない
  • 104日 forward-only BT で決済バリアント9種比較、BB階層TP(PF 2.68 / AvgWin $2.72)が最良
  • 新ファイル pt101_bb.py、MAGIC 10111/10112(派生1 決済1)で実装
  • MAGIC命名規則を 101_X_Y = PT101_派生X_決済方法Y に確定
  • VPS ⇄ FX PC 完全同期+bot再起動、初エントリーまで確認(09:26 XAUUSD LONG @4603.17)

動機 — 現行PT101の何がダメだったか

5/4 朝に XAUUSD 専用化して投入した PT101(MAGIC 10101/10102)。44時間で 96エントリー、 192件決済の決算は次の通り:

項目数値所感
総決済192件96エントリー × 2スロット(TP1/SMA)
EXPERT 決済(トレール)182件大半がトレールで決済
SL ヒット10件ハードロス
EXPERT 平均損益+¥10〜+¥11/件🔴 スプレッド+手数料ですら賄えない
SL 平均損益-¥2,189〜2,192/件勝ち1件あたり 200倍の損失
合計損益-¥20,008口座最大の出血源

勝率は 39.6% で悪くない。問題は 勝ち額の絶望的な小ささ。AvgWin = +¥11 は 0.01 lot で計算すると約 0.7 pips。 TitanFX Blade の XAUUSD スプレッドは 1.8 pips、つまり 「たまに勝っても、損益分岐点に届いていない」

原因は決済ロジックの TRAIL_RATIO=0.75。「ピーク到達後 25% 戻ったらクローズ」という早利確で、BT上の AvgWin もMFEのわずか 8.28% しか確定していない(= ほぼピーク到達直後に逃げる)。 シグナル自体ではなく決済設計が破綻していた。

forward-only BT で決済バリアント9種を比較

過去 104日(2026-01-22〜2026-05-05)の XAUUSD M1/M5/H1 を MT5 から取得し、 look-ahead を一切排除した forward-only walk で 9 パターンの決済ロジックを比較。エントリーは PT101 と完全同一(H1 10MA向き + M5 10MA反発)、変えたのは決済だけ。

変種N勝率PFAvgWinAvgLossNetMaxDD
V0 trail0.75(現行)5,21187.2%10.37$1.80$1.18+$7,395-$124
V1c trail0.10(90%戻り)53943.4%23.79$3.54$0.11+$794-$2.5
V2b 固定TP RR=26944.9%1.66$144$71+$1,770-$869
V2d 固定TP RR=51338.5%3.22$428$83+$1,477-$283
V_BB 階層 (BB3>BB2>trail90)4,95042.5%2.68$2.72$0.75+$3,580-$98

表だけ見ると V0 の Net $7,395 が最大に見えるが、 AvgWin $1.80 はスプレッドコスト $0.18 にギリギリ勝てる程度で、live の現実約定では消える。実際 同期間(5/4 11:57〜5/5 22:44)の検証では BT V0 +$24 / Live actual -$66 の乖離があり、 「紙のPF」と確認できた。

BTがlive より楽観的になる理由: BT は M1 足単位の OHLC でしか peak/SL/trail を判定できない一方、 live は tick 単位で peak が更新され、より早く trail が発火する。さらに約定スリッページもBTにはない。 つまり AvgWin が小さい変種ほど live で目減りしやすい。 V0 のように AvgWin $1.80 は致命的に脆い。

採用 — BB階層TP(V_BB)

5/6 の決定:「BB3 にTP、届かなければBB2、それも届かなければ90%戻り」というユーザー指示の階層TPを採用。

決済優先度

  1. SL(最優先・固定 / 直近30本の安値±margin)
  2. BB2_RETEST(一度BB2σをタッチした後、戻ってきたら決済)
  3. BB3_TP(BB3σに到達したら決済)— エントリー時のスナップショットを MT5 TP として発注
  4. TRAIL90(ピークから 90%戻り = TRAIL_RATIO=0.10)— BB2未到達のフォールバック

決済理由ごとの寄与(104日 V_BB BT)

決済理由N全体%Net平均/件意味
BB3_TP57711.7%+$1,882+$3.26大当たり、最良ケース
BB2_RETEST1,21124.5%+$2,193+$1.81BB3に届かず戻りで利確
TRAIL903,13563.3%-$48-$0.02BB2未到達、ほぼ建値撤退
SL270.5%-$447-$16.56ハードロス(少ない)

面白いのは、利益の100%を BB2/BB3 経由(36%のトレード)から取り、 残り63%は TRAIL90 でほぼ建値撤退という構造になっていること。 つまり「打率は低いが、勝ったときだけしっかり取る」型に変質する。 これは PT002/PT005 のような固定TP系に思想が近い。

MAGIC命名規則の確定 — 101_X_Y

派生戦略を継続的に投入していく中で MAGIC番号体系を整理。 「101_派生番号_決済方法番号」に確定した。

MAGIC戦略備考
10101PT101 派生0 決済1(TP1スロット)現行 / TRAIL_RATIO=0.75
10102PT101 派生0 決済1(SMAスロット)現行 / EA管理のみ
10111PT101 派生1 決済1(TP1スロット)新規 / BB階層、MT5 TP=BB3
10112PT101 派生1 決済1(SMAスロット)新規 / BB階層、TP無
(将来)10121/10122PT101 派生1 決済2同じBB階層で別パラメータ
(将来)10211/10212PT101 派生2 決済1新シグナル変種+同決済
2ポジ運用について: 当初設計時は「派生1の決済ロジックは1本化されるので、 2スロットに分ける意味がない」と気付いて1ポジ化を検討したが、 他の戦略(PT001-PT006/PT101派生0)と建玉サイズ・統計を揃えて比較するため、2ポジ運用を維持。 スロット1 (10111) は MT5 TP=BB3 を保険として発注、スロット2 (10112) は TP無で EA管理のみ。 実質ほぼ同タイミングで決済される構造。

実装と投入

scripts/pt101_bb.py(新規)

MAGIC_TP1 = 10111   # PT101 派生1 決済方法1 (TP1スロット, MT5 TP=BB3)
MAGIC_SMA = 10112   # PT101 派生1 決済方法1 (SMAスロット, EA管理のみ)

MA_PERIOD = 10
SL_LOOKBACK = 30
TOUCH_TOL = 0.0010
BB_PERIOD = 20
BB_STD_2 = 2.0
BB_STD_3 = 3.0
TRAIL_RATIO = 0.10   # 90%戻り(フォールバック)

TARGET_SYMBOLS = {"XAUUSD"}

主な関数:

  • compute_bb(m5_df) — M5 closes ベースの動的BB(period=20、 σ=2/3)
  • check_long / check_short — シグナル判定(PT101と同一ロジック、TP=BB3を返す)
  • init_exit_state(entry_price, direction) — エントリー時の状態初期化
  • evaluate_exit(state, m5_df, bid, ask) — tick毎の決済判定。 SL→BB2_retest→BB3→TRAIL90 の順で評価

scripts/live_trader.py(パッチ5箇所)

  1. import pt101_bb
  2. ALL_MAGICS / ALL_MAGIC_TP1 / ALL_MAGIC_SMA に派生1 MAGIC 追加
  3. PT101_BB_MAGICS = {pt101_bb.MAGIC_TP1, pt101_bb.MAGIC_SMA}
  4. pt101_bb_exit_state = {} 状態辞書追加
  5. check_entry_pt101_bb() + check_pt101_bb_exit() 関数を新規追加し、メインループから呼び出し

同期と再起動

VPS pt101_bb.py        SHA256: 0c8e4976ea847fee... (新規)
VPS live_trader.py     SHA256: 0d62047f0f87bb80... (パッチ済み)
↓ scp(FX PCとSHA256一致照合済み)
FX PC C:\Users\y2198\fx_bot\scripts\
↓ pythonw.exe (PID 1492, 5/4 19:53起動) を kill
↓ schtasks /Run /TN FXBot_Restart
新プロセス PID 8424 起動 (2026/05/06 09:25:55)

初エントリー確認

2026-05-06 09:26:01 [PT101_BB] シグナル検出: XAUUSD LONG @4602.35
                    SL=4546.18 TP=BB3(4622.48) lot=0.01
2026-05-06 09:26:02 TP1発注成功: XAUUSD PT101_BB LONG @4603.17
                    SL=4546.18 TP=4622.48
2026-05-06 09:26:02 SMA発注成功: XAUUSD PT101_BB LONG @4603.17
                    SL=4546.18 (TPなし)
2026-05-06 09:26:02 === エントリー完了 ===

MT5 でも MAGIC 10111 / 10112 の2ポジが正常に建ち、 同時刻に既存PT101(MAGIC 10101/10102)も TRAIL_RATIO=0.75 のまま並走中。 これでA/B forward test が開始した。

VPS ⇄ FX PC 完全同期

今回の改修と同時に、scripts と backtest の両ディレクトリで VPS と FX PC のドリフトをチェック:

環境scripts/backtest/状態
VPS /data/fx_bot/1645マスター
FX PC C:\Users\y2198\fx_bot\1645同期済み
経理PC(BT機)--オフライン中(後ほど同期)

backtest 側は VPS にしかなかった BT スクリプト 19本(pt101_bb_bt.py / pt101_xau_bt.py / mt5_pivot.py 等)を FX PC にも配備。 これで「BT を走らせる場所」が FX PC でも整う(実 MT5 データに即座にアクセスできる利点)。

次の検証課題

  • 1〜2週間の forward test:派生0 (10101/10102 / trail0.75) vs 派生1 (10111/10112 / BB階層) の実弾比較
  • BTの「楽観的な PF 2.68」が live でどこまで再現するかの検証(M1 vs tick の乖離分を引いて評価)
  • BB3 到達率(BT 11.7%)/ BB2_RETEST 率(24.5%)/ TRAIL90 率(63.3%)の live 実測との比較
  • 勝った方を残し、PT101 派生 0 か 派生1 のどちらかを撤去
  • 同じ BB階層TP の考え方を PT102 / PT006 にも適用検討(PT006 は AvgWin +¥25 の問題、PT102 はトレール30%戻りで類似構造)
今回の最大の学び:「BTの数字が美しい戦略ほど live で崩れる」という法則は、AvgWin の絶対額に対するスプレッド比で見れば必然だった。 V0 trail0.75 の「PF 10.37」は「AvgWin $1.80」を、live 実約定の摩擦で吸収しきれず崩壊した。 今後は決済バリアント比較で 「AvgWin が live スプレッドの何倍以上か」を Key KPI として明示する。