LoginSignup
5
6

More than 1 year has passed since last update.

【MQL4】IndicatorCounted()とprev_calculated

Last updated at Posted at 2021-05-21

概要

プログラミングの基礎も知らん時に始めた言語なんで初歩的な内容になります。
逆に言えばプログラミングを知らずにインジケータをいじってる方には約に立つかも?
けど今更star()使ってる人はおらん気も…
ということで自分用の備忘録です。

違い

IndicatorCounted()は旧MQL4のint型を返す組込みメソッドで、prev_calculatedは新MQL4のOnCalculate()の第二引数です。
似たような使い方をしますが中身が違います。
また、新MQL4のBarsと新MQL4のOnCalculate()の第一引数のrates_totalも絡む内容なので同じように比較していきます。

IndicatorCounted()
インジケーターを立ち上げてから変化していないバーの数を返す
prev_calculated
前回OnCalculate()を呼び出した時のバー数を数える
Bars
バーの総数を数える
rates_total
バーの総数を数える

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;
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6