大部分人在聊EA都是写策略编代码之类的东西。没什么人聊等回测跑完到底有多无聊。上周四下午我就盯着一个进度条,卡在87%死活不动。策略本身不复杂,就是个均线金叉加移动止损,但五年EURUSD的tick数据跑起来就跟老牛拉破车一样。
我开始到处找原因。后来发现的问题其实不是单个故障,而是好几个小毛病叠在一起。全改完之后回测时间砍了一半左右。最关键的是这些修改大多用不了一分钟。
没人提过的图表箭头问题
这东西是我纯属意外发现的。开一个可视化回测,盯着图表看。EA每开一单或者平一单,MT4/MT5就会在图表上画一个箭头。开仓箭头、平仓箭头、止损标记、止盈标记。跑个几百笔交易下来,图表上跟刺猬似的。
MQL4官方文档里讲
ObjectCreate()和ObjectDelete()怎么用,教你怎么管理自定义图表对象。但它从来没说过回测引擎本身在后台也在生成对象,而这些对象是会吃CPU的。EA交易次数越多,对象堆得越多,回测就越慢。后来我在一个论坛上看到有人提了一嘴,说在回测过程中手动删掉图表上的箭头和线条能提速。我一开始觉得扯淡,删几个视觉元素还能影响计算速度?但我试了一下。打开一个正在跑的可视化回测,点工具栏上的"删除"按钮(就是删趋势线那些东西的那个),下拉菜单里选"删除所有对象"。图表瞬间干净了。然后回测速度?肉眼可见地往上跳了一截。
MetaQuotes官方帮助中心讲性能优化的时候,主要提的是减少图表最大柱数和禁用新闻推送这些东西。他们从来没提过图表对象累积的问题。这是他们文档里的一个盲区,但很多交易者因为这个白白浪费好几个小时等回测跑完。
吃CPU的日志文件
另一个隐藏的性能杀手是终端日志。默认情况下,MT4和MT5在回测期间会记录每一个事件。每一个tick的处理、每一次价格检查、每一笔订单修改,全都写进日志。如果你的EA是高频策略,日志文件涨得飞快。
Exness的帮助中心里其实提到过这一点:如果你在跑EA,可以考虑关闭日志记录,因为它会占用计算机内存。但这个建议埋在它们的FAQ里,MetaQuotes自己的文档反而没写。但这个确实管用。
在
工具 > 选项 > EA交易里把"启用EA交易日志"的勾去掉。在我的测试里,光这一项就省了大概15%的运行时间。日志在调试的时候有用,但做大规模参数优化的时候真不需要。减少最大柱数——但别矫枉过正
标准建议是在
工具 > 选项 > 图表里把"图表中最多柱数"和"历史数据中最多柱数"调低。官方建议砍50%,我试过之后直接砍到策略实际需要的数量。窍门在这:如果你的EA用200周期均线,你不需要10万根K线来算这根均线。前199根K线只是在填均线的缓冲区而已,再往前的数据跟当前计算没半毛钱关系。把"历史数据中最多柱数"设成2000或3000,别用默认的50000。这样能强制终端少加载数据到内存里。
但有个坑是官方文档没写明白的:如果你把这个值设得太低,指标计算可能会从均线还没"预热"好的位置开始算。MQL4官方文档里提到过指标需要足够的K线数量才能正确计算。所以要找个平衡点。对于200周期SMA加50根K线的信号过滤策略来说,3000根K线绰绰有余。如果策略用日线数据,可能需要多一点。
离线图表的歪招
这个比较奇葩。回测的时候如果你一直开着图表窗口并且还拖来拖去,终端在不停地重绘画面。这也在吃CPU。解决方法很简单:回测开始之后,把图表窗口最小化。别关,最小化就行——这样计算还在跑,但实时渲染停了。
我并排对比测试过。同样的EA、同样的数据范围。一个窗口最大化跑,一个最小化跑。最小化的那个快了大约12%。不算特别夸张,但几百次优化跑下来差距就大了。
VPS vs 本地电脑——真正的差别
所有人都推荐用VPS跑实盘交易。但回测是另一回事。Exness的帮助中心提到VPS主要是为了执行速度和连接稳定性。但回测的话,只要你电脑CPU还行,本地机器几乎永远比VPS快。
原因很简单。回测用的是本地存储的历史数据,没有网络延迟,所有计算都在你自己的处理器上跑。VPS通常是共享CPU资源,跑大量计算反而可能更慢。我的实盘EA放在VPS上跑,但所有回测和优化都在台式机上做。差距非常明显。
优化参数的顺序技巧
这是我这么多年跑参数优化自己观察出来的。内置优化器按你指定的参数顺序跑。如果你有三个参数,它会先跑最内层的循环。也就是说,它会先把最后一个参数优化完了再动下一个。
如果你的某个参数计算量很大(比如复杂的指标计算),把它放在外层循环。优化器算它的次数就会变少。MQL4本身没有给优化器提供显式的循环顺序控制,但你可以通过调整输入参数的顺序来减少重复计算。把最耗时的参数放在第一个,最省事的放最后一个。
这个我在任何官方文档里都没见过。纯粹是看CPU占用率的时候自己琢磨出来的。一个30秒的优化任务,简单调个顺序就能压到20秒。
所有方法叠加的效果
所有这些方法一起用上呢?我那个五年tick数据的回测从大约45分钟降到了差不多20分钟。提速55%,一行EA代码都没改。没动策略、没升级硬件,只是更清楚这个终端到底是怎么工作的而已。
MetaTrader平台功能很强大,但它的性能瓶颈在官方渠道里很少有人聊。MetaQuotes的文档告诉你"能做什么",但不太告诉你"别做什么"。这些经验就得靠实际跑出来的教训去填。
参考来源:MetaQuotes帮助中心 – Enhancing MetaTrader Performance(help.metaquotes.net),MQL4官方文档 – 自定义指标(docs.mql4.com),Exness帮助中心 – 可以提升MetaTrader的性能吗?(get.exness.help)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。