はじめに
「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ファイルのダウンロードはこちら👇
“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のトレードイメージ

- 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)

👉 しきい値を高めにするとエントリー回数が減り、精度が上がる傾向があります。
EAバックテストレポート
USDJPY(H1, 2024/08〜2025/08, 初期証拠金100万円, FXTFヒストリカル)での結果:
通貨ペア・時間足 | PF | 勝率 | 最大DD | 取引回数 | 備考 |
---|---|---|---|---|---|
USDJPY M15 | 1.41 | 46% | 0.55% | 311回 | 2024年10月から2025年6月にかけて好調 |

まとめ
ADX EAは、トレンドの強さを条件にしたエントリー を実現できます。
- レンジを避けてトレンドに乗れる
- 単独でも使えるが、他インジとの組み合わせで精度UP
- パラメータ次第でスキャルからスイングまで対応可能
まずはサンプルコードを試して、バックテストを行ってみてください。シンプルにADXのみでも十分な結果ですが、さらにロジック改良やフィルタ追加をすれば理想的なEAになりそうです。
✅ 他にも多数のEAサンプルを公開中!
今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。
自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。
EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!
コメント