首页 系统交易 帖子

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

附件
39103.zip (884 bytes, 下载 0次)

在使用专家顾问(EA)的时候,当新的报价到达时,MetaTrader终端会调用默认的 OnTick() 事件处理函数。但是,默认情况下并没有处理新K线开始或打开的事件。

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

// 默认的报价事件处理函数
   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 )
         {
            // 检测这是第一次接收到的报价并处理。
               /* 例如,当它首次附加到图表时,K线可能正处于进程中,
                   并且并不是新K线的开始。 */
               if( dtBarPrevious == WRONG_VALUE )
               {
                  // 在第一次报价或K线中间做一些操作...
               }
               else
               {
                  // 当正常K线开始时做一些操作...
               };

            // 无论上述条件如何都做一些操作...
         }
         else
         {
            // 做其他事情...
         };

      // 处理其他事情...
   };

在上面的代码中,静态变量用于跟踪K线的开盘时间,即使在返回OnTick()函数时,它也能保持这个值。与普通的局部变量不同,静态变量会记住其数据内容,而不会在函数结束时释放它。这正是检测当前K线开盘时间变化的关键。

此外,当EA首次放置在图表上时,上述代码的反应就像K线刚刚打开一样。如果需要以不同的方式处理这种情况,必须进行特殊处理。

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

相关帖子

评论 (0)