iMACD関数の書式や引数の説明を読んでも、実際にどうコードに組み込んで動かせばいいのか分からない——という人は多いのではないでしょうか。

この記事では、iMACD関数の書式・引数の説明に加えて、実際にMetaEditorでコンパイルしてチャート上にMACDの値を表示できるサンプルコードを紹介します。

iMACD関数

MACDとはMoving Average Convergence Divergenceの略語です。

MACDは移動平均線を応用したテクニカル指標になります。

MACDは以下の2つのラインを用いて相場を分析します。

  • MACDライン:長短2つの移動平均の差を1本のラインで表す
  • シグナルライン:MACDラインの値をさらにある期間で平均を表す

MACDは2本の線のみが表示されているので、初心者から上級者まで使いやすいテクニカル指標です。

iMACD関数とはMACDの値を取得するために使用します。

MACDについては以下の記事を参照してください。

FXのMACDの計算式・設定値やオススメの手法についてわかりやすく解説してみた
MACDとは「Moving Average Convergence/Divergence Trading Method」の略で、 日本語では移動平均収束拡散手法と言います。 MACDは2本の移動平均線を用いることで、相場の周期とタイミングを…

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関数の書式

MQL インジケーター作成 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
中央値
(高値+安値)÷2
PRICE_TYPICAL 5
代表値
(高値+安値+終値)÷3
PRICE_WEIGHTED 6
加重終値
(高値+安値+終値+終値)÷4

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);
  }
//+------------------------------------------------------------------+
Copy

OnCalculate()はカスタムインジケーター専用の関数で、新しいティックが来るたびに自動的に呼び出されます。iMACD()のmode引数をMODE_MAIN(0)とMODE_SIGNAL(1)で切り替えて2回呼び出すことで、MACDラインとシグナルラインそれぞれの現在値を取得しています。インジケーターを外したときにコメント表示が残り続けないよう、OnDeinit()でComment(“”)を呼んで後始末しておきましょう。

まとめ

今回は、iMACDについて解説しました。

MACDはテクニカル指標でも非常にポピュラーなので、しっかりと理解して使いこなせるようにしましょう。

関連記事