インジケーター作成04

今回の内容は、「2本目のライン指数平滑移動平均線(EMA)を表示させる」です。

前回までの記事の続きですので、まだ読んでない方はまずはそちらから読み進めてください。

「MT4インジケーター作成入門」の記事一覧

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

EMAを追加する

インジケーター用配列を追加

「#property」で始まる部分を次のように変更・追加します。

#property indicator_buffers 2
#property indicator_color2 clrYellow   // 2つ目の色 黄色
#property indicator_width2 2           // 2つ目の太さ 2

表示用インジケーターバッファを2つと定義して、2つ目の色と太さの初期設定をします。

そして、SMA用のパラメーターと配列の宣言と同じように、次のようにEMA用のパラメーターと配列を追加します。

extern int  EMA_Period  = 20;
double ema[];

OnInit()関数内に次のコードを追加して、インジケーターバッファ1番として割り当てとスタイルの設定をします。

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

EMAの計算式

はじめは単純移動平均で計算して、その後からは次の式で算出します。

(前回EMA × (期間-1) + 今回終値 × 2) ÷ (期間+1)

「前回EMA少なめ、終値増しで。」って感じですね。

EMAの計算式をコード化する

for()文内で算出開始のシフト数にも気を付けて、EMAの計算式を次のようにコード化します。

   if (i + EMA_Period - 1 <= Bars - 1)
   {
      if(i + EMA_Period - 1 == Bars - 1) // 最初はSMAで算出
      {
         ema[i] = 0;
         for (j=0; j<EMA_Period; j++) ema[i] += Close[i+j];
         ema[i] /= EMA_Period;
      }
      else // その後は前回EMAと終値で算出
      {
         ema[i] = ema[i+1] * (EMA_Period - 1) + Close[i] * 2;
         ema[i] /= EMA_Period + 1;
      }
   }

MT4のEMAと同じにする

MetaTrader4のインジケーター「Moving Average」でEMAを表示させると、ラインの始まり方が先ほど計算したEMAのライン表示と異なります。

MT4流のEMAを描画するには先ほどのコードの代わりに次のようなコードにします。

   if(i == Bars - 1) ema[i] = Close[i];
   else
   {
      ema[i] = ema[i+1] * (EMA_Period - 1) + Close[i] * 2;
      ema[i] /= EMA_Period + 1;
   }

意外とシンプルになりましたね。

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

まとめ

追加した指数平滑移動平均線EMAは正常に表示されましたか?
今回と同様の手順で3本目のラインやさらに多くのラインを追加していけるのでぜひ挑戦してみてください。

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