上个月在开发一个自定义回测工具的时候,碰到一个让人抓狂的问题。我需要把MT5的tick数据导出来喂给Python做策略验证。写了个EA用
CopyTicks抓数据,模拟账户跑得顺顺当当,结果一换到真实账户,导出来的CSV文件里面的时间戳全乱了,而且数据还有大段大段的空白。刚开始我以为是自己代码写错了。翻来覆去看了好几遍
MqlTick结构体的定义,没毛病啊。后来翻了MQL5官方文档里关于时间和日期结构的说明,文档明确写着MqlTick.time是UTC时间,这个我是知道的。但问题压根不在时区本身。真正坑人的是
FileWrite这个函数。你要是在FILE_TXT或者FILE_CSV模式下直接往文件里写MqlTick.time_msc这个long类型的字段,它会静默地把数据写成一堆乱码,连个报错都没有。官方文档里压根没提过这个坑。我后来是挨个把数组元素打印到日志里对比才发现,数据在内存里好好的,一写进文件就变味了。这里分享一个文档里找不到的独家经验:导出CSV格式的人类可读数据时,
time_msc(毫秒时间戳)必须用IntegerToString转成字符串再写。如果你不需要可读性,直接用FileWriteStruct写二进制文件,那是百分百可靠,速度还快。但很多教程都默认你用FileWrite直接写结构体,这在MT5里是大忌。第二个问题是数据缺口。在行情波动剧烈的时候,导出的tick数据偶尔会断档。我一开始以为是
CopyTicks的参数没设对,后来查了MQL5参考文档才发现,CopyTicks的flags参数(COPY_TICKS_ALL、COPY_TICKS_TRADE、COPY_TICKS_INFO)对数据获取速度影响很大。如果用COPY_TICKS_ALL,会把买卖盘和交易tick全拉下来,数据量大了之后终端缓存扛不住,就直接丢数据了。我的解决方案是这样的:
CopyTicks几百万条,循环着每次拉10万条,记录偏移量接着拉,稳得很。time_msc和volume这些数值类型全转成字符串,杜绝静默乱码。CopyTicks都要检查返回值是不是-1,如果是,马上用GetLastError()看具体原因。大部分时候是请求的数据超出了终端缓存范围。折腾了两天才把这个问题彻底搞定。最关键的教训就是:MT5导出数据,别图省事直接写结构体,尤其在CSV模式下,数值类型字段一定要先转字符串,这是官方文档里不会特意提醒你的隐藏细节。
参考来源:MQL5官方文档 - CopyTicks函数说明(docs.mql5.com);MQL5参考 - 数据结构与数据类型。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。
```