システムトレーディング(EA)を使うと、新しいティックが到着した際に、MetaTraderターミナルはデフォルトのOnTick()イベント処理関数を呼び出します。しかし、新しいバー(キャンドル)が開始する際のデフォルトのイベント処理関数は存在しません。
これを検出するには、現在の最新のバーのオープニングタイムを監視する必要があります。オープニングタイムが変わると、それは新しいバーの開始を示し、ここで何らかのアクションを取ることができます。以下のサンプルコードは、MQL4とMQL5の両方に対応した方法を示しています:
// デフォルトのティックイベントハンドラー void OnTick() { // 新しいバーをチェックします(MQL4およびMQL5に対応)。 static datetime dtBarCurrent = WRONG_VALUE; datetime dtBarPrevious = dtBarCurrent; dtBarCurrent = iTime( _Symbol, _Period, 0 ); bool bNewBarEvent = ( dtBarCurrent != dtBarPrevious ); // 新しいバーイベントに反応して処理します。 if( bNewBarEvent ) { // 最初のティックが受信されたかどうかを検出し、処理します。 /* 例えば、チャートに最初にアタッチされた際にバーが進行中で、実際には新しいバーの開始ではない場合。 */ if( dtBarPrevious == WRONG_VALUE ) { // 最初のティックやバーの途中で何かを行う ... } else { // 通常のバーが開始したときに何かを行う ... }; // 上記の条件に関わらず何かを行う ... } else { // それ以外の処理を行う ... }; // その他の処理を行う ... };
上記のコードでは、static変数がバーのオープニングタイムを記録し、OnTick()関数から戻ってもそのデータを保持します。通常のローカル変数とは異なり、データ内容を記憶し、関数を離れるときに解放されません。これが、現在のバーのオープニングタイムの変化を検出するための鍵となります。
また、EAが最初にチャートに配置されたとき、上記のコードはバーがちょうど開いたかのように反応します。この条件は、状況に応じて特別な処理が必要です。
すべての私のCodeBaseの公開ソースコードは、今やMetaEditorの「Public Projects」タブで「FMIC」という名前で入手可能です。
コメント 0