- 多重エントリーを制御したい
- 始まり値でエントリーするEAを作りたい
- バックテストの精度を上げたい
他にもあると思います。
ってことで、今回は、足が変わったときに1回だけ処理を行う方法を書いていきたいと思います。
足が変わった時に1回だけ(バーの始値のみ)処理を行う方法
私が使ってる方法が下の2つです。
- Volume[]を使う
- 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・サラリーマン投資家ランキング

