【検証#05】MT4の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
//+------------------------------------------------------------------+
//| 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を採用したのか¶
正確な理由は不明ですが、以下の推測があります:
- 計算の簡略化: SMAはEMAより計算が単純
- ロシアの独自解釈: MT4はロシア製であり、独自仕様が多い
- バグの固定化: 初期実装のままになった可能性
まとめ¶
| ポイント | 内容 |
|---|---|
| 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 をダウンロード
関連用語¶
この記事で登場した用語は用語集でも解説しています。