MQL4 How to Avoid Running on Each Tick

ほとんどのエキスパートアドバイザーはリアルタイムで動作し、各見積もりに長所と短所があります。 プラスの面としては、ティックごとに実行することで EA が最小の価格変動を捕捉できるため、スキャルピング システムに最適です。


ただし、欠点は、ティックごとにリアルタイムで取引を実行すると、多くのシステムが誤ったシグナルに対して脆弱になることです。


場合によっては、取引条件をバーごとに 1 回だけチェックする方が良い場合があります。 バーが閉じるのを待つことで、その状態が発生し、信号が有効であることを確認できます。 この MQL4 の記事で各ティックでの実行を回避する方法を学び、Expert Advisor をプログラムする方法を学びましょう終値を使用し、誤ったシグナルを避けるためです。


バーごとに 1 回取引するということは、ストラテジー テスターの結果がより正確で関連性のあるものになることも意味します。 MT4 ストラテジー テスターの固有の制限により、ティックは通常 M1 データに基づいてモデル化されるため、テスト モデルとして「すべてのティック」を使用すると、信頼性の低いバックテスト結果が生成されます。 ライブ取引で行われる取引は、ストラテジー テスターで行われる取引と必ずしも一致するとは限りません。


しかし、取引を終値に置き、テスト パターンとして「オープンのみ」を使用することで、ライブ取引のテスト結果をより正確に反映することができます。 。 足ごとに 1 回の取引の欠点は、特に足の途中で価格が大きく変動した場合、取引の実行が遅れる可能性があることです。 基本的には応答性と信頼性の間のトレードオフです。


各足の取引条件を確認するには、1) タイムスタンプ法、2) 出来高法、という 2 つの方法があることは知っています。

< br/>


1. タイムスタンプ メソッド

以下は、新しいバーの開始時のタイムスタンプを確認するメソッドのコードです。 。


外部ブール値 EnterOpenBar = true;

int 現在時刻;


内部 init(){

現在時刻 = time[0];

return(0);

}

start(){


if(EnterOpenBar) = true)

{

if(currenttime!= time [0]) {

// 新しい足の最初の注文番号を見つけます

// 売買条件はここにあります

現在時刻 = time[0 ];

return(0);

}

}


ここメソッド、まず、機能のオンとオフを切り替えるために EnterOpenBar という外部変数を宣言します。


init() 関数では、現在の足のタイムスタンプを CurrentTime に割り当てます。 これにより、次のバーが開くまで取引条件のチェックが遅れます。


次に、CurrentTime 変数の値を、現在のバーのタイムスタンプである Time[0] と比較します。 これら 2 つの値が一致しない場合、新しいバーが検出され、新しいバーで取引を開始し続けることができます。



2. 出来高法

以下は、開始を確認するために使用される取引です。新しいバー 測定メソッドのコード。


外側のブール値 EnterOpenBar = true;


内側の start()

Boolean OpenBar=true;

if(EnterOpenBar) if(iVolume(NULL,0,0)>1) OpenBar=false;


if(OpenBar){

// 新しいバーの最初のティック番号を見つける

// ここで売買条件を指定します

return ( 0);

}


ボリューム メソッドの方がはるかに短いコード スニペットが含まれるため、私はボリューム メソッドを好みます。


前のメソッドと同様に、まず EnterOpenBar という外部変数を宣言して、機能をオンまたはオフにします。 init() 関数には何も必要ありません。


ボリュームベースのオープンバー条件をチェックするコードを 1 行追加するだけです。 この条件は、ボリュームが 1 であるかどうかをチェックします。この場合、新しいバーの最初のティックが見つかったため、OpenBar=true になります。 ボリュームが 1 より大きい (>1) 場合、それは新しいバーではないため、OpenBar = false になります。