インジケーター作成06

インジケーターとしての詳細設定をして完成度を高めよう!

ここでは、前回完成したインジケーターをカスタマイズして、説明文を追加する方法やライン名や短縮名を指定する方法を解説します。

記事一覧で前回までの記事をチェックしよう!
「MT4インジケーター作成入門」の記事一覧

前回記事のおさらい

Dr.EADr.EA

前回はサブウィンドウにMACDを表示させるようにしたぞい
次のコードが前回完成したインジケーターじゃ

#property strict
#property indicator_separate_window
#property indicator_buffers 2          // 表示用インジケーターバッファ 2つ
#property indicator_color1 clrRed      // 1つ目の色 赤色
#property indicator_width1 2           // 1つ目の太さ 2
#property indicator_color2 clrYellow   // 2つ目の色 黄色
#property indicator_width2 2           // 2つ目の太さ 2

extern int  FastEMA_Period = 12;       // 短期EMAの期間
extern int  SlowEMA_Period = 26;       // 長期EMAの期間
extern int  Signal_Period  = 9;        // MACDシグナルライン期間

double macd[];                         // MACD用配列
double macd_sig[];                     // MACDシグナル用配列
double fast_ema[];                     // 短期EMA用配列
double slow_ema[];                     // 長期EMA用配列

//+------------------------------------------------------------------+
int 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[]をインジ用に割り当て
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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[])
{
   int i, j;
   int limit;
   if (prev_calculated == 0)              // 最初
      limit = rates_total - 1;               // 左端のローソク足から全部
   else                                   // それ以外
      limit = rates_total - prev_calculated; // ローソク足増加時「1」、通常「0」
   
   for (i=limit; i>=0; i--)               // limit本前から現在のローソク足を処理
   {
      fast_ema[i] = iMA(NULL, 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Fast EMA
      slow_ema[i] = iMA(NULL, 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Slow EMA
      
      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;
      }
   }
   
   return(rates_total);
}

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

インジケーターの詳細設定をする

前回までは、MACDの2本のラインを描画する必要最低限のコードを書きました。ここでは、細かい部分の表示設定をします。

説明文を追加する

次のように「#property description」で、設定ダイアログの「バージョン情報」タブにその説明文を表示させることができます。

#property description "説明文"

次のコードは、「#property description」の2行を追加したコードです。

#property copyright "Dr.EA公式ブログ"
#property link      "https://www.dr-ea.com/meta-blog/"
#property version   "1.00"
#property description "このインジケーターはブログ記事MT4インジケーター作成入門シリーズのサンプルインジケーターです。"
#property description "上の「Dr.EA公式ブログ」へのリンクからブログトップページをご覧いただけます。"

上記のコードでは、次の画像のように表示されます。

property_description

各ラインにラベルを設定する

SetIndexLabel()関数でラベルを設定すると、ポインターをラインに合わせたときに表示されるライン名が設定したラベル名で表示されます。ラベルはデータウィンドウにも反映されます。

SetIndexLabel()関数について

SetIndexLabel()関数の()括弧内は次のように指定します。

SetIndexLabel(バッファインデックス, ラベル文字)

バッファインデックス
インジケーターバッファインデックスの番号を指定します。

ラベル文字
表示させるラベル文字を文字列で指定します。

次のコードをOnInit()関数内に追加すると、その次の画像のような表示になります。

   SetIndexLabel(0, "MACD");        // ラベルを設定
   SetIndexLabel(1, "Signal");      // ラベルを設定

SetIndexLabel画像

インジケーターの短縮名を設定する

次のようにIndicatorShortName()関数でインジケーターの短縮名を設定すると、サブウィンドウの左上に反映されます。パラメーター設定を短縮名に入れるとパラメーター設定の確認がしやすくなります。

IndicatorShortName(短縮名)

次のコードをOnInit()関数内に追加すると、その次の画像のような表示になります。

   string short_name = "MACD(" + (string)FastEMA_Period + ",";
   short_name += (string)SlowEMA_Period + ",";
   short_name += (string)Signal_Period + ")";
   IndicatorShortName(short_name);

ShortName

MetaTrader4のMACDを真似てみる

MT4のMACDと同じ表示にするには、次のように色と太さの初期値設定の変更と、MACDシグナルの描画スタイルをドットに指定します。

#property indicator_color1 clrSilver   // 1つ目の色
#property indicator_width1 1           // 1つ目の太さ
#property indicator_color2 clrRed      // 2つ目の色
#property indicator_width2 1           // 2つ目の太さ
#property indicator_style2 STYLE_DOT   // 2つ目のスタイル

最後に、OnInit()関数内でMAACDのラインをヒストグラムに変更して完成です。

   SetIndexStyle(0, DRAW_HISTOGRAM);// 描画タイプをヒストグラムと定義

インジケーターイメージ

Dr.EADr.EA

今回完成ファイルのコードがこちら

#property copyright "Dr.EA公式ブログ"
#property link      "https://www.dr-ea.com/meta-blog/"
#property version   "1.00"
#property description "このインジケーターはブログ記事MT4インジケーター作成入門シリーズのサンプルインジケーターです。"
#property description "上の「Dr.EA公式ブログ」へのリンクからブログトップページをご覧いただけます。"
#property strict

#property indicator_separate_window
#property indicator_buffers 2          // 表示用インジケーターバッファ 2つ
#property indicator_color1 clrSilver   // 1つ目の色
#property indicator_width1 1           // 1つ目の太さ
#property indicator_color2 clrRed      // 2つ目の色
#property indicator_width2 1           // 2つ目の太さ
#property indicator_style2 STYLE_DOT   // 2つ目のスタイル

extern int  FastEMA_Period = 12;       // 短期EMAの期間
extern int  SlowEMA_Period = 26;       // 長期EMAの期間
extern int  Signal_Period  = 9;        // MACDシグナルライン期間

double macd[];                         // MACD用配列
double macd_sig[];                     // MACDシグナル用配列
double fast_ema[];                     // 短期EMA用配列
double slow_ema[];                     // 長期EMA用配列

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   IndicatorBuffers(4);             // インジケータ―用配列は4つ
   
   SetIndexBuffer(0, macd);         // 配列 macd[]をインジ用に割り当て
   SetIndexStyle(0, DRAW_HISTOGRAM);// 描画タイプをヒストグラムと定義
   SetIndexBuffer(1, macd_sig);     // 配列 macd_sig[]をインジ用に割り当て
   SetIndexStyle(1, DRAW_LINE);     // 描画タイプをラインと定義
   
   SetIndexBuffer(2, fast_ema);     // 配列 fast_ema[]をインジ用に割り当て
   SetIndexBuffer(3, slow_ema);     // 配列 slow_ema[]をインジ用に割り当て
   
   SetIndexLabel(0, "MACD");        // ラベルを設定
   SetIndexLabel(1, "Signal");      // ラベルを設定
   
   // ShortNameを設定
   string short_name = "MACD(" + (string)FastEMA_Period + ",";
   short_name += (string)SlowEMA_Period + ",";
   short_name += (string)Signal_Period + ")";
   IndicatorShortName(short_name);
   
   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[])
{
   int i, j;
   int limit;
   if (prev_calculated == 0)              // 最初
      limit = rates_total - 1;               // 左端のローソク足から全部
   else                                   // それ以外
      limit = rates_total - prev_calculated; // ローソク足増加時「1」、通常「0」
   
   for (i=limit; i>=0; i--)               // limit本前から現在のローソク足を処理
   {
      fast_ema[i] = iMA(NULL, 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Fast EMA
      slow_ema[i] = iMA(NULL, 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Slow EMA
      
      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;
      }
   }
   
   return(rates_total);
}

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

あとがき

今回は、インジケーターの表示の詳細設定をして完成度を高めるというテーマで解説してきました。やり方さえ分かれば簡単ですね^^

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