在使用专家顾问(EA)的过程中,当MetaTrader接收到新的报价(即“tick”)时,标准的OnTick()事件处理函数会被调用。但是,MetaTrader并没有标准的事件处理函数来检测新K线的开始。
要实现这一点,我们需要监控最近K线的开盘时间。当开盘时间发生变化时,这就意味着新K线的开始,我们可以对此做出反应并处理事件。以下是一个兼容MQL4和MQL5的方法示例,展示了如何实现这一功能:
// 标准的tick事件处理函数 void OnTick() { // 检查是否有新K线(兼容MQL4和MQL5)。 static datetime dt当前K线 = WRONG_VALUE; datetime dt前一K线 = dt当前K线; dt当前K线 = iTime( _Symbol, _Period, 0 ); bool b新K线事件 = ( dt当前K线 != dt前一K线 ); // 对新K线事件做出反应。 if( b新K线事件 ) { // 检测是否为首次接收的tick。 /* 例如,当图表首次应用时,K线正处于进展中,并不是真正的新K线开始。 */ if( dt前一K线 == WRONG_VALUE ) { // 对首次tick或K线中间状态进行处理 ... } else { // 常规K线出现后的处理 ... }; // 独立于前一条件的其他处理 ... } else { // 处理其他情况 ... }; // 继续其他操作 ... };
在上面的代码中,static变量用于跟踪K线的开盘时间,即使在返回OnTick()函数后,它仍然能够保持数据。这是检测当前K线开盘时间变化的关键。
需要注意的是,当EA第一次应用到图表上时,前面的代码会将其反应为刚刚开盘的K线。这种情况需要特殊处理,以便能够正确应对。
另外,请注意,我在CodeBase上发布的所有源代码现在可以通过MetaEditor的“公共项目”中找到,项目名称为“FMIC”。