系统交易 게시글

如何在MetaTrader 4中检测新K线的开始

첨부파일
39104.zip (884 bytes, 다운로드 0회)

在为 专家顾问(EA) 编写程序时,当新的报价到达时,MetaTrader 终端会调用默认的 OnTick() 事件处理函数。不过,默认情况下并没有针对新K线(蜡烛图)开始或打开的事件处理函数。

为了检测新K线的开始,我们需要监控当前最新K线的开启时间。一旦这个时间发生变化,就意味着一根新的K线开始了,我们可以对此做出反应并处理相应的事件。以下是一个兼容MQL4和MQL5的示例代码,展示了如何实现这一点:

// 默认的tick事件处理函数
   void OnTick()
   {
      // 检查是否有新K线(兼容MQL4和MQL5)。
         static datetime dtBarCurrent  = WRONG_VALUE;
                datetime dtBarPrevious = dtBarCurrent;
                         dtBarCurrent  = iTime( _Symbol, _Period, 0 );
                bool     bNewBarEvent  = ( dtBarCurrent != dtBarPrevious );

      // 对新K线事件进行反应和处理。
         if( bNewBarEvent )
         {
            // 检测是否是首次接收的tick并进行处理。
               /* 例如,当它首次附加到图表上时,
                  K线可能处于进展的中间,
                  这时并不实际是新K线的开始。 */
               if( dtBarPrevious == WRONG_VALUE )
               {
                  // 在首次tick或K线中间时做一些处理 ...
               }
               else
               {
                  // 当正常K线开始时做一些处理 ...
               };

            // 无论上述条件如何都可以做的事情 ...
         }
         else
         {
            // 处理其他情况 ...
         };

      // 其他操作 ...
   };

在上面的代码中,静态变量用于跟踪K线的开启时间,即使在从 OnTick() 函数返回时,它也不会丢失数据。这是检测当前K线开启时间变化的关键。

值得注意的是,当EA首次放置到图表上时,上述代码会将其反应为K线刚刚开启。这种情况需要特殊处理,以便在需要时进行不同的应对。

请注意,我在 CodeBase 发表的所有源代码现在也可以在 MetaEditor 的“公共项目”标签下找到,名称为“FMIC”。

연관 포스트

댓글 (0)