IndicatorCounted()とprev_calculatedは性質が似ているので勘違いしやすいですが、最新足のカウントを含まない一瞬のタイミングがありますので、正しく使い分けるために整理しておきたいと思います。
次のコードで検証してみた結果を整理します。
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[])
{
Print("rates_total = ", rates_total, " Bars = ", Bars, " prev_calculated = ", prev_calculated, " IndicatorCounted() = ", IndicatorCounted());
return rates_total;
}
状態 | rates_total | Bars | prev_calculated | IndicatorCounted() |
---|---|---|---|---|
1.ロード時 | 2085 | 2085 | 0 | 0 |
2.ティック | 2085 | 2085 | 2085 | 2084 |
3.新しい足出現 | 2086 | 2086 | 2085 | 2084 |
4.ティック | 2086 | 2086 | 2086 | 2085 |
この結果から分かることは、次の通りです。
- rates_totalはBarsと同じ数値を持ち、インジケーターでカウントしたローソクの個数
- prev_calculatedはOnCalculateでreturnしたrates_totalの数
- 新しいローソクが出現した瞬間はIndicatorCounted()が前回足をカウントしていない
- prev_calculatedとIndicatorCounted()が更新されるタイミングは同じ
簡単に整理すると、3.新しい足が出来てOnCalculateが起動するタイミングでは、rates_totalをreturnしていないので、数値が2ズレると言うことです。
目次
どちらの方法でローソク足をカウントすれば良いのか
prev_calculatedとIndicatorCounted()は更新されるタイミングが同じですので、どちらを使っても狙った処理が出来ますので、意味を理解していれば好きな方を使えば良いと思います。
- prev_calculatedは、前回のrates_totalの数で、未確定足をカウントに含んでいます。
- IndicatorCounted()は未確定足をカウントに含んでいません。
個人的にはprev_calculatedを使うのが良いと思いますが。
新しい足が出来たタイミングだけ処理をする方法
つまり、rates_totalとprev_calculatedの数値が異なる場合は、新しい足が出来た瞬間だということになりますので、
新しい足が出来たタイミングで何かの処理を走らせたい場合は次の条件で判断可能です。
bool isNewBar(int rates_total, int prev_calculated)
{
bool ret = false;
if(rates_total != prev_calculated && prev_calculated > 0)
{
ret = true;
}
return ret;
}