【MT4】MQL:足が変わった時に1回だけ(バーの始値のみ)処理を行う方法

新しい足が出来た時に1回だけ処理したって時ないですか?
いろいろな方法があるようですが、
今回はVolumeを使った方法を書いていきたいと思います。

Volumeとは

Volumeは、tick出来高が格納されてる変数になります。
tickが動くと、1,2,3,4・・・と増えていく感じですね。

Volumeは配列になっているため、
Volume[0]などとして値を取得します。
Volume[0]が今のバーの値
Volume[1]が一つ前のバーの値
Volume[2]が二つ前のバーの値
が入っています。

つまり、Volume[0]が1の時が、新しいバーが出来た瞬間ってなります。
という事で、以下のように判断を入れてあげると
バーの最初の1回だけ処理を実行できるといえそうです。

if (Volume[0] == 1) {
    //ここに処理を書く
}

理屈の上では、
この方法でバーの最初の1回だけ処理を実行できるはずですが、
OnTick()などの中で実際にVolume[0]値を取得してみると
「1」の値が取れずに、「2」が最初に取れたりする事があります。
おそらく、OnTickで処理が行われる前に、Volume[0]の値が変わってしまってるのだと思われます。

そこで、Volumeで判断する場合、ちょっと工夫する必要があります。

//グローバル変数を宣言
int gVolumeBak = 0;

void OnTick()
{
  if (Volume[0] < gVolumeBak) {
   //バーの始まりで1回だけ処理したい内容をここに記載する

     //初期化
     gVolumeBak = 0;
  } else {
   //今のVolume[0]をセット
     gVolumeBak = Volume[0];
  }
}

グローバル変数を一つ用意し、そこにVolume[0]の値を記憶させておきます。
新しい足が出来た時には、Volume[0]は小さな値になるため
記録したVolume[0]と現在のVolume[0]の値を比較して
小さい値になってれば新しい足が出たと判断できます。

こうする事で、最初にとれたVolume[0]が仮に「2」だとしても
正しく機能してくれます。

まとめ

他にはTimeを使ったり、Barsをつかったりする方法で
バーの最初の1回だけ処理する事が出来ます。
どの方法も基本的にはグローバル変数に現状の値を保持し
新しいバーの状態と比較して判断するって形になるかと思います。

今のところ上記の方法で、私の環境ではうまく機能してます。
参考になれば幸いです。


この記事が気に入ったらサポートをしてみませんか?