在为 专家顾问(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”。