コンテンツにスキップ

【検証#05】MT4のMACDは一般的なMACDと違う?

MACD比較インジケータの表示例

MACD比較インジケータの表示例

この記事の3行まとめ

  • 📊 MT4/MT5ともに標準MACDはシグナル線にSMAを使用(独自仕様)
  • 📈 一般的なMACD(TradingViewなど)はEMA方式
  • ⚠️ MT5でも計算式は変わっていないことに注意が必要

はじめに

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

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

元ネタ

VTCT系のMACD をMT4で再現する
https://fai-fx.hatenadiary.org/entry/20091005/1254729091
(2009年10月5日 公開)

時代背景に関する注意

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


MACDとは

MACD(Moving Average Convergence Divergence) は、ジェラルド・アペルが開発したトレンド系オシレーターです。

一般的なMACD計算式

要素 計算式
MACDライン EMA(12) - EMA(26)
シグナルライン MACDラインのEMA(9)
ヒストグラム MACDライン - シグナルライン

MT4標準MACDの「謎」

MT4標準の iMACD には興味深い特徴があります:

要素 MT4標準 一般的な定義
MACDライン EMA(12) - EMA(26) 同じ
シグナルライン SMA(9) EMA(9)
表示方式 ヒストグラム ライン

MT4の独自仕様

MT4標準MACDはシグナル線にSMAを使用しています。
また、MACDラインがヒストグラム表示、シグナル線だけがライン表示という独自UIです。


MT5ではどうなった?

(2026/01/27 追記・修正)

検証の結果、MT5の標準MACDもシグナル線にSMAを使用していることが判明しました。 ドキュメント等ではEMAと記述されている場合もありますが、実機での動作はMT4の仕様(SMA)を引き継いでいます。

要素 MT5標準 一般的な定義
MACDライン EMA(12) - EMA(26) 同じ
シグナルライン SMA(9) EMA(9)

つまり、MT5に移行しても、標準インジケータを使う限り「方言」はそのままであるという点に注意が必要です。 TradingViewなどの他ツールと数値を合わせたい場合は、カスタムインジケータを使用する必要があります。


SMAとEMAの違い

シグナル線がSMAかEMAかで、反応速度に違いが出ます。

方式 特徴
SMA 平均的、遅延が大きい
EMA 直近に重みを置く、反応が早い

実際のチャートで比較すると、EMAシグナル線の方がクロスタイミングが早いことがわかります。


MQL5での検証コード(インジケータ版)

スクリプトよりも視覚的に分かりやすい、比較用インジケータを作成しました。 これをチャートに適用すると、標準(SMA)一般(EMA) のズレを確認できます。

ファイル名: 05_MACD_Comparison_Indi.mq5
保存先: MQL5\Indicators

MQL
//+------------------------------------------------------------------+
//|                                     05_MACD_Comparison_Indi.mq5   |
//| MQL検証シリーズ #05 検証インジケータ(修正版)                        |
//| https://fx-omoshiro-lab.com/mql-verification/05-macd-difference   |
//+------------------------------------------------------------------+
#property copyright "FXおもしろラボ"
#property link      "https://fx-omoshiro-lab.com/"
#property version   "1.01"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3

//--- plot MACD
#property indicator_label1  "MACD"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- plot Signal_Standard (MT5 Standard)
#property indicator_label2  "Signal(Standard)"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- plot Signal_General (General EMA Definition)
#property indicator_label3  "Signal(General EMA)"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrBlue
#property indicator_style3  STYLE_DOT
#property indicator_width3  1

input int InpFastEMA = 12;     // Fast EMA Period
input int InpSlowEMA = 26;     // Slow EMA Period
input int InpSignal  = 9;      // Signal Period

//--- buffers
double BufferMACD[];
double BufferSignalStandard[]; // MT5標準(実はSMA?)
double BufferSignalGeneral[];  // 一般的なEMA

//--- handle
int HandleMACD;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    //--- indicator buffers mapping
    SetIndexBuffer(0, BufferMACD, INDICATOR_DATA);
    SetIndexBuffer(1, BufferSignalStandard, INDICATOR_DATA);
    SetIndexBuffer(2, BufferSignalGeneral, INDICATOR_DATA);

    //--- setting plot names
    PlotIndexSetString(0, PLOT_LABEL, "MACD(" + IntegerToString(InpFastEMA) + "," + IntegerToString(InpSlowEMA) + ")");
    PlotIndexSetString(1, PLOT_LABEL, "SignalStandard(" + IntegerToString(InpSignal) + ")");
    PlotIndexSetString(2, PLOT_LABEL, "SignalGeneralEMA(" + IntegerToString(InpSignal) + ")");

    //--- get standard MACD handle
    HandleMACD = iMACD(_Symbol, PERIOD_CURRENT, InpFastEMA, InpSlowEMA, InpSignal, PRICE_CLOSE);
    if(HandleMACD == INVALID_HANDLE)
    {
        Print("Failed to get MACD handle");
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    //--- check calculations
    if(rates_total < InpSlowEMA)
        return(0);

    int limit = prev_calculated - 1;
    if(limit < 0) limit = 0;

    int to_copy = rates_total - limit;

    double work_macd[];
    double work_signal[];

    if(CopyBuffer(HandleMACD, 0, 0, to_copy, work_macd) <= 0) return(0);
    if(CopyBuffer(HandleMACD, 1, 0, to_copy, work_signal) <= 0) return(0);

    double alpha = 2.0 / (InpSignal + 1.0);

    for(int i = 0; i < to_copy; i++)
    {
        int buf_index = limit + i;

        // バッファの更新(標準インジケータの値をコピー)
        BufferMACD[buf_index] = work_macd[i];
        BufferSignalStandard[buf_index] = work_signal[i];

        // 一般的なEMAシグナルの計算
        // EMA = alpha * Current + (1-alpha) * Prev

        if(buf_index == 0)
        {
            BufferSignalGeneral[buf_index] = BufferMACD[buf_index];
        }
        else
        {
            double prev = BufferSignalGeneral[buf_index - 1];

            // データ初期の安定化対策(簡易的)
            if(prev == 0.0 || prev == EMPTY_VALUE)
                 BufferSignalGeneral[buf_index] = BufferMACD[buf_index];
            else
                 BufferSignalGeneral[buf_index] = alpha * BufferMACD[buf_index] + (1.0 - alpha) * prev;
        }
    }

    return(rates_total);
}

なぜMT4はSMAを採用したのか

正確な理由は不明ですが、以下の推測があります:

  1. 計算の簡略化: SMAはEMAより計算が単純
  2. ロシアの独自解釈: MT4はロシア製であり、独自仕様が多い
  3. バグの固定化: 初期実装のままになった可能性

まとめ

ポイント 内容
MT4/MT5標準 シグナル線にSMA使用(独自仕様)
一般的なMACD シグナル線にEMA使用
対策 他ツールと合わせるならカスタムインジケータ必須

オリジナル記事への謝辞

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


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

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

ファイルの種類

05_MACD_Comparison.mq5: スクリプト → MQL5/Scripts/ に保存、チャートにドラッグ&ドロップで実行
05_MACD_Comparison_Indi.mq5: インジケータ → MQL5/Indicators/ に保存、チャートに適用して表示

05_MACD_Comparison.mq5 をダウンロード 05_MACD_Comparison_Indi.mq5 をダウンロード


関連用語

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