共通ライブラリのインクルード

//MQL4互換ライブラリ(MQL5のみ)
#include "LibMQL4.mqh"

カスタム指標プログラムでは、共通ライブラリのなかのLibMQL4.mqhを利用します。これは、MQL5でMQL4と互換性をもたせるためのライブラリです。テクニカル指標関数、カスタム指標関数をMQL4と同じ書式で使えるようにします。

プログラムのプロパティ

#property indicator_chart_window       //チャートウィンドウに表示
#property indicator_buffers 1          //指標バッファの数
#property indicator_plots 1            //表示させる指標バッファの数
#property indicator_type1 DRAW_LINE    //指標の種類
#property indicator_color1 clrRed      //ラインの色
#property indicator_width1 2           //ラインの太さ
#property indicator_style1 STYLE_SOLID //ラインの種類

#propertyから始まる命令で、指標のスタイルや色などプログラム全体の設定をします。詳しくはこちらを参照してください。

指標バッファ用の配列の宣言

double Buf[];

表示させたい指標の値を格納するための配列を宣言します。配列のサイズは指定しません。

初期化関数

int OnInit()
{
   //配列を指標バッファに関連付ける
   SetIndexBuffer(0, Buf);
   //時系列配列に設定
   ArraySetAsSeries(Buf, true);
   return(INIT_SUCCEEDED);
}

プログラムの最初に1回だけ実行する関数です。ここでは、SetIndexBuffer()で、上で宣言した配列を指標バッファに関連付けます。さらにArraySetAsSeries()で、その配列を時系列配列に設定します。

時系列配列とは、配列のインデックスが最新のバーで0から始まり、過去にさかのぼるにつれ、1、2、3・・・と増えていく配列のことです。カスタム指標プログラムの場合、必ずしも時系列配列に設定する必要はありませんが、MQL4との互換性を考慮して時系列配列にしています。

指標計算関数

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[])
{
   //時系列配列に設定
   ArraySetAsSeries(open, true);
   ArraySetAsSeries(high, true);
   ArraySetAsSeries(low, true);
   ArraySetAsSeries(close, true);

   int limit = rates_total - prev_calculated; //プロットするバーの数
   for(int i=0; i<limit; i++)
   {
      Buf[i] = (open[i]+high[i]+low[i]+close[i])/4;
   }
   return(rates_total-1);
}

ティックの度に実行され、指標を表示する関数です。指標バッファに関連付けられた配列に値を代入することで、指標値が表示される仕組みとなっています。

チャートの4本値はopen[]high[]low[]close[]という配列に格納されています。ArraySetAsSeries()で、利用する配列を時系列配列に設定しておきます。

この例は4本値の平均を表示するという、特に意味のないカスタム指標ですが、変数i0からlimit-1まで繰り返してチャート全体の指標を表示させています。

rates_total、prev_calculatedについて

limitの計算に利用するrates_totalprev_calculatedについて説明します。rates_totalはチャート全体のバーの数です。バーが増えるにつれて増えていきます。