- 多重エントリーを制御したい
- 始まり値でエントリーする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・サラリーマン投資家ランキング