FXレンジ逆張りEAの設計とバックテスト検証|RSI・BB活用の実装ガイド
Photo by Maxim Hopman on Unsplash
FX市場の相場環境は「レンジが約70%、トレンドが約30%」という経験則がトレーダーの間で広く語られてきた(通貨ペアや期間によって大きく変わるので、あくまで目安として捉えてほしい)。この非対称性こそが、逆張り戦略が「エントリー頻度」の点でアドバンテージを持てる理論的な根拠だ。ただし、頻度の多さはそのまま利益につながらない。残り30%のトレンド相場に巻き込まれたときの損失設計が、逆張りEAの収益性を最終的に決める。
本稿では、RSIとボリンジャーバンドを核とした逆張りEAをMQL4で実装し、ADXによる相場環境フィルターと組み合わせてトレンド相場への露出を絞る設計手法を解説する。あわせて、ドル円・ユーロ円・豪ドル円の3通貨ペアを対象としたバックテスト検証例を示し、逆張り戦略が各通貨ペアの特性とどう絡み合うかを数字で確認していく。
レンジ逆張り戦略の基本とリスク
Photo by Nick Chong on Unsplash
逆張りが機能する相場・しない相場の見極め
レンジ相場の本質は、上限(レジスタンス)と下限(サポート)の間で価格が往復することにある。この環境では、価格が端に近づくほど「反転確率が高い」という統計的前提が成立する。逆張りEAはこの前提をコードに落とし込んだものだ。
レンジ相場が形成されやすい条件を整理すると、だいたい以下の4点に絞られてくる。
- ボリンジャーバンドのバンド幅が収縮(スクイーズ)している
- RSIが30〜70の範囲を中心に推移している
- ADX(平均方向性指数)が25以下にある
- 市場参加者が少ない時間帯(例:東京市場の昼休み時間帯)
一方、逆張りが機能しない相場は「方向性が明確なトレンド相場」だ。価格が一方向に動き続ける環境では、逆張りエントリーは含み損を拡大させ続ける。特に経済指標発表後や中央銀行の政策変更後は、価格が±2σを突き抜けて一方向に走る局面が頻発する。こうした局面での損失を許容範囲に収めることが、逆張りEA設計の核心課題だ。
東京時間(8:00〜16:00 JST)はドル円がレンジを形成しやすく、逆張りEAの稼働に適した環境が整いやすい。反対に、ロンドン・NYオープン前後(16:00〜18:00 JST)はレンジブレイクが多発するため、この時間帯を機械的にエントリー停止とする時間帯フィルターが有効に機能する。
ナンピン・マーチンとの違い(リスク管理の考え方)
逆張りEAとナンピン・マーチン手法は、見かけ上は「下がったら買い向かう」点で類似しているが、リスク構造は根本的に異なる。
| 手法 | ポジション構造 | 損失の上限 | 破綻リスク | |---|---|---|---| | 逆張りEA(ナンピンなし) | 1ポジション・固定SL・固定TP | SL幅×ロット数で確定 | 限定的(SL発動で確定損失) | | ナンピン手法 | 逆行時に追加ポジション | 理論上無制限(証拠金依存) | 証拠金枯渇で壊滅リスク大 | | マーチン手法 | 負けるたびにロット倍増 | 連敗数の指数関数で急拡大 | 数回連敗で口座消滅の可能性 |
本稿が対象とするのは「ナンピンなし・固定ストップロスあり」の逆張りEAのみだ。ナンピンやマーチン要素を組み込んだEAは、バックテストでは好成績を示しても、現実の相場では一度のトレンド相場で口座を消滅させるリスクを内包している。この設計哲学を最初に明確にしておきたい。
主要な逆張りシグナルの実装
RSI(30以下でBuy・70以上でSell)のコード実装
RSI(Relative Strength Index)はJ・W・ワイルダーが考案した、相対的な価格変動の強度を0〜100の範囲で表す指標だ。計算式はWilder法に基づく修正移動平均を使用する。
計算式(Wilder法):
RS = n日間の上昇幅平均 ÷ n日間の下落幅平均
RSI = 100 − (100 ÷ (RS + 1))
標準パラメーターは期間14。売られ過ぎの目安は30以下、買われ過ぎの目安は70以上とされる。ただし、RSI単体のシグナルは偽シグナルが多く、後述するボリンジャーバンドとの組み合わせが前提となる。
MQL4での取得コードは以下の通りである。
// RSI値を1本前の確定バーで取得(0は現在形成中のバーのため除外)
double rsi = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1);
インデックス1を指定して確定バーの値を使うことが重要だ。インデックス0(現在バー)を使用すると、バーが形成途中の不確定値でシグナルが発生し、直後に取り消されるいわゆる「シグナルの消え」が多発する。これは実装初期に私自身がハマったポイントでもある。
ボリンジャーバンド±2σタッチのシグナル実装
ボリンジャーバンド(BB)はジョン・ボリンジャーが開発した、統計的な価格の変動範囲を示す指標だ。
計算式:
中央線(SMA)= n期間の単純移動平均
上限バンド = SMA + k × σ(標準偏差)
下限バンド = SMA − k × σ(標準偏差)
標準設定はn=20期間、k=2σ。正規分布に従えば、価格が±2σ以内に収まる確率は理論上95.4%だ。逆に言えば、±2σタッチは「4.6%の確率でしか起きない外れ値事象」として解釈できる。ただし実際の価格分布はファットテール(裾の重い分布)を持つため、±2σの逸脱頻度は正規分布の理論値より高くなる点には注意が必要だ。レンジ相場においては、このタッチが発生した後に中心回帰する確率が統計的に高い。
MQL4での実装は以下の通りである。
// BBの上限・下限・中央線を1本前の確定バーで取得
double bb_upper = iBands(NULL, 0, BB_Period, BB_Dev, 0, PRICE_CLOSE, MODE_UPPER, 1);
double bb_lower = iBands(NULL, 0, BB_Period, BB_Dev, 0, PRICE_CLOSE, MODE_LOWER, 1);
double bb_mid = iBands(NULL, 0, BB_Period, BB_Dev, 0, PRICE_CLOSE, MODE_MAIN, 1);
エントリーシグナルの条件は「RSIが閾値を超えていること」かつ「終値がBBのバンドに接触またはタッチしていること」の両方を満たした場合のみとする。どちらか一方のみでエントリーするよりも偽シグナルが大幅に減少する。
ストキャスティクスとの組み合わせ
ストキャスティクスは「n期間の最高値と最安値に対して、当日の終値がどの位置にあるか」を表す指標だ。
計算式:
%K = (当日終値 − n期間最安値) ÷ (n期間最高値 − n期間最安値) × 100
%D = %Kのm期間移動平均
標準設定は%K期間5、%D期間3、スローイング3。RSIとBBによる「場所の特定」に対して、ストキャスティクスは「タイミングの確認」という役割を持つ。具体的には、BBの下限タッチ・RSI<30の条件が揃った後、ストキャスティクスの%Kが%Dを下から上にクロスした時点でエントリーするという複合条件を設定できる。
ちなみに条件を増やすほどエントリー頻度は下がるので、期待利益率との兼ね合いで最終的な条件の数を決めることになる。バックテストで条件を追加するたびにトレード数を確認し、統計的に有意なサンプル数(最低200トレード以上)を確保できているかの検証は外せない。
レンジ相場フィルターの実装
ADXで相場環境を判定する方法(ADX<25でレンジ認定)
ADX(Average Directional Index)はワイルダーが開発した方向性の強さを示す指標で、0〜100の範囲を取る。ADXはトレンドの方向ではなく「強さ」のみを示す点に注意が必要だ。
ADX値と相場状態の対応表:
| ADX値 | 相場状態 | 逆張りEA推奨動作 | |---|---|---| | 0〜20 | 方向性なし(レンジ) | エントリー許可 | | 20〜25 | 弱いトレンド形成の可能性 | エントリー許可(慎重) | | 25〜40 | 明確なトレンド | エントリー停止 | | 40以上 | 強いトレンド・過熱感 | エントリー停止 |
ADX=25をレンジ認定の閾値として使用するのが一般的だが、実装上はヒステリシスを設けることを強くすすめる。ADXが22を下回ったときにレンジ判定を開始し、28を上回ったときに終了するという設計にすることで、ADXが閾値付近で振動する局面でのシグナル乱発を防止できる。
ADXの詳細な実装手法については、ADXフィルターの詳細実装についてを参照されたい。
MQL4での取得コードは以下の通りである。
// ADX値を1本前の確定バーで取得
double adx = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MAIN, 1);
// レンジ判定:ADXが閾値以上なら逆張りエントリーを停止
if (adx >= ADX_Limit) return;
時間帯フィルターとの組み合わせ
ADXフィルターは過去データに基づく事後的なフィルターのため、急激なトレンド発生の直後には追随が遅れる。これを補完するのが時間帯フィルターだ。
市場の流動性が急増し、方向性のある動きが生じやすい時間帯として以下が挙げられる。
- ロンドンオープン: 16:00〜17:00 JST
- NYオープン: 22:00〜23:00 JST
- 主要経済指標発表前後: 各国の雇用統計・金融政策決定等
これらの時間帯はエントリーを停止し、レンジが再形成されるまで待機する設計とする。時間帯フィルターはADXフィルターとは独立して機能させることが重要で、ADXが低くても危険な時間帯はエントリー禁止という論理構造にする。
損切り・利確の設計(逆張り特有の考え方)
固定pips vs ATRベース vs 反対シグナルでの決済
損切り・利確の設定方式には主に3種類ある。
固定pips方式: ドル円であれば「損切り20pips・利確10pips」のように固定値で設定する。実装が単純で最適化しやすいが、市場のボラティリティ変化に対応できない。低ボラティリティ期は損切りが広すぎ、高ボラティリティ期は損切りが狭すぎて頻繁に発動するという問題が出てくる。
ATRベース方式: ATR(Average True Range)は直近n期間の価格変動幅の平均であり、現在の市場ボラティリティを動的に反映する。
double atr = iATR(NULL, 0, ATR_Period, 1);
double sl_dist = atr * ATR_SL_Mult; // 例: ATR × 1.5
double tp_dist = atr * ATR_TP_Mult; // 例: ATR × 1.0
ボラティリティが高い局面では損切り幅が自動的に広がり、低い局面では狭くなる。これにより、相場環境の変化に適応したSL/TPが設定される。ATRを活用したストップロス設計の詳細は、ATRを活用した自動ストップロス設計にまとめている。
反対シグナルでの決済: 買いポジションであれば「売りシグナルが発生したとき」に決済する方式。利確を大きく取れる場合があるが、損切りが遅れるリスクもある。逆張りEAでは通常、固定SLを設けた上で反対シグナル決済を補助的に使用するハイブリッド方式が現実的な選択肢となる。
逆張りにおけるリスクリワード比の現実
トレンドフォロー戦略では「損小利大」(RR比 1:2〜1:3)が推奨されることが多い。しかし逆張り戦略でこれを実現しようとすると、プロフィットファクターが著しく低下する。これは逆張りの構造上、ある程度避けがたい。
逆張りの本質は「高勝率・低リワード」の構造にある。価格が端から中央へ戻る動きを捉えるため、利確はBBの中心線付近(移動平均線)に設定するのが合理的で、これによりRR比は0.5:1〜1:1の範囲に収まることが多い。
勝率とRR比の関係(損益分岐点):
| 勝率 | 損益分岐点となるRR比 | |---|---| | 70% | 0.43:1 以上 | | 65% | 0.54:1 以上 | | 60% | 0.67:1 以上 | | 55% | 0.82:1 以上 |
逆張りEAが60〜70%の勝率を維持できるのであれば、RR比 1:0.5〜1:1でも長期的に損益プラスになる計算が成立する。問題はトレンド相場でこの勝率が急低下する点にある。ADXフィルターによってトレンド相場への露出を制限することで、勝率の安定を図るのが設計上の基本方針だ。
免責事項: 上記の損益分岐点の計算はバックテスト環境における理論値であり、実際の取引ではスプレッド・スリッページ・流動性の変化により結果が大幅に異なる場合があります。FX取引には元本損失のリスクがあり、損失を保証するものではありません。
バックテスト検証例(通貨ペア別成績比較)
Photo by Luke Chesser on Unsplash
ドル円・ユーロ円・豪ドル円での結果比較表
以下は、RSI(14)・BB(20,2σ)・ADX(14)<25のフィルター付き逆張りEAを、MT4ストラテジーテスターで2020年1月〜2024年12月の5年間・H1足で検証した仮想的な結果例だ。
| 指標 | ドル円(USDJPY) | ユーロ円(EURJPY) | 豪ドル円(AUDJPY) | |---|---|---|---| | 総トレード数 | 312 | 248 | 271 | | 勝率 | 68.3% | 61.7% | 63.8% | | プロフィットファクター | 1.42 | 1.28 | 1.31 | | 最大ドローダウン | 12.4% | 18.7% | 15.9% | | 純利益(対初期証拠金) | +34.2% | +21.6% | +26.8% | | リカバリーファクター | 2.76 | 1.15 | 1.69 | | 平均保有時間 | 8.3時間 | 6.7時間 | 7.9時間 |
ドル円が最も安定した成績を示している。東京時間にレンジが形成されやすい特性と、スプレッドが3通貨ペアの中で最も狭い点(平均0.3〜0.5pips)が複合的に作用している、というのが私の解釈だ。
ユーロ円はボラティリティが高い分、ロンドン時間に方向性のある動きが出やすく、ADXフィルターをすり抜けたトレンド相場での損失が多い。プロフィットファクター1.28は実用下限に近い水準で、時間帯フィルターを追加すれば改善の余地はある。
重要: 上記の数値はパラメーターを固定した仮想的なバックテスト結果であり、過去の結果は将来の成績を保証するものではありません。本番環境・実口座では、スプレッドの拡大・スリッページ・流動性の枯渇等により結果が大幅に異なる可能性があります。バックテストの最適化パラメーターをそのままフォワードテストに適用することは、過剰最適化(カーブフィッティング)のリスクがあります。
レンジ期間と利益の相関分析
バックテスト結果を詳細に分析すると、ADXが低い期間(ADX<20)ほど逆張りEAの勝率が向上する傾向が確認できる。ADXが20〜25の範囲(弱いトレンド)に入ると勝率が落ち、25を超えるとフィルターによりエントリー停止となる。
ドル円の5年データを年別に分解すると、コロナ禍(2020年)やFRBの急激な利上げ局面(2022年)はトレンド相場の比率が上昇し、逆張りEAの成績が悪化する傾向が観察される。「約70%がレンジ相場」という統計はあくまでも年間平均であり、特定の年では大幅に乖離するという事実は、設計時に常に念頭に置いておきたい。
逆張りEAが抱えるリスクと対策
トレンド転換時の大損失リスク
逆張りEAが最も脆弱な局面は「相場が一方向に走り続けるトレンド相場」だ。このリスクは以下の3つの局面で特に顕在化する。
- 中央銀行の政策転換時: 利上げ・利下げサイクルの転換点では、数百pipsの一方向の動きが発生することがある
- 地政学的リスクの顕在化: 突発的な市場クラッシュでは、価格が±2σを大きく超えてオーバーシュートする
- 主要経済指標のサプライズ: 予想値と大幅に乖離した指標発表後は、数分で数十pipsの急動意が生じる
ADXフィルターはこれらの局面の一部をカバーするが、ADXは後追いの指標のため、急激なトレンド発生の初動では間に合わない。この時間的ラグがリスクの源泉であり、固定ストップロスが唯一の防衛線となる。
最大損失を限定するための設計
逆張りEAにおける最大損失の制限は、多層的な設計によって実現する。
第1層: 固定ストップロス(絶対必須) ATRベースの動的SLまたは固定pipsのSLを必ず設定する。SLなしの逆張りEAは、一度のトレンド相場で口座を壊滅させる可能性がある。
第2層: ポジションサイジング(1%ルール) 1トレードの最大損失額を口座残高の1%以内に制限する。
// 1%リスク管理に基づくロット計算
double risk_amount = AccountBalance() * 0.01; // 口座残高の1%
double sl_pips = ATR_val * ATR_SL_Mult; // ATRベースのSL幅(価格差)
double lot = risk_amount / (sl_pips / Point * MarketInfo(Symbol(), MODE_TICKVALUE));
// 注意: 5桁業者ではPointが4桁業者の1/10になるため(例: USDJPY で0.001 vs 0.01)
// ロット計算結果が10倍ズレる場合がある。Digits==5の場合はPoint*10で補正すること。
第3層: ADXフィルター(トレンド相場の排除) ADX<25の条件でエントリーを制限し、明確なトレンド相場への参加を機械的に停止する。
第4層: 時間帯フィルター(イベントリスクの回避) ロンドン/NYオープン前後および主要指標発表前はエントリーを停止する。
第5層: ボラティリティフィルター(異常相場の排除) ATRが直近20期間の平均の1.5倍を超えた場合はエントリーを停止する。
以下に、上記の設計思想を統合したEAの基本コード全体を示す。
//--- 入力パラメーター
input int RSI_Period = 14; // RSI期間
input double RSI_Buy = 30.0; // RSI買いシグナル閾値
input double RSI_Sell = 70.0; // RSI売りシグナル閾値
input int BB_Period = 20; // BB期間
input double BB_Dev = 2.0; // BB標準偏差の倍率
input int ADX_Period = 14; // ADX期間
input double ADX_Limit = 25.0; // レンジ判定閾値(これ以上はエントリー停止)
input int ATR_Period = 14; // ATR期間
input double ATR_SL_Mult = 1.5; // SL = ATR × この係数
input double ATR_TP_Mult = 1.0; // TP = ATR × この係数
input double Risk_Pct = 0.01; // 1トレードの最大リスク(口座残高の1%)
datetime lastBarTime = 0;
void OnTick() {
// 新バー生成時のみ処理(バー内での複数回実行を防止)
if (iTime(Symbol(), Period(), 0) == lastBarTime) return;
lastBarTime = iTime(Symbol(), Period(), 0);
// 各指標値を確定バー(インデックス1)から取得
double rsi = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1);
double bb_upper = iBands(NULL, 0, BB_Period, BB_Dev, 0, PRICE_CLOSE, MODE_UPPER, 1);
double bb_lower = iBands(NULL, 0, BB_Period, BB_Dev, 0, PRICE_CLOSE, MODE_LOWER, 1);
double adx = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MAIN, 1);
double atr = iATR(NULL, 0, ATR_Period, 1);
// ADXフィルター:トレンド相場ではエントリー停止
if (adx >= ADX_Limit) return;
// 既存ポジションがある場合は新規エントリーしない(1ポジション制御)
if (OrdersTotal() > 0) return;
// 1%リスクルールに基づくロット計算
double risk_amount = AccountBalance() * Risk_Pct;
double sl_dist = atr * ATR_SL_Mult;
double tp_dist = atr * ATR_TP_Mult;
double lot = NormalizeDouble(
risk_amount / (sl_dist / Point * MarketInfo(Symbol(), MODE_TICKVALUE)),
2
);
// 買いシグナル:RSI売られ過ぎ + BB下限タッチ
if (rsi < RSI_Buy && Close[1] <= bb_lower) {
double sl = Ask - sl_dist;
double tp = Ask + tp_dist;
OrderSend(Symbol(), OP_BUY, lot, Ask, 3, sl, tp, "RSI_BB_Buy", 0, 0, clrBlue);
}
// 売りシグナル:RSI買われ過ぎ + BB上限タッチ
if (rsi > RSI_Sell && Close[1] >= bb_upper) {
double sl = Bid + sl_dist;
double tp = Bid - tp_dist;
OrderSend(Symbol(), OP_SELL, lot, Bid, 3, sl, tp, "RSI_BB_Sell", 0, 0, clrRed);
}
}
このコードはエントリー機能と基本的なリスク管理を実装したものだ。実運用に向けては、時間帯フィルター・エラーハンドリング・ポジション管理ロジックの追加が必要になる。
FAQ
逆張りEAとトレンドフォローEAはどちらが安定するか?
単純に比較することは適切ではない。逆張りEAはエントリー頻度が高く、安定した小さな利益を積み重ねるが、トレンド相場での大きな損失が定期的に発生する。トレンドフォローEAはエントリー頻度が低く、損切りが多いが、一度のトレンドで大きな利益が得られる可能性がある。レンジ相場が多い通貨ペア・時間帯では逆張りEAが、方向性のある相場が多い環境ではトレンドフォローEAが相対的に優位となる傾向がある。最終的にはバックテストによる通貨ペア・パラメーターの適合性検証が判断の基準となる。
RSIのパラメーター(期間・閾値)はどう最適化する?
RSI期間を短くするほどシグナルが多くなるが偽シグナルも増加する。期間を長くすると安定するがエントリー頻度が下がる。一般的な最適化の手順としては、まずデフォルトの期間14・閾値30/70でバックテストを実施し、基準値を把握する。次に期間を7〜21の範囲でグリッドサーチし、プロフィットファクターと最大ドローダウンのトレードオフを確認する。重要なのは最適化後にアウトオブサンプルテスト(最適化に使用していないデータでの検証)を実施し、過剰最適化でないことを確認することだ。ウォークフォワード分析を用いることでさらに信頼性が高まる。
レンジブレイク時の損切りをどう設定するか?
逆張りEAにおける損切りの設定は、ATRの1.5〜2.0倍を基準とするのが一般的だ。レンジの上限・下限を明確に定義できる場合は、そのブレイクポイントの外側(例:レジスタンスの10pips上)に損切りを設置する方法もある。いずれの場合も、損切りはエントリー時に必ず設定し、後から変更しないことが原則だ。含み損が拡大したからといってストップを遠ざける行為は、損失を確定させずに含み損を抱え続けるナンピンと同質のリスクを内包している。
ナンピンなしで逆張りEAを設計するポイントは?
最重要ポイントは「エントリー条件を絞ることで1回あたりの期待値を高めること」だ。ナンピンは複数エントリーで平均取得単価を調整するアプローチだが、これはリスクを後送りする手法に過ぎない。ナンピンなしの逆張りEAでは、1エントリーの勝率を高めるために指標の複合条件(RSI+BB+ストキャスティクス)とフィルター(ADX+時間帯)を積み上げる設計が基本となる。エントリー頻度が減少することは許容し、品質を重視する方針が長期的な安定につながる。
設計済みEAを今すぐ使う選択肢
ここまで解説してきたRSI・BB・ADXを組み合わせた逆張りEAは、コードの品質・パラメーターの調整・バックテストの解釈と、実用化まで相当な工数が必要になる。
Hedgrow FX(月額1,980円)は、固定ストップロス・ポジションサイジングといったリスク管理を組み込んだ複数の自動売買ロジックを提供しているサービスだ。具体的な収録EA・パラメーター設定については公式サイトでご確認いただきたい。EAの設計・実装ではなく「どのEAを稼働させるか」の判断に時間を使いたい場合の選択肢の一つとして参照されたい。
免責事項
本記事で紹介したコード・バックテスト数値・パラメーター設定はすべて教育・情報提供を目的としたものであり、特定の金融商品への投資を推奨するものではありません。FX取引は元本を上回る損失が発生する可能性があり、すべての資金を失うリスクがあります。
逆張りEAはトレンド相場において大きな損失を被るリスクを持つ戦略です。バックテストの結果は過去データに基づくものであり、将来の収益を保証するものではありません。本番環境・実口座での運用結果は、スプレッドの拡大・スリッページ・市場流動性の変化等により、バックテスト結果と大幅に乖離する可能性があります。
実際の資金を運用する前に、デモ口座での十分な検証を行ってください。また、FX取引は金融商品取引法の規制対象であり、認可を受けた業者(金融庁登録業者)とのみ取引を行ってください。
