カスタム指標

これは、カスタム指標の作成に使用される関数群です。これれの関数はエキスパートアドバイザーとスクリプトでは使用できません。

関数

アクション

SetIndexBuffer

指定された指標バッファをdouble 型の 1 次元の動的配列と関係づけます。

IndicatorSetDouble

double 型の指標プロパティの値を設定します。

IndicatorSetInteger

int 型の指標プロパティの値を設定します。

IndicatorSetString

string 型の指標プロパティの値を設定します。

PlotIndexSetDouble

double 型の指標線プロパティの値を設定します。

PlotIndexSetInteger

int  型の指標線プロパティの値を設定します。

PlotIndexSetString

string 型の指標線プロパティの値を設定します。

PlotIndexGetInteger

integer 型の指標線プロパティの値を返します。

指標プロパティは、コンパイラディレクティブか関数を使用して設定することが出来ます。よりよく理解するためには指標スタイルの例を勉強することをお勧めします。

カスタム指標に必要な全ての計算は、所定の OnCalculate() 関数に配置されなければなりません。OnCalculate() 関数呼び出しの短い形式を使用する場合、下記の様になります。

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

すると rates_total 変数は、指標値計算のための入力パラメータとして渡されたprice[] 配列の要素の合計数を含みます。

prev_calculated パラメータは前の呼び出しでの OnCalculate() の実行の結果です。これは、指標値を計算するためのアルゴリズムの保存や整理を可能にします。例えば、現在の値 rates_total = 1000 でprev_calculated = 999、各指標バッファの 1 つの値の計算を行うので充分です。

price 入力配列のサイズに関する情報が利用出来ない場合は、それぞれの指標バッファの1000 個の値の計算を行うことが必要になります。OnCalculate() の最初の呼び出しで、prev_calculated = 0 です。price[] 配列が変わった場合 prev_calculated も 0 です。

begin パラメータは、計算のためのデータを含まない price 配列の初期値の数を示します。例えば、(初めの37の値が計算されていない)ACオシレーターの値を入力パラメータとして使用された場合、begin = 37 です。例として、単純な指標を見てみましょう。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- Label1 をプロットする
#property indicator_label1 "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//--- 指標バッファ
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
void OnInit()
 {
//--- 指標バッファマッピング
  SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
 }
//+------------------------------------------------------------------+
//| カスタム指標の反復関数                                                |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
 
 {
//---
  Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }

「ナビゲータ」ウィンドウからACオシレーター指標ーのウィンドウにドラッグして、計算が前の指標の値に基づいて行われることを示します。

以前に取り付けられた指標の値に基づいた指標の計算

結果として、OnCalculate() の最初の呼び出しで prev_calculated の値はゼロに等しく、以降の呼び出しでは (価格チャートでバーの数が増えるまで)rates_total 値に等しくなります。

The begin parameter shows the number of initial bars, on which values are omitted

begin パラメータの値は初期のバーの数と等しくなります。この指標の論理に従って、アクセラレータ指標の値は計算されていません。Accelerator.mq5 のカスタム指標のコードをみると、OnInit() 関数にて以下の行が見られます。

//--- インデックスが描画される最初のバーを設定する
  PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) 関数を使用して、計算のために受け入れる必要のないカスタム指標のゼロ指標配列に架空の初期値を設定します(empty_first_values)。従って、下記のメカニズムがあります。

  1. 別のカスタム指標の計算に使用されるべきではない指標の初期値を設定する
  2. 別のカスタム指標を呼び出した時、計算の論理を通さずに無視される初期値についての情報を得る