Transferring Indicators from MQL4 to MQL5
http://www.mql5.com/en/articles/66
一見同じように書いてあるのですが、全く違います。
そんなわけで、コードを書いて挙動の確認です。
int OnCalculate (const int rates_total, // size of input time series
const int prev_calculated, // bars handled in previous call
const datetime& time[], // Time
const double& open[], // Open
const double& high[], // High
const double& low[], // Low
const double& close[], // Close
const long& tick_volume[], // Tick Volume
const long& volume[], // Real Volume
const int& spread[]) // Spread
{
Print("rates_total = ", rates_total, " Bars = ", Bars);
Print("prev_calculated = ", prev_calculated,
" IndicatorCounted() = ", IndicatorCounted());
return(0);
}
チャートに表示させたとき(バーの数を1000とします)
rates_total = 1000
Bars = 1000
prev_calculated = 0
IndicatorCounted() = 0
↓
次の瞬間(tickが来た瞬間)
rates_total = 1000
Bars = 1000
prev_calculated = 1000
IndicatorCounted() = 999
・
・
・
新しいロウソク足が出現
rates_total = 1001
Bars = 1001
prev_calculated = 1000
IndicatorCounted() = 999
↓
次の瞬間
rates_total = 1001
Bars = 1001
prev_calculated = 1001
IndicatorCounted() = 1000
というわけで、明らかに違います。安易にIndicatorCounted()からprev_calculatedに置き換えてもうまく動作しない場合があります。
もう一度リファレンスでIndicatorCounted()を読むと、
The function returns the amount of bars not changed after the indicator had been launched last.
この関数はインジケーターを立ち上げてから変化していないバーの数を返します。
これは慣れ親しんだものなので分かります。確定していない最新のバーを除いた数を返すものです。
では、prev_calculatedとは何でしょうか?
実はコメントに書いてありました。
bars handled in previous call 前回OnCalculateが呼ばれたときに扱ったバーの数
一つ前のrates_totalの値です。対象としているものが違いますよね。これで納得しました。
それで新しいバーができたときだけ、何かしたいということがあると思います。そのときは、
if(rates_total != prev_calculated && prev_calculated > 0){...}
こう書くことになるでしょうか。


私もY君さんを見習い、ロンドさんとY君さんの分、お祈りさせていただきました
行ってきたのは能勢妙見山、開運の神社で星の動きに関わる神様です
ちょっと珍しいかも知れません
まあ、車で行ったのですがね、山の中を1時間以上誰とも会わずにたどり着きましたよ。
へんぴな山の頂上にあるので、山道が怖い怖い(笑)
新年の時期になると道路が凍結するので、今の時期が年内最後のチャンスでした。
私もY君さんを見習い行ってみましたが、なかなか良い気分でしたよ。
ロンドさんも、ぜひ近所にお参りを(笑)
おー!そうでしたか。
よくは知りませんが、能勢妙見山って有名な所じゃないでしょうか。
調べてみたら自分も電車で行ける距離です。
気分転換に行ってみたいです。^^
細かな説明非常に助かりました。
prev_calculatedはreturn(rates_total)で返すのがポイントかなぁと。