新しい足が出来た時に1回だけ処理したって時ないですか?
  • 多重エントリーを制御したい
  • 始まり値でエントリーするEAを作りたい
  • バックテストの精度を上げたい

他にもあると思います。

ってことで、今回は、足が変わったときに1回だけ処理を行う方法を書いていきたいと思います。

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

私が使ってる方法が下の2つです。

  1. Volume[]を使う
  2. Barsを使う

どちらも基本的な考え方は同じで、グローバル変数で現在の値を保持して、

その値が変わったかどうかを判断する感じです。

1.Volume[]を使う方法

では、Volume[]を使う方法から行きます。

Volumeは、tick出来高が格納されています。
Volume[0]が現在のバーの出来高、Volume[1]が一つ前のバーの出来高、Volume[2]が・・・と続きます。
Volume[0]には、tickが動くたびに、1,2,3,4・・と増えていきます。
つまり、バーが出来た最初が「1」になるってことですね。

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

とすればよい事になります。

が、しかし!

Volume[0]ですが、OnTick()で中身を見た時に、いきなり「2」になってる事もあったりします。。。

ですので、ちょっと工夫する必要があります。

//グローバル変数を宣言
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]が小さい値になるため
(基本的には1からスタート)最初のIFが機能して、1回だけ処理する事が出来ます。
この方法だと、仮に「1」じゃなくて「2」が取得されたとしても
うまく機能します。

2.Barsを使う

次にBarsを使う方法を説明します。

Barsには、現在のチャートの中のバーの数が格納されています。

ですので、このバーの数が変わったかどうかで、足が増えたかどうかを判断する方法です。

//グローバル変数
int gPrvBars = 0;

int OnInit()
{
   //起動時に現在のバーを記録
   gPrvBars = Bars;
}

void OnTick()
{
   int iCurrentBars = Bars;
   if(iCurrentBars == gPrvBars){
      gPrvBars = iCurrentBars;
      return;
   } else {
   //バーの始まりで1回だけ処理したい内容をここに記載する

      //今のバー数を記録
      gPrvBars = iCurrentBars;
   }
}

こんな感じで、バートの数が変わったって事は、
新しいバーが出現したと判断します。
その時点でグローバル変数に現在のバー数を記録する事で、
新しいバーの判断を行うようにします。

この方法にも 注意点が!

MT4では、チャートの最大バー数を設定できます。

この最大バー数を小さい値にしてると、
Barsの値がずっと、この最大数になってしまい
新しいバーが出現したって判断が出来なくなりますので、
最大バー数はある程度大きな数字に設定しましょう!

最大バー数は、「オプション」ー「チャート」の下の画像の場所になります。
99999999999999と大きな数字を閉じてOKを押せば、
なたの環境で設定できる最大バー数になります。

まとめ

どうでしたか?
他にもTimeを使ったりする事も出来るかと思います。

参考になれば幸いです。

ブログランキングに参加してます。皆様の応援が情報発信の励みになります(^^)

FX・サラリーマン投資家ランキング