在使用专家顾问(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”的名称找到。