MQL4の処理は「ティック毎」に実行されます。
実際に「ティック毎」に処理する必要があれば問題ないのですが、ローソク足が更新されたときだけ実行したい場合もあります。
そんなときは、ひと工夫必要になります。
ローソク足が更新されときだけ処理したい場面とは
例えば、
ローソク足が確定していないと、

一旦は、クロスや上抜けしたけど、逆行されて、ローソク足が確定した時には、結局、クロス、上抜けしていない。
ということが発生します。(要はダマシですね)
今回は、ローソク足が更新されときだけ、処理する方法をご紹介します。
ローソク足の更新を判定するポイント
MQL4では、現在のローソク足の本数を取得することが出来ます。
取得した現在のローソク足の本数を退避しておいて、次回の処理のときに比較するようにします。
MQL4は、ティック毎に処理が実行されますが、前回のローソク足の本数が、現在のローソク足の本数と同じ(ローソク足が更新されていない)場合は、処理しないようにすれば、実現できます。
こんなイメージですね。
(初期処理)
・現在のローソク足(10本)→ 本数保存(10本)
:
(ティック処理)
・現在のローソク足(10本)= 本数保存(10本)→ 処理しない。
:
(ティック処理)
・現在のローソク足(11本)> 本数保存(10本)→ 処理する。
・現在のローソク足(11本)→ 本数保存(11本)
:
(ティック処理)
・現在のローソク足(11本)= 本数保存(11本)→ 処理しない。
上記をコード化すればOKです。
ローソク足の更新をMQLで判定するコード
MT4のバージョンや、EAかインジケーターかで、微妙に違うのですが、根本は変わらないです。
今回は、EAを対象に説明します。
MQL4では、「Bars」という変数から、現在のローソク足の本数を取得できます。
コード例)
// 「1つ前の本数」保存用
int oldBars = 0;
// 初期処理
int OnInit()
{
oldBars = Bars; // 現在のローソク足の本数を「1つ前の本数」にセット
}
// ティック毎
void OnTick()
{
int newBars = Bars; // 現在のローソク足の本数を「現在の本数」にセット
// 「現在の本数」「1つ前の本数」を比較
// 同じ場合は、処理を実行せずリターン
if(newBars == oldBars) return;
//
// ここにローソク足が更新された時だけ実行する処理を記述
//
oldBars = newBars; // 「1つ前の本数」に「現在の本数」をセット
}
ローソク足の本数は、Barsの他にも下記のメソッドや変数でも取得できます。
ただ、どれも本数が更新されるタイミングが違うので、使う際には注意して下さい。
IndicatorCounted()、rates_total、prev_calculated