在 自动交易系统(Expert Advisor,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”名称获取。