【MQL4】ローソク足が更新されときだけ処理する方法

MQL4の処理は「ティック毎」に実行されます。

実際に「ティック毎」に処理する必要があれば問題ないのですが、ローソク足が更新されたときだけ実行したい場合もあります。

そんなときは、ひと工夫必要になります。

スポンサーリンク

ローソク足が更新されときだけ処理したい場面とは

例えば、

MA移動平均線のクロスが確定したら、処理したい。
ローソク足が、MA移動平均線を上に(下に)抜けたのが確定したら、処理したい。

ローソク足が確定していないと、

一旦は、クロスや上抜けしたけど、逆行されて、ローソク足が確定した時には、結局、クロス、上抜けしていない。

ということが発生します。(要はダマシですね)

今回は、ローソク足が更新されときだけ、処理する方法をご紹介します。

ローソク足の更新を判定するポイント

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

タイトルとURLをコピーしました