昨晚又是盯着进度条到凌晨一点半,眼看着一个欧美M15的十年回测跑了快四十分钟才到2019年,实在受不了了,干脆把MT5测试器的多线程设置翻出来折腾了一遍。这篇文章就写给和我一样刚接触这块的朋友,老手可以直接跳过。
先说结论:MT5策略测试器默认的线程调度其实挺保守的,如果你的CPU核心数够多但没做任何设置,等于白白浪费了一半算力。我的机器是8核16线程,之前跑一个含2000次参数优化的网格策略,全跑完要将近三小时,调整之后压到了五十分钟左右。
具体怎么弄,我按自己踩坑的顺序列一下:
最后说个观察:多线程优化时CPU占用率如果上不去,八成是数据IO或者内存带宽瓶颈,不是线程数没设对。我现在的习惯是跑优化前先开任务管理器看一眼磁盘活动时间,超过30%就先处理数据。
你们平时跑优化一般开几个线程?有没有遇到过线程数拉满反而更慢的情况,交流。
补充一下,那个“本地代理核心数”设成物理核心数后,记得把“代理”窗口里的“使用远程代理”也关掉,不然本地代理跑着跑着还是会偷偷连远程,速度又掉回去了。
先说结论:MT5策略测试器默认的线程调度其实挺保守的,如果你的CPU核心数够多但没做任何设置,等于白白浪费了一半算力。我的机器是8核16线程,之前跑一个含2000次参数优化的网格策略,全跑完要将近三小时,调整之后压到了五十分钟左右。
具体怎么弄,我按自己踩坑的顺序列一下:
- 打开“代理”设置:在测试器界面右键选择“代理”,或者从“工具-选项-代理”进去。关键是把“本地代理”启用,并且把“使用的本地代理核心数”设成物理核心数,不是逻辑线程数。我一开始设成16,结果因为超线程争抢缓存,反而比8核慢了约12%,这个坑我踩了两天才发现。
- 测试器本身的“线程数”选项:在策略测试器的“设置”标签页里,有个“线程”参数,默认是1。这里要理解一个逻辑——它控制的是同时进行的优化任务数,不是单次回测的线程。做参数优化时把它设成物理核心数减1,留一个核给系统,不然鼠标都会卡。但如果你只是跑单次回测,这个值设多少都没用,因为单次回测本身就是单线程的。
- 历史数据质量比线程数更重要:我一开始死活跑不快,后来发现是欧美M1的数据只下载了最近两年,测试器一边跑一边补数据,CPU全耗在IO上了。建议先在“品种”里把对应周期的历史数据完整下载,尤其是要做tick级回测的话,数据量能差出几十倍。
- EA代码本身的写法:这个算进阶但很关键。如果你的EA里用了大量Sleep()、WebRequest或者每tick都刷新对象,多线程优化时每个线程都会卡在等待上。我把自己写的均线EA里一个每tick调用一次的Comment()去掉之后,同样参数下回测时间直接少了18%。
最后说个观察:多线程优化时CPU占用率如果上不去,八成是数据IO或者内存带宽瓶颈,不是线程数没设对。我现在的习惯是跑优化前先开任务管理器看一眼磁盘活动时间,超过30%就先处理数据。
你们平时跑优化一般开几个线程?有没有遇到过线程数拉满反而更慢的情况,交流。
补充一下,那个“本地代理核心数”设成物理核心数后,记得把“代理”窗口里的“使用远程代理”也关掉,不然本地代理跑着跑着还是会偷偷连远程,速度又掉回去了。
