概要
プログラミングの基礎も知らん時に始めた言語なんで初歩的な内容になります。
逆に言えばプログラミングを知らずにインジケータをいじってる方には約に立つかも?
けど今更star()使ってる人はおらん気も…
ということで自分用の備忘録です。
違い
IndicatorCounted()
は旧MQL4のint型を返す組込みメソッドで、prev_calculated
は新MQL4のOnCalculate()の第二引数です。
似たような使い方をしますが中身が違います。
また、新MQL4のBars
と新MQL4のOnCalculate()の第一引数のrates_total
も絡む内容なので同じように比較していきます。
インジケーターを立ち上げてから変化していないバーの数を返す
前回OnCalculate()を呼び出した時のバー数を数える
バーの総数を数える
バーの総数を数える
start()とOnCalculate()
どちらも新しいtickを受信した時に実行される組込みメソッドです。
実行されるタイミングは同じなので深く考える必要はありませんが、実行されるタイミングは理解している方がいいので書きました。
比較
※ バーの最大数が100、Oncalculate()の戻り値がrates_total
の場合
1.チャートに表示させたとき
Bars = 100
IndicatorCounted() = 0
rates_total = 100
prev_calculated = 0
2.tickを受信した時
Bars = 100
IndicatorCounted() = 99
rates_total = 100
prev_calculated = 100
3.新しいローソク足が生成された時
Bars = 101
IndicatorCounted() = 99
rates_total = 101
prev_calculated = 100
4.tickを受信した時
Bars = 101
IndicatorCounted() = 100
rates_total = 101
prev_calculated = 101
使用上の違い
prev_calculated
はtickを受信した時rates_total
と同じ値になることです。
Bars - IndicatorCounted();
だとtick受信時に値は1となりますが、lrates_total - prev_calculated;
だと値は0となるため期待通りの動きになりません。
最新のバーだけを繰り返して処理するには
変数を宣言してから、繰り返し計算する回数を+1するだけです。
こうすることでtick受信時のlrates_total - prev_calculated;
は1になり、1回だけ繰り返す処理を実行できるようになります。
limit = rates_total - prev_calculated;
if (prev_calculated > 0) limit++;
新しいバーが生成された時だけ処理するには
処理の途中で何かしらの処理を実行する際は以下の要領にすれば新しいバーが生成された時のみ実行させることができます。
毎度これを書くのは煩雑なのでメソッドにしておくと便利かもです。
if(rates_total != prev_calculated && prev_calculated > 0) {
// 処理内容
}
prev_calculatedの活用方法
アラートやサイン系のインジケータを作ってる時に一番困るのがリペイントすることです。
そこでprev_calculated
が便利になります。
IndicatorCounted()
でも対処できる方法ですがprev_calculated
について検証しているうちに気づきました…
結論としては、新しいバーが生成された時のみ処理を実行するように記述するということです。
要はlrates_total - prev_calculated;
で繰り返し処理を記述すれば、新しいバーが生成された時のみ値が1となりtick受信時には処理が実行されません。
記述は以下のもののみでfor()をlimit回繰り返させるだけです。
ただ計算する箇所が変わるのでtickで処理する場合と同じ処理では期待通りの結果にならないが注意点です。
limit = rates_total - prev_calculated;