Summary: 本文记录MT4回测时遭遇数据丢失的完整排查经过,从.hst文件损坏诊断到利用MQL4脚本写入合成数据,以及市场报价刷新机制的独家操作经验。




上周四晚上,本来想跑个网格策略的全年优化,结果MT4策略测试器给我来了个下马威。加载EURUSD,日期范围选去年一整年,点"开始",日志里就一行冷冰冰的"没有此品种/周期的数据"。图表界面一片空白,连根蜡烛都没有。

我当时寻思,是不是忘了下载数据?于是赶紧去工具 > 选项 > 图表,点那个"导出"按钮,看着进度条走完,心想这下稳了。结果重启MT4,测试器依然是白板一块。这就不是下载的问题了,是底层数据文件坏了。

翻官方文档,MQL4的文件操作章节讲了FileOpenFileWrite怎么用,但没告诉你历史数据文件损坏了怎么修。MT4把历史K线存在history\[券商名称]文件夹里,后缀是.hst。如果终端异常关闭或者网络波动导致写入中断,这个文件就废了。关键是,文件还在那儿,MT4检测到有文件就不去服务器重新下载,哪怕里面数据是坏的。

我琢磨出的一个独家经验是,MT4的回测器其实严重依赖1分钟周期的.hst文件作为基础。不管你选的是"每笔 ticks"还是"控制点"模式,底层都需要1分钟数据来插值生成价格。如果1分钟数据有断档,回测器就直接罢工。但官方没说的是,你可以通过强制删除坏文件让终端重建,但重建往往只补当前周期,更高周期的数据是依据1分钟生成的,如果1分钟残缺,日线图看着完整实际上也是虚的。

我的实际操作流程是这样的:

  • <strong>备份并移走坏文件</strong>:关掉MT4,进入目录C:\Users\你的用户名\AppData\Roaming\MetaQuotes\Terminal\终端ID\history\券商名称\。找到EURUSD1.hst(1分钟)和EURUSD1440.hst(日线),剪切到桌面备份。不要直接删,先移走。


  • <strong>强制全新下载</strong>:重启MT4,再次点击工具 > 选项 > 图表 > 导出。因为本地已经没有对应文件了,这次终端会老老实实从MetaQuotes服务器拉一份新的完整1分钟数据。


  • <strong>脚本修补数据缺口(关键步骤)</strong>:有时候服务器下过来的数据本身就有断档,比如某天凌晨没有报价。我写了个简单的MQL4脚本,用FileOpen以二进制写入方式打开EURUSD1.hst,读取最后一条K线的时间戳,如果发现和当前时间之间有间隔,就用前一根的收盘价填充这个空隙。这个操作在官方帮助中心完全找不到,但确实管用。


  • ``cpp
    // 修补缺失K线的逻辑片段
    int handle = FileOpen("EURUSD1.hst", FILE_BIN|FILE_WRITE|FILE_READ);
    if(handle != INVALID_HANDLE) {
    // 定位到文件末尾,检查时间戳,补写缺失的K线
    FileClose(handle);
    }
    `

  • <strong>刷新品种属性</strong>:在市场报价窗口右键 -> 显示全部,再右键 -> 品种,找到EURUSD,双击属性,把" tick大小"和" tick价值"重新确认一遍,点确定。这一步会刷新MT4内部的品种缓存,有时候数据下载回来了但缓存没刷新,回测器还是读不到。


  • <strong>重新打开回测器</strong>:关掉回测面板重新打开,建模方法选"每笔tick",这时候图表上应该就出现K线了。


  • 参考来源:MQL4官方文档 - 文件操作(docs.mql4.com);MetaQuotes帮助中心 - 数据导出设置。

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