MT4でADX連携ボリンジャーバンドEAを作成|順張り特化MQL4サンプル解説

ADX連携ボリンジャーバンドEAのエントリーポイント例
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「ボリンジャーバンドの順張りEAを、もっと安定させたい」
「レンジ相場での無駄なエントリーを減らしたい」
そんな方に向けて、この記事ではADXをフィルタとして組み込んだボリンジャーバンドEAを解説します。

ボリンジャーバンドはトレンド方向の判断に優れたインジケーターですが、
相場に勢いが無い状態ではダマシが増えやすいという弱点もあります。

本記事では、ADXで「トレンドの強さ」を事前に判定し、
その上でボリンジャーバンドの順張り条件を組み合わせることで、
より実戦向きなEAロジックを構築する考え方を解説します。

📘 この記事で解説する内容
  • ボリンジャーバンドとADXを組み合わせる考え方
  • それぞれのインジケーターの役割分担
  • ADX連携ボリンジャーバンドEAのエントリーロジック
  • 単体EAとの違いと注意点

📊 ADX連携ボリンジャーバンドEAの考え方(結論)

ADX連携版ボリンジャーバンドEAのポイントは、
「方向」と「強さ」を別々に判定するという設計思想にあります。

  • ボリンジャーバンド → どちらに向かっているか(方向)
  • ADX → 本当にトレンドが出ているか(強さ)

ボリンジャーバンドだけでも順張りロジックは組めますが、
ADXを加えることでレンジ相場を事前に除外できるため、
無駄なエントリーを大きく減らすことができます。

📈 使用するインジケーターの役割整理

ボリンジャーバンドの役割(順張り判定)

ボリンジャーバンドは、中央線(移動平均線)と上下のバンドで構成されています。

  • 中央線 → トレンドの方向を判断
  • 上下バンド → 価格の偏りを確認
  • バンド幅の拡大 → トレンド継続の兆候

本EAでは、価格が中央線のどちら側に位置しているかを重視し、
バンドに沿って推移している状態を「順張り環境」として扱います。

ベースのボリンジャーバンドEAについてはこちら
👉 【MQL4】ボリンジャーバンドEAの作り方|順張りロジックのサンプルコード付き

ADXの役割(トレンド強度フィルタ)

ADX(Average Directional Index)は、
トレンドの「方向」ではなく「強さ」を数値化する指標です。

  • ADXが一定値以上 → トレンドが発生している
  • ADXが低い → レンジ傾向

ADXは売買サインとして使うのではなく、
「この相場でエントリーしてもよいかどうか」の判断材料として利用します。

⚙️ エントリーロジック解説(ADX連携版)

ADX連携ボリンジャーバンドEAでは、以下の流れでエントリーを判定します。

【共通条件】

  • ADXがしきい値以上(例:25以上)
  • 新しいローソク足確定時に1回のみ判定
  • ポジション未保有時のみエントリー

【ロングエントリー】

  • 価格がボリンジャーバンド中央線より上
  • 上側バンド付近で価格が推移している
  • (任意)+DI が -DI を上回っている

【ショートエントリー】

  • 価格がボリンジャーバンド中央線より下
  • 下側バンド付近で価格が推移している
  • (任意)-DI が +DI を上回っている

ADXの条件を満たしていない場合、
ボリンジャーバンドの条件を満たしていてもエントリーは行いません

💡 なぜADXとボリンジャーバンドの組み合わせが有効なのか

ボリンジャーバンドはトレンドの方向を捉えるのが得意ですが、
相場に勢いが無いと「それっぽい動き」にも反応してしまいます。

ADXを組み合わせることで、
「動いている相場だけを選別する」ことが可能になります。

  • BB → 方向を判断
  • ADX → 環境を選別

この役割分担により、
レンジ相場での順張りエントリー事故を大幅に減らすことができます。

⚠️ ADX連携EAの注意点

  • ADXが高すぎるとエントリーが遅れることがある
  • ADX単体で売買判断をしない
  • ボリンジャーバンドの条件を緩めすぎない

あくまでADXは補助フィルタとして扱い、
主役はボリンジャーバンドの順張りロジックである点を意識しましょう。

ADXの仕組みや iADX() の使い方については、
以下の記事で詳しく解説しています。

👉 MT4でADX EAを作成|無料MQL4サンプルコード解説

ダウンロード

EAファイルのダウンロードはこちら👇

📥 ADX連携ボリンジャーバンドEA をダウンロード

\ 国内最大級のEAプラットフォーム /
GogoJungle(ゴゴジャン)でEAの評価・レビューをチェック!

▶ GogoJungleでEAを探す MT4でADX連携ボリンジャーバンドEAを作成|順張り特化MQL4サンプル解説

📜 ADX連携ボリンジャーバンド EAのサンプルコード解説

以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます。

//+------------------------------------------------------------------+
//|                                            02_BollingerBands.mq4 |
//|                                Copyright © 2020-2025 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict


input double Lots = 0.01;              //ロット
input int TP = 100;                    //利確(pips)
input int SL = 100;                    //損切り(pips)

//***【パラメータ設定・グローバル変数↓】ボリンジャーバンド***//
input int BB_KIKAN = 20;               //ボリンジャーバンドの期間

int waitBB = 0;			               //ボリンジャーバンド待機フラグ
//***【パラメータ設定・グローバル変数↑】ボリンジャーバンド***//
//***【パラメータ設定↓】ADX***//
input int ADX_KIKAN = 14;        // ADX計算期間
input int ADX_SIKII = 25;        // ADXしきい値(例:25以上でトレンド有)
 //***【パラメータ設定↑】ADX***//

string Ea_Name = WindowExpertName();   //チャート上のEA名称を取得(オーダーコメントに使用)

double PipValue;                       //ブローカー桁数に対応した Point 補正
datetime prevtime;                     //ローソク足時間保持用
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){

   //デジットチェック
   if (Digits == 3 || Digits == 5){
      PipValue = Point * 10;   // 例: EURUSD 1.23456 → 1pip = 0.00010
   }else{
      PipValue = Point;        // 例: USDJPY 123.45 → 1pip = 0.01
   }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){

   int total = OrdersTotal();    //ポジショントータル数をセット  
   int ea_order_Type = -1; //0:OP_BUY  1:OP_SELL
   double ea_order_stop_price = 0; //ストップロスレート
   double ea_order_good_price = 0; //利確レート

   //ポジションがない場合はエントリー判定
   if(total == 0){

      bool openBuy  = false;    //買い新規注文判断
      bool openSell = false;    //売り新規注文判断
      
//***【新規注文判断↓】***//

      bool isBullBollinger_S = false;
      bool isBearBollinger_S = false;
   
      //=== ADX取得(最新確定足) ===//
      double adx_cur = iADX(NULL, 0, ADX_KIKAN, PRICE_CLOSE, MODE_MAIN, 1);

      //ボリンジャーバンドの値を取得
      double BB3UP = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側
      double BB3LO = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側
            
      double BB2UP = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
      double BB2LO = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
   
   
      // --- 3σタッチで待機モードに入る ---
      if(Ask > BB3UP)   waitBB =  1; // 買い待ち
      if(Bid < BB3LO)   waitBB = -1; // 売り待ち
      
      // --- 待機モード中の処理(ADXフィルタ付き) ---
      if(waitBB ==  1 &&
         Ask < BB2UP && Bid > BB2LO &&
         adx_cur >= ADX_SIKII)
      {
            isBullBollinger_S = true;  // 買いエントリー
            waitBB  = 0;
      }
      else if(waitBB == -1 &&
        Bid > BB2LO && Ask < BB2UP &&
        adx_cur >= ADX_SIKII)
      {
            isBearBollinger_S = true;  // 売りエントリー
            waitBB  = 0;
      }
      
//***【新規注文判断↑】***//

      //参照するサンプルEAの買いエントリーフラグをセットしてください
      if(isBullBollinger_S){
         openBuy =true;
         ea_order_Type = OP_BUY;
      //参照するサンプルEAの売りエントリーフラグをセットしてください      
      }else if(isBearBollinger_S){
         openSell =true;
         ea_order_Type = OP_SELL;
      }

//***【TP/SL判断↓】***//
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;  
         ea_order_good_price = Bid - TP * PipValue;   
      }
//***【TP/SL判断↑】***//

      if(ea_order_Type > -1){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
      }
   }

   return;
}


//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 orderType:売買(0=BUY, 1=SELL)
//|【引数】 sl:損切り価格  tp:利確価格
//|【引数】 lots:取引ロット数
//|【引数】 orderComment:オーダーコメント
//|【引数】 magic:マジックNo
//|【引数】 maxSpreadPips: 許容スプレッド[Point] (0=制限なし)
//|
//|【戻値】true=成功 false=失敗
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots,
                    string orderComment, int magic, int maxSpreadPoints){
   int    ticket = -1;
   double price  = 0;
   color  clr    = clrNONE;
   double spread = 0;

   // 最大10回リトライ
   for(int retry=0; retry<10; retry++)
   {
      RefreshRates();
      
      // スプレッド取得(MT4表示と同じポイント単位)
      spread = MarketInfo(Symbol(), MODE_SPREAD);

      // スプレッドチェック(maxSpreadPoints=0 の場合はスキップ)
      if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
         Print("スプレッド拡大中(", spread,
               "ポイント) → 待機中 (リトライ=", retry+1, ")");
         Sleep(2000);
         continue;
      }

      // エントリー価格と色を決定
      if(orderType == OP_BUY){
         price = Ask;
         clr   = clrBlue;
      }else if(orderType == OP_SELL){
         price = Bid;
         clr   = clrRed;
      }

      ticket = OrderSend(Symbol(), orderType, lots, price,
                         20, sl, tp, orderComment, magic, 0, clr);

      if(ticket > 0){
         Print("新規注文成功! チケットNo=", ticket,
               " レート=", price, " Lots=", lots,
               " スプレッド=", spread, "ポイント");
         return true;
      }else{
         int err = GetLastError();
         Print("新規注文失敗 エラーNo=", err,
               " リトライ回数=", retry+1);
         Sleep(2000);
      }
   }

   return false;
}
 
スポンサーリンク

ADX利用箇所

ベースはボリンジャーバンドのソースコードで、ADXを72行目の部分で取得しています。

      double adx_cur = iADX(NULL, 0, ADX_KIKAN, PRICE_CLOSE, MODE_MAIN, 1);
  • 今回は 方向判定(+DI/-DI)は使いません
  • あくまで「トレンドがあるかどうか」だけ

ロジックの意味

このEAは以下の三段構えになります:

① ボリンジャーバンド(主役)

  • 3σタッチ → 行き過ぎ検出
  • 2σ内復帰 → 逆張りエントリー候補

② ADX(フィルタ)

  • ADX < 25
    → レンジ気味 → BB逆張りが機能しやすい
  • ADX ≥ 25
    → トレンド発生中 → 無駄な逆張りを防ぐ

👉
「BBが反応しても、ADXが許可しない限り入らない」

ADX連携ボリンジャーバンドEAのエントリーポイント例

このEAのベースソースについて

本EAは当サイトで配布している EAベーステンプレート を元に構築しています。

パラメータとカスタマイズ

今回のパラメータ設定は以下の通り:

  • 取引ロット数(0.01で1000通貨)
  • 利確(pips)
  • 損切り(pips)
  • ボリンジャーバンドの期間(例:20)
  • ADX計算期間
  • ADXしきい値(例:25以上でトレンド有)

👉 値を調整することで、短期トレード〜長期トレードまで幅広く対応可能です。

ADX連携ボリンジャーバンドEAのパラメータ入力設定画面

EAバックテストレポート

USDJPY(H1, 2024/8〜2025/8, 初期証拠金100万円, FXTFヒストリカル)での結果:

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY H11.9358%0.13%67回ADX連携で、エントリーを制限
ADX連携ボリンジャーバンドEAのバックテスト結果

📝 まとめ

ADX連携ボリンジャーバンドEAは、
順張りEAの弱点である「レンジ相場」を避けるための完成形ロジックです。

  • ボリンジャーバンドで方向を判断
  • ADXでトレンドの強さを確認
  • 条件が揃った場面だけを狙う

まずはシンプルな条件でバックテストを行い、
パラメータや条件を調整しながら自分のトレードスタイルに合わせてみてください。

ボリンジャーバンド単体で勝てるようになった方にとって、
ADX連携は次のステップとして非常に有効な考え方です。

コメント

タイトルとURLをコピーしました