大部分交易者关注的都是策略逻辑本身,很少有人会去琢磨MT4/MT5底层那些坑。最近几个月我一直在折腾数据导出和回测性能优化,踩了不少雷,有些东西官方文档里压根没写,今天挑几个最实用的说出来。
CSV导出的坑:实时写入和"伪实时"的区别
我之前跑过一个EA,每隔15分钟把交易数据导出到CSV,方便用Python做离线分析。测试的时候一切正常,一上实盘就出问题——CSV文件偶尔会损坏或者内容不完整。后来查了半天才发现原因:EA往CSV文件写入数据的时候,文件会被系统锁定 。如果你同时想打开这个文件做分析,直接冲突。
有个解决方案是"伪实时"写入——EA不连续写文件,而是先在内存里攒数据,到了间隔时间再一次性写入,这样锁定窗口就很短 。MetaTrader 5官方说明里也提到,往MQL5/Files目录写文件时,写入完成之前文件一直是锁定的。
我自己摸索出来的办法:EA先写一个临时文件,写完之后再重命名成目标文件名。重命名这个操作是原子性的,不会锁定目标文件。改完之后再也没有出现过文件损坏的问题。
回测越跑越慢?图表上的箭头在拖后腿
这个发现纯属意外。有一次跑一个超长回测,刚开始速度还挺快,跑了几个小时之后明显慢下来了——从每秒处理一万多个tick掉到两千出头。折腾了半天才发现是图表上那些视觉标记搞的鬼 。
EA在回测里每开平一次仓,MT4/MT5就会在图表上画一个箭头或者一条线标记进出场位置。交易次数多了,这些标记越积越多,渲染引擎被拖垮,整个回测速度就下来了 。
解决办法特别简单:回测跑一段时间之后,手动暂停,点一下策略测试器里的"删除线"和"删除箭头"按钮,清掉这些视觉垃圾,速度马上恢复 。我现在跑长回测都是定个闹钟,每小时清一次。
USB信号灯:比推送通知更靠谱的监控方案
推送通知和邮件提醒大家都会用,但有个问题——手机不在身边或者静音的时候,消息就错过了。论坛上有人分享了一个另类方案:用USB信号灯 。
原理很简单:MT4指标或者EA调用一个自定义DLL,DLL发信号给USB设备,交易信号出现的时候灯就亮起对应的颜色 。这个比声音提醒靠谱多了,因为:
我找到一个叫MetaTrader Data Export的开源项目,自带DLL和源码,能往Arduino这类硬件发信号 。MQL4官方文档里虽然提过自定义DLL的用法,但很少有人把这个跟硬件联动串起来讲。
关于iCustom()的一个性能细节
EA里用iCustom()调用指标数值的时候,如果不做优化,每个tick都会重新计算一遍指标。MQL4教程里提到过这个问题:"在自定义指标中进行的计算,如果放到EA里实现,可能会导致重复计算和不必要的资源浪费" 。
我的做法是把iCustom()的结果用静态变量缓存起来,只有新K线出现的时候才重新计算。改完之后CPU占用降了大概四成。
---
参考来源:
本文首发于FXEAR.com,原创内容,未经授权禁止转载