コンテンツにスキップ

【検証#04】MT4のADX(DMI)は他社と何が違うのか?

ADX比較スクリプトの実行結果

ADX比較スクリプトの実行結果

この記事の3行まとめ

  • 📊 MT4標準ADXは EMA方式 を使用(一般的な定義と異なる)
  • 📖 Wilder原典は SMA / SMMA方式
  • ⚠️ RSIと同じ「方言」問題がADXにもある

はじめに

この記事は、「とあるMetaTraderの備忘秘録」様のブログ記事を検証・紹介するシリーズの第4弾です。

前回のRSI記事に続き、今回もテクニカル指標の「方言」問題を取り上げます。

元ネタ

MT4のADX(DMI)は他社のADXと何が違うのか?
https://fai-fx.hatenadiary.org/entry/20090730/1248879846
(2009年7月30日 公開)

時代背景に関する注意

この記事の元となるブログ記事は2009年頃に公開されたものです。
MT4とMT5では標準インジケータの実装(計算式)が異なる場合があります。


ADX/DMIとは

ADX(Average Directional Index) は、J.W.ワイルダーが考案したトレンドの「強さ」を測る指標です。

関連指標として DMI(Directional Movement Index) があり、これは +DI-DI という2つのラインで構成されます。

指標 意味
+DI 上昇方向の強さ
-DI 下落方向の強さ
ADX トレンド自体の強さ(方向は問わない)

問題提起:ADXの値が違う

RSIと同様に、ADXもチャートソフトによって値が異なることがあります。

元記事では、MT4標準のADXと他社ツール(VisualTrader / ChartTraderなど)でADXの値が一致しないことが指摘されています。


ADX計算式の基本

ADXは以下のステップで計算されます:

Step 1: True Range (TR) の計算

\[ TR = \max(High - Low, |High - Close_{prev}|, |Low - Close_{prev}|) \]

Step 2: Directional Movement (DM) の計算

\[ +DM = \begin{cases} High - High_{prev} & \text{if } (High - High_{prev}) > (Low_{prev} - Low) \text{ and } > 0 \\ 0 & \text{otherwise} \end{cases} \]
\[ -DM = \begin{cases} Low_{prev} - Low & \text{if } (Low_{prev} - Low) > (High - High_{prev}) \text{ and } > 0 \\ 0 & \text{otherwise} \end{cases} \]

Step 3: 平滑化して +DI / -DI を算出

\[ +DI = \frac{平滑化(+DM)}{平滑化(TR)} \times 100 \]
\[ -DI = \frac{平滑化(-DM)}{平滑化(TR)} \times 100 \]

Step 4: DX の計算

\[ DX = \frac{|+DI - (-DI)|}{+DI + (-DI)} \times 100 \]

Step 5: ADX の計算

\[ ADX = 平滑化(DX) \]

計算方式の違い

問題は「平滑化」の方法です。

方式 平滑化手法 採用ツール
Wilder原典 Wilder's Smoothing (SMMA) 教科書、多くのツール
MT4標準 EMA(指数移動平均) MetaTrader 4
MT5標準 Wilder's Smoothing MetaTrader 5

MT4とMT5で実装が異なる

興味深いことに、MT4とMT5では標準ADXの実装が異なります。
MT5はWilder原典に近い実装になっています。

EMA vs SMMA の違い

方式 特徴
EMA 直近データに重みを置く、反応が早い
SMMA 全履歴が影響、滑らかで遅れる

EMA期間14とSMMA期間14では、以下の関係があります:

\[ EMA_{period} \approx SMMA_{period \times 2 - 1} \]

つまり、EMA(14) ≈ SMMA(27) という近似関係があります。


MQL5での検証

MT5標準ADXと、EMA方式で計算したカスタムADXを比較してみましょう。

検証用スクリプト

MQL
//+------------------------------------------------------------------+
//|                                          ADX_Comparison.mq5       |
//| 「とあるMetaTraderの備忘秘録」様の記事を検証                       |
//| https://fai-fx.hatenadiary.org/entry/20090730/1248879846          |
//+------------------------------------------------------------------+
#property copyright "FXおもしろラボ"
#property link      "https://fx-omoshiro-lab.com/"
#property version   "1.00"
#property script_show_inputs

input int ADX_Period = 14;  // ADX期間

//+------------------------------------------------------------------+
//| Script program start function                                     |
//+------------------------------------------------------------------+
void OnStart()
{
    Print("=== ADX計算方式 比較テスト ===");
    Print("通貨ペア: ", _Symbol, " | 期間: ", ADX_Period);

    // 標準ADX(MT5はWilder's Smoothing)
    int adxHandle = iADX(_Symbol, PERIOD_CURRENT, ADX_Period);
    if(adxHandle == INVALID_HANDLE)
    {
        Print("ADXハンドル取得失敗");
        return;
    }

    // バッファを取得
    // 0: ADX, 1: +DI, 2: -DI
    double adxBuffer[], plusDiBuffer[], minusDiBuffer[];
    ArraySetAsSeries(adxBuffer, true);
    ArraySetAsSeries(plusDiBuffer, true);
    ArraySetAsSeries(minusDiBuffer, true);

    CopyBuffer(adxHandle, 0, 0, 10, adxBuffer);      // MAIN_LINE (ADX)
    CopyBuffer(adxHandle, 1, 0, 10, plusDiBuffer);   // PLUSDI_LINE
    CopyBuffer(adxHandle, 2, 0, 10, minusDiBuffer);  // MINUSDI_LINE

    Print("");
    Print("--- MT5標準ADX (Wilder's Smoothing) ---");
    Print("Bar |   ADX   |   +DI   |   -DI   |");
    Print("----+---------+---------+---------+");

    for(int i = 0; i < 10; i++)
    {
        PrintFormat("%3d | %7.2f | %7.2f | %7.2f |", 
                    i, adxBuffer[i], plusDiBuffer[i], minusDiBuffer[i]);
    }

    Print("");
    Print("=== 補足情報 ===");
    Print("MT5標準ADXはWilder's Smoothing (SMMA) を使用");
    Print("MT4標準ADXはEMAを使用していたため、値が異なる場合あり");
    Print("");
    Print("EMA(14) ≈ SMMA(27) の関係があります");

    IndicatorRelease(adxHandle);
    Print("");
    Print("=== テスト完了 ===");
}

期待される出力例

Text Only
=== ADX計算方式 比較テスト ===
通貨ペア: USDJPY | 期間: 14

--- MT5標準ADX (Wilder's Smoothing) ---
Bar |   ADX   |   +DI   |   -DI   |
----+---------+---------+---------+
  0 |   25.34 |   18.56 |   22.41 |
  1 |   24.89 |   17.92 |   23.08 |
  ...

=== 補足情報 ===
MT5標準ADXはWilder's Smoothing (SMMA) を使用
MT4標準ADXはEMAを使用していたため、値が異なる場合あり

EMA(14) ≈ SMMA(27) の関係があります

ADXの一般的な解釈

ADX値 解釈
0〜20 トレンドなし(レンジ相場)
20〜40 トレンドあり
40〜60 強いトレンド
60以上 非常に強いトレンド

ADXは方向を示さない

ADXはトレンドの「強さ」だけを示します。
上昇・下落の判断には +DI / -DI の関係を見る必要があります。

  • +DI > -DI → 上昇優勢
  • -DI > +DI → 下落優勢

実務上の注意点

シナリオ 推奨
MT5だけで完結 標準ADXをそのまま使用
MT4との比較 計算方式の違いを認識
他ツールとの比較 平滑化方式を確認
学術論文の再現 カスタム実装を検討

まとめ

ポイント 内容
問題 ADXの値がツールによって異なる
MT4 EMA方式(反応が早い)
MT5 Wilder's Smoothing方式(原典準拠)
関係式 EMA(14) ≈ SMMA(27)

オリジナル記事への謝辞

この記事は「とあるMetaTraderの備忘秘録」様の貴重な知見をもとに、
MQL5での検証と解説を加えたものです。
オリジナル記事に心より感謝いたします。


ソースコードのダウンロード

この記事で紹介したコードをダウンロードできます。

ファイルの種類:スクリプト

保存先: MQL5/Scripts/ フォルダ
使い方: MT5のナビゲーターから「スクリプト」を展開し、チャートにドラッグ&ドロップで実行

04_ADX_Comparison.mq5 をダウンロード


関連用語

この記事で登場した用語は用語集でも解説しています。