iMACD関数の書式や引数の説明を読んでも、実際にどうコードに組み込んで動かせばいいのか分からない——という人は多いのではないでしょうか。
この記事では、iMACD関数の書式・引数の説明に加えて、実際にMetaEditorでコンパイルしてチャート上にMACDの値を表示できるサンプルコードを紹介します。
iMACD関数
MACDとはMoving Average Convergence Divergenceの略語です。
MACDは移動平均線を応用したテクニカル指標になります。
MACDは以下の2つのラインを用いて相場を分析します。
- MACDライン:長短2つの移動平均の差を1本のラインで表す
- シグナルライン:MACDラインの値をさらにある期間で平均を表す
MACDは2本の線のみが表示されているので、初心者から上級者まで使いやすいテクニカル指標です。
iMACD関数とはMACDの値を取得するために使用します。
MACDについては以下の記事を参照してください。

MACDの計算式
MACDの計算式は以下のようになっています。
- MACD = 12日EMA-26日EMA
- シグナル = MACDの9日EMA
主に12日・26日・9日という3つのEMAの数値は変更可能なパラメーターですが、
上級者を除いては、このパラメーターをそのまま使う人がほとんどです。
また、EMAというのは指数平滑移動平均線のことです。
指数平滑移動平均線の計算の仕方は次のとおりです。
n日EMA=(EMAy×(n-1)+P×2)÷(n+1)
※nはパラメーター、移動平均線の何日移動に当たる部分。
※EMAyは昨日のEMA、Pは本日の価格(終値)
iMACD関数の書式

iMACD関数の書式について説明します。
double iMACD( string symbol, // 通貨ペア int timeframe, // 時間軸 int fast_ema_period,// ファーストEMA期間 int slow_ema_period,// スローEMA期間 int signal_period, // シグナルライン期間 int applied_price, // 適用価格 int mode, // ラインインデックス int shift // シフト );
iMACD関数の引数の説明
iMACD関数の引数の説明します。
| 型 | 項目名 | 説明 |
|---|---|---|
| string | symbol | シンボル名 |
| int | timeframe | 時間枠 |
| int | fast_ema_period | ファーストEMAの期間 |
| int | slow_ema_period | スローEMAの期間 |
| int | signal_period | シグナルの期間 |
| int | applied_price | 価格 |
| int | mode | ライン番号 |
| int | shift | いくつ前の値を取得するか |
string symbol
symbolは通貨ペアをの値を計算する通貨ペア名を指定します。
通貨ペア名を指定せず、チャートの通貨ペアのMACDの値を取得したい場合はNULLにします。。
int timeframe
timeframeはMACDを計算する時間軸の指定します。
| 種類 | 定数 | 説明 |
|---|---|---|
| PERIOD_CURRENT | 0 | 現在の時間足 |
| PERIOD_M1 | 1 | 1分足 |
| PERIOD_M5 | 5 | 5分足 |
| PERIOD_M15 | 15 | 15分足 |
| PERIOD_M30 | 30 | 30分足 |
| PERIOD_H1 | 60 | 1時間足 |
| PERIOD_H4 | 240 | 4時間足 |
| PERIOD_D1 | 1440 | 日足 |
| PERIOD_W1 | 10080 | 週足 |
| PERIOD_MN1 | 43200 | 月足 |
int fast_ema_period
fast_ema_periodはファーストEMA(短期指数移動平均線)の値を計算する期間を指定します。
int slow_ema_period
slow_ema_periodはスローEMA(長期指数移動平均線)の値を計算する期間を指定します。
int signal_period
signal_periodはMACDのシグナルの値を計算する期間を指定します。
int applied_price
applied_priceはMACDの値の計算に使用する価格データの指定します。
| 種類 | 定数 | 説明 |
|---|---|---|
| PRICE_CLOSE | 0 | 終値 |
| PRICE_OPEN | 1 | 始値 |
| PRICE_HIGH | 2 | 高値 |
| PRICE_LOW | 3 | 安値 |
| PRICE_MEDIAN | 4 | |
| PRICE_TYPICAL | 5 | |
| PRICE_WEIGHTED | 6 |
int mode
modeはライン番号を指定します。
- MACDの値を取得したい場合:0 または MODE_MAIN
- MACDシグナル線の値を取得したい場合:1 または MODE_SIGNAL
int shift
shiftはMACDの値を取得したいバーの位置の指定します。
- 現在のバーであれば:0
- 1本前のバーであれば:1
- 2本前のバーであれば:2
と言う形で記述します。
iMACD関数を使ってMACDをチャートに表示する
ここまでの書式・引数を使って、実際にMACDライン・シグナルラインの現在値をチャート上にコメント表示するインジケーターを作ってみましょう。MetaEditorの「ファイル」→「新規作成」→「カスタムインジケーター」を選び、名前を入力して完成すると、OnInit()・OnDeinit()・OnCalculate()の3つの関数だけが書かれたひな形が開きます。このひな形に以下のコードを追記してください。
//+------------------------------------------------------------------+
//| iMACD_Demo.mq4 |
//| Copyright 2020, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
#property indicator_chart_window
input int FastEMA = 12;//ファーストEMA期間
input int SlowEMA = 26;//スローEMA期間
input int SignalPeriod = 9; //シグナル期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");//表示していたコメントを消す
}
//+------------------------------------------------------------------+
//| 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[])
{
double macdMain = iMACD(NULL,0,FastEMA,SlowEMA,SignalPeriod,PRICE_CLOSE,MODE_MAIN,0);//MACDラインの現在値
double macdSignal = iMACD(NULL,0,FastEMA,SlowEMA,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,0);//シグナルラインの現在値
Comment("MACDライン: ", DoubleToString(macdMain, 5), "\n",
"シグナルライン: ", DoubleToString(macdSignal, 5));
return(rates_total);
}
//+------------------------------------------------------------------+
OnCalculate()はカスタムインジケーター専用の関数で、新しいティックが来るたびに自動的に呼び出されます。iMACD()のmode引数をMODE_MAIN(0)とMODE_SIGNAL(1)で切り替えて2回呼び出すことで、MACDラインとシグナルラインそれぞれの現在値を取得しています。インジケーターを外したときにコメント表示が残り続けないよう、OnDeinit()でComment(“”)を呼んで後始末しておきましょう。
まとめ
今回は、iMACDについて解説しました。
MACDはテクニカル指標でも非常にポピュラーなので、しっかりと理解して使いこなせるようにしましょう。
コメント