インジケーター作成05

今回の内容は、「2つのEMAからMACDを算出してサブウィンドウに描画する」です。

前回までの記事をまだ読んでない方は、まずはそちらから読み進めてください。
「MT4インジケーター作成入門」の記事一覧

前回完成ファイル【Sample_Indicator_04.mq4】をダウンロード

サブウィンドウに表示するように定義する

前回完成ファイルの「#property indicator_chart_window」を次のコードに変更します。

#property indicator_separate_window

この時点でコンパイルして表示させてみるとサブウィンドウに表示されるのがわかります。

2つのEMAを表示させてみる

短期EMAと長期EMAの2つを表示させるため、次の変更編集をします。

  • パラメーター名変更
    • SMA_Period → FastEMA_Period
    • EMA_Period → SlowEMA_Period
  • 配列名変更
    • buf → fast_ema
    • ema → slow_ema
  • OnCalculate()関数内のfor()文内のコードを変更

パラメーター名変更と配列名変更

パラメーターと配列の宣言部分を次のようにします。

extern int  FastEMA_Period  = 12;      // 短期EMAの期間
extern int  SlowEMA_Period  = 26;      // 長期EMAの期間
double fast_ema[];                     // 短期EMA用配列
double slow_ema[];                     // 長期EMA用配列

OnInit()関数内を次のコードのようにします。

SetIndexBuffer(0, fast_ema);        // 配列「fast_ema」をインジ用に割り当て
SetIndexStyle(0, DRAW_LINE);        // 描画スタイルをラインと定義
SetIndexBuffer(1, slow_ema);        // 配列「slow_ema」をインジ用に割り当て
SetIndexStyle(1, DRAW_LINE);        // 描画スタイルをラインと定義

OnCalculate()関数内のfor()文内のコードを変更

OnCalculate()関数のfor()文内を次のコードに変更します。

   fast_ema[i] = iMA(NULL, 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
   slow_ema[i] = iMA(NULL, 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);

短期EMAと長期EMAの値をそれぞれiMA()関数で取得しています。
(MACDの値はiMACD()関数を使わずに計算することにします。汗)

この時点で、2つのEMAがサブウィンドウに表示されるようになっています。

MACDを表示

MACD表示の準備

MACDとMACDシグナルを表示させるように改変していきます。

パラメーターとインジケーター用配列として次のコードを追加します。

extern int  Signal_Period  = 9;        // MACDシグナルライン期間
double macd[];                         // MACD用配列
double macd_sig[];                     // MACDシグナル用配列

次に、OnInit()関数内で配列macd[]と配列macd_sig[]をインジケーター用配列0番と1番に割り当てます。
一方、配列fast_ema[]と配列slow_ema[]は表示はしないがインジケーター用配列のようにローソク足本数分の要素数を自動的に持つようにしたいので、次のようにします。

表示用インジケーターバッファ(配列)は2つのまま(コード変更なし)

#property indicator_buffers 2          // 表示用インジケーターバッファ2つ

OnInit()関数内を次のようにします。

IndicatorBuffers(4);                // インジケータ―用配列は4つ
SetIndexBuffer(0, macd);            // 配列「macd」をインジ用に割り当て
SetIndexStyle(0, DRAW_LINE);        // 描画スタイルをラインと定義
SetIndexBuffer(1, macd_sig);        // 配列「macd_sig」をインジ用に割り当て
SetIndexStyle(1, DRAW_LINE);        // 描画スタイルをラインと定義
SetIndexBuffer(2, fast_ema);        // 配列「fast_ema」をインジ用に割り当て
SetIndexBuffer(3, slow_ema);        // 配列「slow_ema」をインジ用に割り当て

IndicatorBauffers()関数に4を渡すことで、表示用配列2つに加えてさらに2つのインジケーター用配列を割り当てることができるようになります。
インジケーター用配列2番3番にそれぞれ短期EMAと長期EMAの配列を割り当てます。

MACDとMACDシグナルを算出する

MACDは次の計算式で算出されます。

MACD = 短期EMA - 長期EMA

MACDシグナルはそのMACDの単純移動平均線です。
OnCalculate()関数のfor()分内に、次のコードを追加すれば完成です。

   macd[i] = fast_ema[i] - slow_ema[i];   // MACD
   if (i + Signal_Period <= Bars)         // MACDシグナル
   {
      macd_sig[i] = 0;
      for (j=0; j<Signal_Period; j++) macd_sig[i] += macd[i+j];
      macd_sig[i] /= Signal_Period;
   }

今回の完成ファイル【Sample_Indicator_05.mq4】をダウンロード

まとめ

MACDとMACDシグナルはラインで正常に表示されましたか?
次回は、今回のMACDインジケーターファイルを編集して、見た目の整え方を解説したいと思います。

ではまた、次回をお楽しみに!