MQL5的OnTick与OnTimer|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 只能有一个计时器,处理积压时同样会被跳过。另外,也不保证恰好按设定的间隔准时调用。
| 项目 | OnTick | OnTimer |
|---|---|---|
| 触发条件 | 价格更新 | 经过固定时间 |
| 市场休市期间 | 不会被调用 | 会被调用 |
| 调用次数 | 行情越活跃越多 | 基本固定 |
| 适合的处理 | 开仓、平仓的判断 | 定期统计、按时刻执行的处理 |
| 主要注意点 | 重负载处理会漏掉 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 即可免费使用。
※ 严格保护隐私。可随时取消订阅。