首页 > 博客 > MQL5的OnTick与OnTimer|EA设计中的区别与用法

MQL5EA开发MT5

MQL5的OnTick与OnTimer|EA设计中的区别与用法

发布日: 2026-10-29阅读时间:约 4 分钟
⏱ 本文为发布之日的信息。EA的业绩数值(PF、DD、年化)会随实盘运行与重新验证而变动,最新数值请在各EA页面确认。 查看最新EA业绩 →

结论:交易判断看"新K线",时间类处理用 OnTimer

先说结论。如果 EA 基于 H1、H4 这类较长周期的K线做交易决策,只需在"新K线生成后的第一个 tick"进行判断即可。每来一个 tick 就重复同样的计算,只会白白消耗 CPU,判断结果并不会改变。而对于没有 tick 也要运行的处理,则应使用 OnTimer,例如周末导出状态、在固定时刻整理挂单等。

不过,哪种方式合适,最终取决于策略本身。本文将梳理这两种机制的区别,以及选择 EA 的一方可以自行核实的要点。

推荐经纪商比较 →

🎁 免费下载EA

📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集

订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。

※ 严格保护隐私。可随时取消订阅。

机制:tick 驱动与时间驱动

OnTick(tick 驱动)

每当运行 EA 的品种收到新的价格(tick),OnTick 就会被调用。行情剧烈时,1 秒内可能被调用多次;行情停止的周末则一次也不会被调用。

这里有一个需要了解的规则:上一次 OnTick 的处理尚未结束期间到达的 tick,不会进入排队,而是被直接跳过。也就是说,单次处理很重的 EA,在行情急剧波动时会漏掉 tick。

OnTimer(时间驱动)

OnTimer 按照 EventSetTimer() 设定的间隔被调用。它与价格波动无关,因此即使市场休市也会被调用。一个 EA 只能有一个计时器,处理积压时同样会被跳过。另外,也不保证恰好按设定的间隔准时调用。

项目OnTickOnTimer
触发条件价格更新经过固定时间
市场休市期间不会被调用会被调用
调用次数行情越活跃越多基本固定
适合的处理开仓、平仓的判断定期统计、按时刻执行的处理
主要注意点重负载处理会漏掉 tick即使没有新价格也会运行

低频策略避免浪费 CPU 的写法

如果策略基于 H4 K线判断,那么在一根K线持续的 4 小时内,无论 OnTick 被调用几千次,用于判断的已收盘K线的数值都不会变。因此我们的基本做法是:只在"K线切换时"才执行重处理,写法如下。

datetime g_lastBar = 0;

void OnTick()
{
   datetime cur = iTime(_Symbol, PERIOD_H4, 0);
   if(cur == g_lastBar) return;   // 同一根K线期间什么都不做
   g_lastBar = cur;
   // 在这里使用已收盘K线(shift 1)进行判断
}

指标句柄只在 OnInit 中创建一次,不要在 OnTick 里每次重新创建,这一点同样重要。使用 OnTimer 时,要在 OnDeinit 中调用 EventKillTimer() 停止计时器。

在 VPS 上的多个图表同时运行 EA 时,这类差异会体现为 CPU 负载。关于如何选择 VPS,请参阅 VPS信息。

选择 EA 的一方可以核实什么

即使看不到内部代码,下面这些点也可以在一定程度上核实。

  • 说明文档与参数:是否有"仅在新K线判断"之类的设置
  • VPS 的 CPU 使用率:移除某个 EA 后负载明显下降,说明它可能在每个 tick 都执行重处理
  • 专家日志:是否有相同内容在每个 tick 重复输出
  • 回测结果:对于按K线开盘价判断的 EA,"仅开盘价"与"所有 tick"模式的结果不应有太大差异。若差异明显,说明它也在对K线内部的价格波动作出反应

EA 的安装与设置基础,请参阅 EA设置方法。

局限与注意事项

也要说明不利的一面。

  • 没有监控K线内部的风险:如果把判断限定在新K线,就不会对K线中途的急剧变动作出反应。止损必须设计为通过订单上附带的止损单来保护,否则可能承受意料之外的亏损。
  • 新K线的延迟:新K线生成后,在该K线的第一个 tick 到达之前,处理不会运行。在行情清淡的品种或时段,判断可能比K线开始时间晚。
  • OnTimer 在回测与实盘中容易出现偏差:回测中计时器按虚拟时间调用,因此不一定与真实账户的间隔一致。
  • 处理变轻不会改变业绩:降低 CPU 负载并不会让策略更容易盈利。策略本身的优劣是另一回事。

像 ETHEREUM EA 这样的 H4 EA,交易次数少的策略,这种设计差异就更难察觉。不过,从外部能够核实的范围是有限的。我们能够明确断言的,只有我们自己编写的代码。

总结

  • OnTick 在价格到达时被调用,OnTimer 每隔固定时间被调用
  • 处理期间到达的事件不会排队,而是被跳过。重负载处理会导致漏掉事件
  • 低频策略采用"仅在新K线时判断"的写法,可以避免浪费 CPU
  • 对于没有 tick 的时段也要运行的处理,使用 OnTimer
  • 对K线内部风险的防范靠止损单。处理变轻并不会提升业绩
  • 其他经验请参阅 EA・MT5经验分享

📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集

订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。

※ 严格保护隐私。可随时取消订阅。

对EA或外汇有疑问吗?

可以在Nattzy交易论坛发帖提问(免费注册)。不限于本文内容,EA设置、经纪商选择等问题也欢迎。

在Nattzy提问 ↗

评论与提问