インジケータの変更無バー数の取得 IndicatorCounted 関数

関数

カスタムインジケータ関数

IndicatorCounted 関数

この関数は、インジケータが起動後に変化していなかったバーの数を取得します。

これは、カスタムインジケータが再計算する必要があるデータの範囲を決定するのに役立ちます。MQL4では、新たなデータが追加されるとインジケータは自動的に再計算されます。ただし、全てのデータを再計算するとパフォーマンスに影響を及ぼす可能性があるため、通常は最後の計算以降に追加されたデータだけを対象に再計算を行います。これは、特に大量のデータを扱う場合に有効です。

このような場合に、IndicatorCounted関数を利用することで、既に計算済みの部分を省略し、新たに追加されたデータだけを対象に計算を行うことができます。これにより、計算の効率を大幅に向上させることができます。

しかし、現在の仕様では、IndicatorCounted関数はMQL4では推奨されておらず、代わりにOnCalculate関数の prev_calculatedパラメータの使用が推奨されています。この prev_calculatedパラメータも同様に、最後の計算後に新たに追加されたデータの数を示します。

 

データ型と構成・戻り値

int IndicatorCounted();

戻り値は、インジケータが起動後に変化していなかったバーの数を返します。

引数 [0] 

引数無し。

使用例

IndicatorCounted関数による追加バーのみの計算

IndicatorCounted関数を使って、最後に計算されたデータの後から計算を開始します。このようにして、新たに追加されたデータだけを対象に計算を行うことができます。

※このコード中で使用されている start関数はMQL4の古いバージョンで使用されていたもので、現在は非推奨になっています。現在のMQL4では、代わりにOnCalculate関数を使用します。なお、このコードはあくまで IndicatorCounted関数の使用例を示すためのもので、最新のMQL4プログラミングでは使われていません。

次のコードはインジケータ用のコードです。インジケータ用コードの作成方法についてはこちらを参考にしてください。

コード

// IndicatorCounted関数による追加バーのみの計算
#property strict
#property indicator_chart_window // メインウィンドウに表示
#property indicator_buffers 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow

double Buf1[];

int OnInit() {
  IndicatorBuffers(1);
  SetIndexBuffer(0, Buf1);
  return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars = IndicatorCounted();
   int limit;
   
   if(counted_bars < 0) {
      return(-1);
   }
   if(counted_bars > 0) {
      limit = Bars - counted_bars;
   }else{
      limit = Bars - 1;
   }
   
   for(int i=limit; i>=0; i--) {
      Buf1[i] = High[i];
   }
   return(0);
}

インジケータ用コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

結果


OnCalculate関数を使ってコードを書くと次のようになります。

コード

// OnCalculate関数による追加バーのみの計算
#property strict
#property indicator_chart_window // メインウィンドウに表示
#property indicator_buffers 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow

double Buf1[];

int OnInit() {
  IndicatorBuffers(1);
  SetIndexBuffer(0, Buf1);
  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 start;
  if(prev_calculated > 0) {
    start = prev_calculated - 1;
  }else{  
    start = 0;
  }

  for(int i=start; i<rates_total; i++) {
    Buf1[i] = High[i];
  }
   return(rates_total);
  }

インジケータ用コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

タイトルとURLをコピーしました