最終更新: 2026年06月
ボリンジャーバンドはEAとの相性が良い。理由は単純で、バンドの上限・下限・中央線がすべて数値として取得できるからだ。「スクイーズ」「エクスパンション」という状態も、バンド幅の変化として数値で定義できる。つまり条件を論理的に記述できる。
本記事では、スクイーズ→エクスパンション戦略をEAとして実装する際の設計原理とMQL5実装の骨格、そしてバックテストで確認すべき指標を整理する。
ボリンジャーバンドの数値取得——iBands()関数の基本
MQL5でのボリンジャーバンド取得は iBands() を使う。
// ハンドルの作成(OnInit内)
int bb_handle = iBands(_Symbol, _Period, 20, 0, 2.0, PRICE_CLOSE);
// 値の取得(OnTick内)
double bb_upper[], bb_lower[], bb_middle[];
ArraySetAsSeries(bb_upper, true);
ArraySetAsSeries(bb_lower, true);
ArraySetAsSeries(bb_middle, true);
CopyBuffer(bb_handle, UPPER_BAND, 0, 3, bb_upper);
CopyBuffer(bb_handle, LOWER_BAND, 0, 3, bb_lower);
CopyBuffer(bb_handle, BASE_LINE, 0, 3, bb_middle);
引数の内訳: 期間=20、シフト=0、σ=2.0、適用価格=終値。これが標準設定だ。
取得できる値:
UPPER_BAND: 上限バンド(+2σ)LOWER_BAND: 下限バンド(-2σ)BASE_LINE: 中央線(SMA20)
スクイーズの数値定義
スクイーズとは「バンド幅が狭くなっている状態」だが、EAで実装するには数値化が必要だ。
バンド幅(Bandwidth)の計算
double CalcBandwidth(double upper, double lower, double middle) {
return (upper - lower) / middle * 100.0; // パーセント表示
}
double bw_current = CalcBandwidth(bb_upper[0], bb_lower[0], bb_middle[0]);
double bw_prev = CalcBandwidth(bb_upper[1], bb_lower[1], bb_middle[1]);
スクイーズ判定の条件設定
スクイーズの判定には「過去N本の最低バンド幅との比較」が実用的だ。
// 過去100本のバンド幅の最小値を取得
double min_bw = DBL_MAX;
for(int i = 1; i <= 100; i++) {
double bw = CalcBandwidth(bb_upper[i], bb_lower[i], bb_middle[i]);
if(bw < min_bw) min_bw = bw;
}
// 現在のバンド幅が過去100本の最小値の120%以内→スクイーズ状態
bool is_squeeze = (bw_current <= min_bw * 1.2);
この「120%以内」という閾値はパラメータ化しておき、バックテストで最適化できるようにする。
エクスパンションの検出
スクイーズ状態からバンドが拡大し始めたとき、エクスパンションが始まった判断のシグナルになる。
// エクスパンション判定:バンド幅が前本より拡大 + スクイーズ状態から抜け出した
bool is_expansion = (bw_current > bw_prev) &&
(bw_current > min_bw * 1.2); // スクイーズ閾値を超えた
エクスパンション単体では方向が分からない。方向の判定には、どちらのバンドをローソク足が突破したかで決める。
double close_0 = iClose(_Symbol, _Period, 0);
double close_1 = iClose(_Symbol, _Period, 1);
// 上方向エクスパンション: 直前バーが+2σを実体で超えた
bool expand_up = (close_1 > bb_upper[1]);
// 下方向エクスパンション: 直前バーが-2σを実体で割り込んだ
bool expand_down = (close_1 < bb_lower[1]);
エントリーロジックの実装
スクイーズ状態で待機し、エクスパンション方向にエントリーする戦略の骨格は以下の通りだ。
// 買いエントリー条件
bool buy_signal = is_squeeze && // 直前がスクイーズ状態
is_expansion && // エクスパンション開始
expand_up; // 上方向に突破
// 売りエントリー条件
bool sell_signal = is_squeeze &&
is_expansion &&
expand_down;
if(buy_signal && position_count == 0) {
// 買いオーダー
}
if(sell_signal && position_count == 0) {
// 売りオーダー
}
決済ロジックの設計
ボリンジャーバンドEAの決済には2つのアプローチがある。
アプローチ1: バンド幅縮小での決済
エクスパンションが終わり、バンド幅が縮小に転じたら決済する。
bool should_close_long = (bw_current < bw_prev); // バンド幅が縮小に転じた
アプローチ2: 固定TP/SLでの決済
参照データ(fx-prog.com のUSDJPY M15バックテスト: USDJPY M15・2024年8月〜2025年8月)では、TP/SL方式でPF=1.93・勝率66%・最大DD=0.17%・取引回数103回という結果が報告されている。ただしこのデータは特定の通貨ペア・期間・設定値に依存するため、異なる条件では結果が変わる可能性がある点を理解した上で参照すること。
バックテストで確認すべき指標
ボリンジャーバンドEAのバックテスト評価では以下の指標を重視する。
| 指標 | 目標水準 | 理由 | |---|---|---| | プロフィットファクター(PF) | 1.5以上 | 1.0を大幅に超えることで統計的優位性が増す | | 最大ドローダウン(MaxDD) | 20%以下 | EA運用の実用的な許容範囲 | | 取引回数 | 200回以上 | 統計的信頼性の最低ライン | | 勝率 | 50%以上 | 低い場合は利確幅をさらに広げて補完 |
取引回数が200回未満のバックテスト結果は、統計的信頼性が低い。スクイーズ→エクスパンション戦略はシグナル頻度が低いため、サンプル数を確保するには長期間(最低3〜5年)のデータが必要になることが多い。
Claudeと会話しながらインジケータが作れる[hedgrow-fx]はこちら
ボリンジャーバンドEAのスクイーズ判定ロジックやパラメータ最適化を対話的に進めたい場合、Hedgrow FX のようにClaudeと会話しながらインジケータが作れる環境は設計の反復サイクルを大幅に短縮する。
設計上の注意点——陥りやすい罠
ヘッドフェイク問題
スクイーズ後のブレイクアウトが偽りの動き(ヘッドフェイク)になるケースは多い。対処法としてはエントリー後の次のローソク足が方向を維持しているかの確認、または エントリー直後の小さな損切りを許容してフィルタリングする設計がある。
過剰最適化の回避
スクイーズ判定の閾値(前述の「120%以内」)やバンド幅縮小の判定パラメータを最適化ツールで細かく調整するほど、カーブフィッティングのリスクが高まる。パラメータは理論的に意味のある範囲に限定し、ウォークフォワードで検証することが必須だ。
よくある質問(FAQ)
Q: ボリンジャーバンドのスクイーズEAはMT4でも作れますか? A: 作れる。MT4ではiBands()の引数構造が異なり、バッファ番号で上限・下限・中央線を区別する方式になる。MQL4でのiBands取得はiBands()の第8引数でバンドを指定する。
Q: スクイーズの判定にケルトナーチャネルを使う手法もありますか? A: ある。ボリンジャーバンドがケルトナーチャネルの内側に入ったときをスクイーズとして定義するJohn Carters手法が有名だ。iBands()とiATR()を組み合わせて実装できる。
Q: バックテストのプロフィットファクターが高くても実運用で機能しないのはなぜですか? A: 過剰最適化(カーブフィッティング)が主な原因だ。バックテスト期間のデータに特化した設定が、未来の価格変動に適合しない。ウォークフォワードとフォワードテストで段階的に検証することが重要だ。
Q: スクイーズ判定の期間(前述の過去100本)の根拠は何ですか? A: 100本は筆者の経験的な設定値であり、絶対的な根拠はない。短くすれば感度が上がり、長くすれば稀なスクイーズのみを検出できる。自分のトレードスタイル(頻度)に合わせてバックテストで確認することを推奨する。
Q: ボリンジャーバンドEAに他の指標を組み合わせるべきですか? A: RSIやMACDによるトレンド方向の確認フィルターを追加することで、ヘッドフェイクを減らせることが多い。特にMACDゼロライン確認(ブレイク方向とMACDの方向が一致しているか)は実装が簡単で効果的だ。
免責事項: 本記事はFXトレードおよびEA設計の教育目的で作成されています。FX取引には元本割れを含む損失リスクがあります。バックテスト結果は過去のデータに基づくものであり、将来の利益を保証するものではありません。投資判断はご自身の責任において行ってください。
著者: Hedgrow FX編集部(金融工学専門家監修)
