足(バー)作成直後のみ仕掛ける方法
確定した足をエントリーの条件にしているEA等では、1本の足(バー)で1回しか仕掛けたくないことがありますよね。新しい足が作成されてエントリー条件が変更されるまで、永遠と仕掛けてしまいますので。そんな時に役に立つのが1本の足で1回だけ仕掛ける機能です。
この機能を使うことで、こうした無駄な仕掛けを排除することが可能になります。
というわけで、1本の足で1回だけ仕掛ける機能を紹介します。意外とシンプルです。
まずは、extern変数に以下を追加します。
extern string Note02_9 = "--- entry only once per 1 bar --------------------------------"; extern bool UseEntryPer1Bar = true;
UseEntryPer1Barをtrueにすれば、この機能が有効になります。続いて、グローバル変数に以下を追加します。
// 1本の足で1回だけ仕掛ける int gPrvBars = 0;
前回の値動き時の足(バー)の本数を格納しておくための変数です。そして、OnInit()に以下を追加します。
gPrvBars = Bars;
BarsはMQL4の定義済み変数と呼ばれるもので、現在のチャートの足の本数を返してくれます。さらに、OnTick()の冒頭に以下を追加します。
int currentBars = Bars;
また、仕掛けの前に、以下を追加します。これがキモになります。
// ----------------------------------------------------------------- // 仕掛けフィルター(1本の足で1回だけ仕掛ける) // ----------------------------------------------------------------- if(UseEntryPer1Bar){ // 新しい足を生成した時ではない場合は、仕掛けない if(currentBars == gPrvBars){ gPrvBars = currentBars; return; } }
現在の足の本数と前回の足の本数を比較し、一致していれば新しい足は作成されていないと判断できるため、これ以上処理が進まないようにreturnしています。新しい足が作成された瞬間のOnTick()では、currentBarsがgPrvBarsより1だけ大きな値になります。だから一致しなくなるんですね。
最後に、OnTick()内でreturnを記述している直前に以下を追加して完成です。現在の足の本数を前回の足の本数として格納しています。
gPrvBars = currentBars;
サンプルEA
五月雨の説明でイメージが沸きづらいと思いますので、サンプルEAを載せておきます。そろそろサンプルEAが膨大な量になってきましたね…。