上周四晚上,本来想跑个网格策略的全年优化,结果MT4策略测试器给我来了个下马威。加载EURUSD,日期范围选去年一整年,点"开始",日志里就一行冷冰冰的"没有此品种/周期的数据"。图表界面一片空白,连根蜡烛都没有。
我当时寻思,是不是忘了下载数据?于是赶紧去工具 > 选项 > 图表,点那个"导出"按钮,看着进度条走完,心想这下稳了。结果重启MT4,测试器依然是白板一块。这就不是下载的问题了,是底层数据文件坏了。
翻官方文档,MQL4的文件操作章节讲了
FileOpen、FileWrite怎么用,但没告诉你历史数据文件损坏了怎么修。MT4把历史K线存在history\[券商名称]文件夹里,后缀是.hst。如果终端异常关闭或者网络波动导致写入中断,这个文件就废了。关键是,文件还在那儿,MT4检测到有文件就不去服务器重新下载,哪怕里面数据是坏的。我琢磨出的一个独家经验是,MT4的回测器其实严重依赖1分钟周期的
.hst文件作为基础。不管你选的是"每笔 ticks"还是"控制点"模式,底层都需要1分钟数据来插值生成价格。如果1分钟数据有断档,回测器就直接罢工。但官方没说的是,你可以通过强制删除坏文件让终端重建,但重建往往只补当前周期,更高周期的数据是依据1分钟生成的,如果1分钟残缺,日线图看着完整实际上也是虚的。我的实际操作流程是这样的:
C:\Users\你的用户名\AppData\Roaming\MetaQuotes\Terminal\终端ID\history\券商名称\。找到EURUSD1.hst(1分钟)和EURUSD1440.hst(日线),剪切到桌面备份。不要直接删,先移走。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,原创内容,未经授权禁止转载。
``