インジケーター作成07

今回の内容は、「矢印(アロー)を表示させるインジケーターにする」です。前回完成したMACDとそのシグナルラインを描画するインジケーターに矢印が表示されるようにカスタマイズします。

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

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

矢印表示の準備

MACDがシグナルラインを下から上にクロス(ゴールデンクロス)した場合に水色の上矢印を、逆のクロス(デッドクロス)をした場合にピンク色の下矢印を表示させます。

インジケーターバッファを増やす

表示用インジケーターバッファを4に増やします。

#property indicator_buffers 4   // 表示用インジケーターバッファ個数

OnInit()関数内で設定するインジケーターバッファ個数も2つ増やして6にします。

   IndicatorBuffers(6);   // インジケータ―用配列個数

色と大きさを指定する

矢印の色と大きさを次のように指定します。

#property indicator_color3 clrLightBlue// 3つ目の色
#property indicator_width3 2           // 3つ目の太さ
#property indicator_color4 clrLightPink// 4つ目の色
#property indicator_width4 2           // 4つ目の太さ

矢印用配列をインジケーター用配列に割り当てる

矢印用配列を次のように追加します。

double up[];  // 上矢印用配列
double dn[];  // 下矢印用配列

OnInit()関数内で、次のようにインジケーター用配列に割り当てて描画スタイルをアローに設定します。ここで、fast_emaとslow_emaのインデックスを2つずつ増やします。

   SetIndexBuffer(2, up);           // 配列「up」をインジ用に割り当て
   SetIndexStyle(2, DRAW_ARROW);    // 描画スタイルをアローと定義
   SetIndexBuffer(3, dn);           // 配列「dn」をインジ用に割り当て
   SetIndexStyle(3, DRAW_ARROW);    // 描画スタイルをアローと定義
   
   SetIndexBuffer(4, fast_ema);     // 配列「fast_ema」をインジ用に割り当て
   SetIndexBuffer(5, slow_ema);     // 配列「slow_ema」をインジ用に割り当て

矢印の形を指定する

SetIndexArrow()関数で、矢印の形を指定します。

   SetIndexArrow(2, 233);           // 上矢印
   SetIndexArrow(3, 234);           // 下矢印

アローの番号(アローコード)は、mql4リファレンスのConstants, Enumerations and Structures / Object Constants の中の【Wingdings】や【Arrow codes】から選びます。下記ウェブページでも参照できます。

MQL4 Reference Wingdings
MQL4 Reference Arrow codes

矢印を表示させる処理

矢印用の配列upやdnに値を格納することで、矢印が表示されます。逆に初期値と同じEMPTY_VALUEを代入すると矢印は消えます。

条件を満たした場合のみ表示させる

OnCalculate()関数内のfor()文の中で、MACDシグナル算出コードの下に、次のコードを追加します。

      if (i + Signal_Period < Bars)
      {
         // 一旦矢印を消す
         up[i] = EMPTY_VALUE;
         dn[i] = EMPTY_VALUE;

         // 矢印表示判定
         if (macd[i+1] <= macd_sig[i+1] && macd[i] > macd_sig[i]) up[i] = macd_sig[i];
         if (macd[i+1] >= macd_sig[i+1] && macd[i] < macd_sig[i]) dn[i] = macd_sig[i];
      }

MACDシグナルを算出し始めるローソク足の次のローソク足から矢印表示判定をしています。
上記コードでは、一旦矢印を消してから再度表示判定をしていますが、表示判定のif()文にelseを追加して矢印を消してもかまいません。

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

まとめ

シグナル矢印(アロー)を表示させるインジケーターにするには、描画スタイルでDRAW_ARROWを指定することに加え、SetIndexArrow()関数でアローの形を指定します。

表示条件不満足の場合には、アローを消すことも忘れないようにしましょう。