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