【FX自動売買開発ログ #9】「stride」をやめて、実際のトリガー方式に作り変えた話
前回までのおさらい
これまでのバックテストは、stride(N本ごとに理論判定を再評価する)という仕組みで動いていました。実際のトレードでは「N本ごとに機械的にチェックする」のではなく、「何かしらの条件が発生したときだけAIに判定させる」方が現実的です。今回は、この「stride方式」から「トリガー方式」への作り変えの記録です。
まずはトリガー条件の候補をもらう
いきなり実装せず、まずどんな条件でAI判定を起動するのが良いか、候補を出してもらいました。既存の指標(SMA、EMA、RSI、MACD、ATR)だけで判定できる範囲で、5つの候補が挙がりました。
| 条件 | 発想 | 特徴 |
|---|---|---|
| ①SMAクロス | トレンド転換の初期シグナル | 比較的まれ、ノイズは少なめ |
| ②MACDシグナルクロス | モメンタム転換 | SMAクロスよりやや頻度が高い |
| ③RSI閾値の跨ぎ | 買われすぎ・売られすぎ入り | ボラティリティ次第で頻度が変わりやすい |
| ④直近N本高値/安値のブレイク | ダウ理論的なブレイクアウト | ダウ理論との相性が良い |
| ⑤ATR急拡大 | ボラティリティ急増の代理指標 | 他条件と組み合わせるとノイズになりやすい |
単独で使うか、OR条件で組み合わせるか、という設計の余地もあわせて提示してもらいました。特に大事だったのが「クールダウン期間」という考え方です。トリガーが連続バーで何度も成立すると、短時間に無駄なAPI呼び出しが連発する恐れがあるため、「前回のAI判定からN本は次のトリガーを無視する」という最小間隔を設ける必要がある、という指摘でした。これがないと見積もり自体が大きくブレる、というのは言われてみればその通りです。
①(ダウ理論との相性が良いブレイクアウト)と④(トレンド転換の初期シグナルであるSMAクロス)のOR条件、クールダウン6本(6時間)で進めることにしました。

シミュレーションしてみたら、想定よりだいぶ頻繁だった
実際にAPIを呼ぶ前に、まず過去の1hデータでトリガー発生回数をシミュレーションしてもらいました。価格と指標だけのロジックなので、これ自体にAPIコストはかかりません。
対象期間は6,305本の1hバー(2025-07-01〜2026-07-13)です。
| 項目 | 件数 |
|---|---|
| SMAクロス単独(生) | 145件 |
| ブレイクアウト単独(生) | 681件 |
| OR条件・クールダウンなし | 804件 |
| クールダウン6本適用後 | 393件 |
| 想定API呼び出し回数(×2理論) | 786回 |
見積もりコストは約$4.36。これまでの検証の中では一番大きい金額です。
気になったのは、ブレイクアウト条件(681件)がSMAクロス(145件)の約4.7倍も発生していて、トリガーのほとんどをブレイクアウトが占めていたことです。1時間足×直近20本(≒1日弱)のレンジは、思っていたより頻繁に更新されてしまうようで、ブレイクの閾値がやや緩かった可能性が指摘されました。クールダウン6本を入れても804件→393件と、半分弱に間引かれる程度で、それでもまだ高頻度です。
調整案として、ブレイクアウトの参照本数Nを20→40や60に広げる、クールダウンをもっと伸ばす、といった方向性が提示されました。
Nを60に広げて再シミュレーション
ブレイクアウトの参照本数を20→60に変更して、もう一度シミュレーションしてもらいました。
| 項目 | N=20 | N=60 | 変化 |
|---|---|---|---|
| ブレイクアウト(生) | 681件 | 406件 | -40% |
| OR合計(生) | 804件 | 543件 | -32% |
| クールダウン後の合計 | 393件 | 300件 | -24% |
| 想定API呼び出し回数 | 786回 | 600回 | -186回 |
| 概算コスト | $4.36 | $3.33 | -$1.03 |
SMAクロスとブレイクアウトの偏りも変化しました。クールダウン適用後の内訳(N=60)は、ブレイクアウトのみ60%・SMAクロスのみ39%・両方同時1%と、だいぶバランスに近づいています。生の発生数ではブレイクアウトがSMAクロスの約4.7倍(N=20)だったのが、N=60にすると約2.8倍まで縮まりました。
これは、ブレイクアウトのトリガーが「レンジを一度抜けると数バー連続で高値/安値越えの状態が続く」性質上、短期間に連発しやすく、クールダウンでその連発がまとめて間引かれる一方、SMAクロスは「クロスした瞬間の1回だけ」という性質上そもそも連続発生しにくく、クールダウンの影響を受けにくいから、という説明でした。理屈で言われると納得感があります。

一旦ここで区切り
N=60・クールダウン6本(600回、約$3.33)という条件が固まったところで、実行するかどうかの判断待ちになりました。stride方式のときと同じく、「実行前に必ず見積もりを見てから判断する」という流れがここでも活きています。

次回予告
次回は、この条件(N=60、クールダウン6本)で実際にトリガー方式のバックテストを実行し、これまでのstride方式の結果と何が変わるかを確認します。
※本シリーズは個人の技術検証・学習を目的とした開発記録であり、特定の投資手法や金融商品を推奨するものではありません。自動売買には元本割れのリスクがあり、掲載する内容を参考にした取引の結果について一切の責任を負いかねます。投資判断はご自身の責任で行ってください。

