インジケーター作成08

ローソク足を表示させるインジケーターを作成してみよう!

ここでは、ローソク足(みたいな形のもの)を表示させるインジケーターの作成方法を解説します。

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

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

にゃんたにゃんた

博士ぇー!インジケーターの描画タイプにローソク足が無いにゃ!!

Dr.EADr.EA

縦に伸縮する棒と帯を組み合わせてローソク足っぽく見せるんじゃよ

にゃんたにゃんた

棒と帯??

Dr.EADr.EA

ヒストグラムで表示させるのじゃよ

MT4のヒストグラムの特徴

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

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

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

重なった部分の表示

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

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

ローソク足描画の準備

Dr.EADr.EA

ローソク足描画用のカスタムインジケーターを新規作成していくぞい!新規作成ボタンで新規インジケーターファイルのコードを表示させるのじゃ

にゃんたにゃんた

あれれ、どうやるんだっけ??

にゃんたは振出しに戻った。
インジケータ―作成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];
      }
Dr.EADr.EA

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

#property strict
#property indicator_chart_window
#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[];

//+------------------------------------------------------------------+
int 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);

   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, 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[i] = Close[i];
      red_body[i] = Open[i];
      
      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];
      }
   }
   
   return(rates_total);
}

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

あとがき

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

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

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