MT4でADX EAを作成|MQL4サンプルコード付き解説

EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

はじめに

「ADXを使ったトレンドの強さ判定を、自動売買EAとして動かしてみたい!」
そんな方に向けて、この記事では MT4(MQL4)で動作するADXベースの無料EAサンプルコード を紹介します。

ADXは「トレンドの強弱」を数値化するインジケータで、順張り戦略のフィルタやエントリー条件に幅広く活用されています。
この記事では、ADXを活用したシンプルなEAを実装し、サンプルコードを公開します。


📈 ADXとは?

ADX(Average Directional Index)は、J. Welles Wilder が開発した「トレンドの強弱を数値化するテクニカル指標」です。

  • 値が 25以上 → トレンドが強い
  • 値が 20以下 → レンジ傾向
  • +DI(緑線)と -DI(赤線)のクロス → 売買サイン

👉 裁量トレードでも「トレンド相場かどうかの見極め」によく使われています。


EAの概要とポイント

  • iADX(MT4標準インジケータ)を利用
  • +DIと -DI のクロスで売買エントリー
  • ADXの値がしきい値(例:25)以上の時だけエントリー
  • TP(利確)・SL(損切)をパラメータで設定可能

エントリーロジック解説

  • 買いエントリー
    • ADXがしきい値以上
    • +DI が -DI を上抜け
  • 売りエントリー
    • ADXがしきい値以上
    • -DI が +DI を上抜け

👉 トレンドの強さをフィルタにすることで、レンジでのダマシを減らせます。


⚠️ 注意点

  • ADXは「トレンドの方向」ではなく「強さ」を示す指標
  • 値が大きいからといって常にチャンスとは限らない
  • 移動平均線や他のトレンド系と組み合わせると精度UP
  • マジックナンバーは考慮していません。(このEA単独で動かしてください)

移動平均線を使ったEAサンプルはこちら


ダウンロード

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

“ADX EA” をダウンロード 29_ADX.ex4 – 0 回のダウンロード – 10.03 KB


📜 ADX EAのサンプルコード解説

以下にMQL4サンプルコードを掲載します。
そのままコピーしてMetaEditorに貼り付けてコンパイルすれば動作します。

//+------------------------------------------------------------------+
//|                                                       29_ADX.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)
//***【パラメータ設定↓】ADX***//
input int ADX_KIKAN = 14;              //ADX計算期間(Period)
input int ADX_ENTRY_SIKII = 25;        //しきい値(Threshold、例:25)
//***【パラメータ設定↑】ADX***//

string Ea_Name = "BASE";               //オーダーコメントに使用

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();    //ポジショントータル数をセット  
double ea_order_stop_price=0; //ストップロスレート
double ea_order_good_price=0; //利確レート

//---
   //新しい足ができた時だけやる
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }

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

   bool isBullADX_S = false;
   bool isBearADX_S = false;
   
   double adx_cur     = iADX(Symbol(), 0, ADX_KIKAN, PRICE_CLOSE, MODE_MAIN, 1);      // 最新確定足のADX
   double plusdi_cur  = iADX(Symbol(), 0, ADX_KIKAN, PRICE_CLOSE, MODE_PLUSDI, 1);   // 最新確定足の+DI
   double minusdi_cur = iADX(Symbol(), 0, ADX_KIKAN, PRICE_CLOSE, MODE_MINUSDI, 1);  // 最新確定足の-DI
   
   double plusdi_prev  = iADX(Symbol(), 0, ADX_KIKAN, PRICE_CLOSE, MODE_PLUSDI, 2);  // 1本前の+DI
   double minusdi_prev = iADX(Symbol(), 0, ADX_KIKAN, PRICE_CLOSE, MODE_MINUSDI, 2); // 1本前の-DI
   
   // 買いシグナル: ADXがしきい値以上、かつ +DIが-DIを上抜け
   if(adx_cur >= ADX_ENTRY_SIKII && plusdi_prev < minusdi_prev && plusdi_cur > minusdi_cur)
   {
      isBullADX_S=true;
   }
   // 売りシグナル: ADXがしきい値以上、かつ -DIが+DIを上抜け
   else if(adx_cur >= ADX_ENTRY_SIKII && minusdi_prev < plusdi_prev && minusdi_cur > plusdi_cur)
   {
      isBearADX_S=true;
   }


//***【新規注文判断↑】***//

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


   total=OrdersTotal();
   
   if(total == 0){
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
         
         //新規注文(買い)
         funcOrder_Send(OP_BUY,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;  
         ea_order_good_price = Bid - TP * PipValue;
         
         //新規注文(売り)
         funcOrder_Send(OP_SELL,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;
}

iADX() 関数の解説

今回のEAでは、MT4標準インジケータである ADX(Average Directional Movement Index) を取得するためにiADX() 関数を使っています。

【使用例】

double dADX     = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_MAIN, 1);
double dPlusDI  = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_PLUSDI, 1);
double dMinusDI = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_MINUSDI, 1);

引数の意味

  • 引数1 … 通貨ペア(NULLで現在のチャート)
  • 引数2 … 時間軸(0で現在の時間足)
  • 引数3 … ADX計算期間(例:14)
  • 引数4 … 適用価格(通常はPRICE_CLOSE
  • 引数5 … 取得モード
    • MODE_MAIN … ADX 本体の値
    • MODE_PLUSDI … +DI(プラス方向の強さ)
    • MODE_MINUSDI … -DI(マイナス方向の強さ)
  • 引数6 … バーシフト(0で最新の足、1で1本前の足、2で2本前の足…)

ADX利用箇所

  • 新規注文処理(67〜91行目) … ADX値と +DI / -DI のクロスを判定
  • 決済処理は無し(本EAは「TP/SLで管理」)

ADXの売買判定について

このEAでは以下のルールでエントリーを判定しています:

  • 買いエントリー
    • ADX値がしきい値以上(例:25以上)
    • +DI-DI を上抜けしたタイミング
    if(adx_cur >= ADX_ENTRY_SIKII && plusdi_prev < minusdi_prev && plusdi_cur > minusdi_cur) orderPtn=1; // BUY
  • 売りエントリー
    • ADX値がしきい値以上
    • -DI+DI を上抜けしたタイミング
    else if(adx_cur >= ADX_ENTRY_SIKII && minusdi_prev < plusdi_prev && minusdi_cur > plusdi_cur) orderPtn=2; // SELL

👉 クロス判定は「1本前と最新確定足の大小関係が逆転したか」で判定しています。

ADX EAのトレードイメージ

ADXEAのトレードイメージ
  • ADXが「強いトレンド」を示している(21以上 ※パラメータ設定)
  • +DIと-DIのクロスで方向を決定(☆1)
  • 条件を満たしたら新規エントリー(既存ポジションが無い場合のみ)
  • TP/SLで決済

☆1:

  • +DIが-DIを上抜け → 上昇トレンド開始 → BUY
  • -DIが+DIを上抜け → 下降トレンド開始 → SELL

新規、決済注文について

「新規注文処理」の関数については、当サイト共通の関数を利用しています。
どのEAでもコピペで使えるように統一してあります。

👉 EAで使う 新規・変更・決済注文関数の解説記事 はこちら


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

今回のEAで設定できる主なパラメータ:

  • 取引ロット数(0.01で1000通貨)
  • 利確(pips)
  • 損切り(pips)
  • ADX計算期間(Period)
  • しきい値(Threshold、例:25)
ADXEAのパラメータ設定

👉 しきい値を高めにするとエントリー回数が減り、精度が上がる傾向があります。


EAバックテストレポート

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

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY M151.4146%0.55%311回2024年10月から2025年6月にかけて好調

まとめ

ADX EAは、トレンドの強さを条件にしたエントリー を実現できます。

  • レンジを避けてトレンドに乗れる
  • 単独でも使えるが、他インジとの組み合わせで精度UP
  • パラメータ次第でスキャルからスイングまで対応可能

まずはサンプルコードを試して、バックテストを行ってみてください。シンプルにADXのみでも十分な結果ですが、さらにロジック改良やフィルタ追加をすれば理想的なEAになりそうです。


✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント