Summary: 通过一次真实的多品种回测卡顿经历,发现了一个极少被提及的MT4/MT5回测提速方法——清除测试过程中生成的图表对象,附带其他性能优化经验。




去年底帮朋友调试一个多品种网格EA的时候,真是被回测速度折磨得够呛。那个策略逻辑不算太复杂,但要在EURUSD、GBPUSD和XAUUSD三个品种上各跑五年的一分钟数据,我丢进策略测试器就去做别的事了。两个小时后回来看,进度条才爬到17%。

我当时用的是一台配置还过得去的VPS,4核8G内存,理论上跑个回测不应该这么慢。我试了网上能找到的所有常规优化办法:

工具 > 选项 > 图表里的"最多柱数"从默认调低了一半。
工具 > 选项 > 服务器里把"启用新闻"勾掉了,省点系统资源。
  • 回测模式选的是"控制点"而不是"每笔报价",精度降一档速度能快不少。


  • 这些操作加起来大概让回测时间缩短了不到15分钟,从两个半小时变成了两小时零一刻钟,聊胜于无。

    然后我在一个讨论EA回测优化的帖子里看到有人提到一个我从没见过官方文档提起的事儿。原话大概是"回测的时候图表上会生成进场和出场的箭头,还有资金曲线,这些东西画多了会拖慢速度,删掉就能快起来"。

    我当时心想,这玩意儿不是在回测窗口里关掉图表显示就行了吗?后来仔细一琢磨才反应过来——即便你跑的是非可视化回测,MetaTrader的策略测试器仍然在后台默默绘制这些图形对象。它们不在屏幕上显示,但渲染逻辑照样在执行,每个开平仓事件都会产生一个箭头对象,数量一多CPU就被拖住了。

    MQL4官方文档里没有关于这个行为的任何说明。文档只告诉你怎么写EA、怎么调用指标、怎么用OnCalculate(),但策略测试器底层怎么处理图形渲染,一个字都没提。这种信息属于你不被折磨个几回根本不会知道的经验。

    实测有效的操作步骤



    我当时试出来的办法非常简单粗暴:

  • 先把回测跑起来,用非可视化模式。

  • 每隔大概20到30分钟,点一下策略测试器工具栏上的"删除"按钮——就是那个清除图表上所有画线、箭头、标签的图标。

  • 点完之后继续让回测跑。


  • 就这么一下,回测速度肉眼可见地往上窜了一截。原来两个小时零一刻钟的测试,我每半小时清除一次对象,最后总耗时压到了一小时二十分钟左右。

    这个原理其实不难理解。策略测试器每处理一笔交易,就会在图表对应位置画一个箭头(开仓一个颜色、平仓另一个颜色),同时还会更新资金曲线。这些对象积累得越多,系统要维护的对象列表就越长,ChartRedraw()之类的刷新操作就越慢。即便你不在可视化模式里看着图表,这些对象依然存在、依然占用资源。

    稍微进阶一点的自动清除方案



    手动点删除终究不是长久之计。后来我写了一个小脚本,在回测里定时调用ObjectsDeleteAll(),把所有图表对象一次性清掉。这个脚本不能完全解决问题,因为ObjectsDeleteAll()本身也需要执行时间,但比起让几百个箭头挤在图表里拖慢速度,定期清理仍然划算得多。

    其他几个顺便能提速的设置



    除了清箭头,这次折腾还让我确认了几个之前半信半疑的优化手段确实有用:

  • 关掉所有不相关的图表。回测期间如果还开着其他品种的图表,每个图表都在消耗CPU和内存,对回测速度是有影响的。

  • 市场报价窗口隐藏不用的品种。虽然影响不大,但累积起来也能省一点点资源。

  • 回测完一个参数组就重启一下MT4。终端跑久了内存碎片化,重启能清掉一些缓存。


  • 这个方法不是万能的



    坦率地说,这个清箭头的办法是曲线救国,不是正经解决方案。它说明的是MetaTrader策略测试器在资源管理上存在设计缺陷——生成的图表对象不会自动回收,需要用户手动干预。但话说回来,在没有更好的替代方案之前,这个小技巧确实能帮你在跑大规模回测的时候省下不少时间。尤其对做多品种、多年份回测的人来说,一次省个几十分钟,累计下来就相当可观了。

    参考来源:MQL4官方文档 – 自定义指标与EA交易结构(docs.mql4.com),Exness帮助中心 – MetaTrader性能优化指南(get.exness.help)。

    本文首发于FXEAR.com,原创内容,未经授权禁止转载。