Summary: 从实际操作出发,详解MT4历史数据导出的隐藏技巧。包含不同券商数据文件互换、自定义时间段导出脚本思路,并引用MQL4官方文档中关于文件操作的部分,助你轻松获取任意周期回测数据。




做回测的时候最头疼的是什么?不是策略写不出来,是数据不对。明明选了“每个价位”的模型,跑出来的结果跟实盘差得离谱。后来我发现,问题出在MT4默认导出的数据上——它只给你它想给的,而不是你想要的。

前阵子我想回测一个2021年上半年的五分钟策略,具体想卡着某个数据发布的时间窗口前后做验证。点开历史中心(按F2或者工具-历史中心),选中品种,双击M5,点“导出”。CSV倒是出来了,但日期范围完全不受我控制,导出来的是从有数据那天到昨天的全部。三万多行,Excel都快卡死了。

官方没说的那个文件夹

MT4所有的历史数据其实都藏在 \history\[券商名称]\ 这个目录底下,文件后缀是.hst。但问题在于,历史中心里显示的数据不一定就等于这个文件里的原始数据。如果你换过好几个券商,你会发现这个文件夹里堆了一大堆不同券商的数据文件。MT4在显示的时候会优先匹配当前图表对应的那个。

MQL4官方文档(docs.mql4.com)里有一章专门讲文件操作,提到可以用FileOpen函数读写CSV。但文档没说怎么绕过历史中心那个笨拙的导出界面。我的做法是直接用脚本去读.hst文件,过滤出我要的时间段,再写到CSV里。这样数据源是干净的,不会被MT4的缓存干扰。

我自己改的那个导出脚本

导航器里的脚本文件夹下有个自带的Period_Converter,这东西可以生成离线图表,本质上就是在帮你转数据。但它不让你选起止日期。我自己改了一个版本,在脚本开头加上两个外部参数:

``cpp
extern int StartYear = 2021;
extern int EndYear = 2021;
`

然后在循环里用
iTime取每根K线的时间戳,跟起止时间做比较,只把范围内的数据写进CSV。代码不长,但省了大事儿了。原来导一个三年的五分钟数据要等好几分钟,改完之后只导出半年,速度快了四倍。

不同券商数据互换的骚操作

有时候不是你想导就能导的。有些小众品种或者老数据,你的券商根本不给。这时候可以去别的终端下载历史数据,然后把
.hst文件拷到你当前终端的\history\[你的券商]\文件夹里。只要文件名跟你的品种名称一致,MT4就能认出来。MQL4文档里确认过,文件操作用的是标准的FILE_CSVFILE_WRITE`标识,只要格式对,终端就认账。这个技巧在官方帮助中心里找不到,是我自己试出来的。

一个容易被忽略的坑

导出M1数据的时候经常发现有断档,缺了某几天的数据。这大概率不是导出操作的问题,而是你的券商服务器上本来就没有那几天的M1数据。唯一的解决办法就是换一个有完整数据的券商终端去下载,再把文件搬过来。操作不复杂,但知道的人不多。

参考来源: MetaQuotes MQL4官方文档. "文件操作." docs.mql4.com。

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