このコードは、最新足が出たときにだけ動く基本的なループ処理です。
最新足以外のデータで処理をする場合などに利用できます。
この処理について詳しく解説されているサイトを見つけることができかったので、このループでやっていることを説明します。
最新足しか動かないはずなのに、なんでループが動いているんだろう?と、悩んでいる方必見です。
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 limit=rates_total-prev_calculated;
for(int i=0; i<limit; i++)
{
Print("is loop");
}
return(rates_total);
}
プログラム解説
部品単位で説明します。
OnCalculate()
OnCalculate()はチャートのティックが動いたときに起動するメソッドです。例えば、1分間に100回ティックが起動すれば、100回OnCalculate()が起動します。
rates_total
rates_totalは、インジケーターでカウントしたローソクの個数です。
prev_calculated
prev_calculatedは、前回OnCalculate()でreturnしたrates_totalです。
OnCalculate()でrates_totalをreturnしなければprev_calculatedはずっと0のままなので、returnで返す値には注意が必要です。
状態 | rates_total | prev_calculated |
---|---|---|
1.ロード時 | 2085 | 0 |
2.ティック | 2085 | 2085 |
3.新しい足出現 | 2086 | 2085 |
4.ティック | 2086 | 2086 |
int limit
int limitはループの終了条件になる変数です。
for(int i=0; i<limit; i++)
ループの終了条件です。
int i=0;は、インデックスの初期値です。用途としては、Close[i]のように、どの足を指定するのかに使います。
i<limit;は、ループの終了条件です。
その条件を満たしている間はループ処理が続行されます。iがlimitより小さい間だけ条件がtrueとなり、ループ続行となります。
つまり、limitが1以上の時にだけ条件がtrueとなり、limit=0の時は条件がfalseとなります。
なお、最新足しか動かないループ条件でも、インジケーターが初期化される処理(ロードやコンパイル)OnCalculate()が起動していないためprev_calculatedの値は0になっており、rates_totalの件数分だけループが行われます。