2014年11月14日

[MT4] IndicatorCounted() と prev_calculated は全く違う

IndicatorCounted()とprev_calculatedは同じものだと勘違いしてました。それによってインジケーターが思ったように動かず苦労しました。あせあせ(飛び散る汗)


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){...}


こう書くことになるでしょうか。
posted by ロンド at 18:41| Comment(5) | 日記・つぶやき | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
お早うございます、遅くなりましたがお参りに行ってきましたので
私もY君さんを見習い、ロンドさんとY君さんの分、お祈りさせていただきました

行ってきたのは能勢妙見山、開運の神社で星の動きに関わる神様です
ちょっと珍しいかも知れません

まあ、車で行ったのですがね、山の中を1時間以上誰とも会わずにたどり着きましたよ。
へんぴな山の頂上にあるので、山道が怖い怖い(笑)

新年の時期になると道路が凍結するので、今の時期が年内最後のチャンスでした。

私もY君さんを見習い行ってみましたが、なかなか良い気分でしたよ。

ロンドさんも、ぜひ近所にお参りを(笑)





Posted by ギリシャショック at 2014年11月19日 11:51
>ギリシャショックさん

おー!そうでしたか。
よくは知りませんが、能勢妙見山って有名な所じゃないでしょうか。
調べてみたら自分も電車で行ける距離です。
気分転換に行ってみたいです。^^
Posted by ロンド at 2014年11月19日 15:54
やっと謎が解けました。ありがとうございます。
Posted by at 2016年08月01日 09:43
これがわからず変な挙動になやんでいました。
細かな説明非常に助かりました。
Posted by at 2017年04月06日 17:04
>名無しさん

prev_calculatedはreturn(rates_total)で返すのがポイントかなぁと。
Posted by ロンド at 2017年04月08日 20:55
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]