インジケーター作成08

今回の内容は、「ローソク足を表示させるインジケーターを作成する」です。新規にインジケーターを作成していきます。

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

ローソク足描画のための知識

MT4のインジケーターでの描画タイプの中に、ローソク足そのものを描画するものはありません。縦に伸縮する棒と帯を組み合わせてローソク足っぽく表示させます。

それらは、ヒストグラムで作ります。

MT4のヒストグラムの特徴

サブウィンドウのヒストグラムは、0を起点にプラス方向やマイナス方向に伸びるグラフです。

チャートウィンドウのヒストグラムは、インジケーター用配列2つで1セットとして、縦棒や縦帯を描画します。2つの配列のうち小さい値の方を下端、大きい方を上端として、値の大きい方が棒や帯として描画されます。値の小さい方は、下端を決定するだけでチャート上には描画されません。

チャートウィンドウのヒストグラムは、インジケーター用配列のインデックスの並んだ偶数・奇数(例えば、0と1、2と3)でセットにします。奇数・偶数(1と2など)ではセットにできません。

重なった部分の表示

MetaTrader4のインジケーターは、重なった部分がある場合は後から表示したものが上になり下になったものは隠れてしまいます。例えば、赤色のMAを表示させた後、もう1本同じ設定のMAを黄色で表示させた場合、赤色のMAが隠れて黄色のMAのみが表示されます。
赤色のMAの幅を太くすると、黄色MAの周りが赤いライン表示になります。

1つのカスタムインジケーターで、重なる部分がある場合はインジケーター用配列のインデックス番号が大きい方が上になります。

ローソク足描画の準備

ローソク足描画用のカスタムインジケーターを新規作成していきます。

#property指定

今回は、ヒゲ用と実体用の2セット(4つのインジケーター表示用バッファ)のヒストグラムを使用します。ヒゲ用の縦棒(太さ1)の上に実体の縦帯(太さ3)をかぶせるようにします。

#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_width1 1
#property indicator_color2 clrRed
#property indicator_width2 1
#property indicator_color3 clrLightBlue
#property indicator_width3 3
#property indicator_color4 clrLightPink
#property indicator_width4 3

陽線を青っぽく、陰線を赤っぽく表示するように色を選びました。

配列宣言

インジケーター用配列にする配列をグローバル領域に次のように宣言します。

double blue_shadow[];
double red_shadow[];
double blue_body[];
double red_body[];

バッファの割り当てと描画スタイル指定

OnInit()関数内で、先に宣言しておいた配列をインジケーター用バッファに割り当てて、描画スタイルにヒストグラムを指定します。

   SetIndexBuffer(0, blue_shadow);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(1, red_shadow);
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(2, blue_body);
   SetIndexStyle(2, DRAW_HISTOGRAM);
   SetIndexBuffer(3, red_body);
   SetIndexStyle(3, DRAW_HISTOGRAM);

ローソク足を表示させる処理

OnCalculate()関数内にローソク足を表示させるためのコードを書いていきます。

過去のローソク足も表示させる

これまで学んできた通り、過去のローソク足も描画させるために、次ののようにfor()文を使ったコードにします。

   int i, limit;
   if (prev_calculated == 0)              // 最初
      limit = rates_total - 1;               // 左端のローソク足から全部
   else                                   // それ以外
      limit = rates_total - prev_calculated; // ローソク足増加時「1」、通常「0」
   
   for (i=limit; i>=0; i--)               // limit本前から現在のローソク足を処理
   {
      // ここにローソク足描画用の処理を追加する
   }

インジケーター用配列に値を格納する

今回はローソク足を表示させるので、必要な値はそのローソク足の四本値です。

実体用の配列

実体用の配列blue_body[]とred_body[]には、始値Open[]または終値Close[]の値を代入しますが、どちらにどちらを代入するのかを考えます。

陽線 陰線
値が大きい方 Close blue Open red
値が小さい方 Open □red Close □blue

上の表をみると、陽線でも陰線でも配列blue_body[]にはClose[]の値を代入して、配列red_body[]にはOpen[]の値を代入すればよいことがわかります。

OnCalculate()関数内のfor()文の{}括弧内に次のコードを追加します。

      blue_body[i] = Close[i];
      red_body[i] = Open[i];

ヒゲ用の配列

ヒゲ用の配列blue_shadow[]とred_shadow[]には、高値High[]または安値Low[]の値を代入しますが、どちらにどちらを代入するのかを考えます。

陽線 陰線
値が大きい方 High blue High red
値が小さい方 Low □red Low □blue

上の表をみると、陽線と陰線でそれぞれ違う値を代入する必要があるので、次のように場合分けをして値を代入します。

      if (Open[i] < Close[i]) // 陽線の場合
      {
         blue_shadow[i] = High[i];
         red_shadow[i] = Low[i];
      }
      else                    // 陰線の場合
      {
         red_shadow[i] = High[i];
         blue_shadow[i] = Low[i];
      }

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

まとめ

ローソク足をヒストグラム2セット使用して描画する方法を解説してきました。

ローソク足はインジケーターで表示しなくてもチャート上に表示できるのであまり意味がありませんが、平均足などのローソク足っぽいインジケーターを作成するのに今回の記事が役に立つのではと思います。

今回完成したインジケーターでは、始値と終値が同じ十字線の場合は、赤色になるようにしてありますが、ヒストグラム3セット目を用意して、十字線の為の色を作るのもよいですね。