新しいバーやキャンドルの開始を検出する方法 - MetaTrader 5用のシステムトレーディング

Mike 2022.04.24 09:38 19 0 0
添付ファイル

システムトレーディング(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