【カスタム指標】

【カスタム指標】

以下は、カスタム指標(インジケーター)の作成に使用される関数群です。

この関数はエキスパートアドバイザー(EA)とスクリプトでは使用できません。

関数

アクション

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 です。

要は各項目の機能はこのようになっています。

int OnCalculate(
                const int rates_total,    // 現在のティックでの履歴の利用可能なバーの数
                const int prev_calculated,// 前のティックで計算されたバーの数
                const int begin,          // 最初のバーのインデックス
                const double &price[]     // 計算に使う価格の配列
                )

 

例として、単純なインジケーターコードを見てみましょう。

#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 値に等しくなります。

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

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

 

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

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