之前一直想不通一件事:同一个EA,同一个参数,MT4策略测试器里跑欧美M15三年,资金曲线平滑得像画出来的,年化收益能到40%多,最大回撤才8%。结果一上实盘,两周不到回撤干到15%,有几笔单子的进场点位跟回测里差了好几个点。我一开始怀疑是滑点,又怀疑是平台点差,换来换去折腾了一个多月,最后发现问题根本不在EA逻辑上,而是MT4历史数据中心里的报价缺口。
这个坑估计很多刚接触EA的朋友都会踩。你从平台下载的历史数据,表面上看K线是连续的,但里面藏着大量“空洞”——某些时间段根本没有tick数据,或者只有零星几个报价。回测引擎遇到这种缺口,会拿前一个有效报价去填充,或者直接跳到下一个报价。结果就是EA在回测里以为某个价位能成交,实盘那个时刻压根没人报这个价。
怎么查?步骤不复杂,但第一次弄容易漏。
查到缺口之后怎么办?我的做法是换数据源重新下载。MT4自带的数据中心是从你当前登录的服务器拉的,有些平台的历史数据就是不全。可以找那些提供tick级历史数据的第三方工具,导入后再跑回测。另外,回测时把“点差”设成“当前点差”而不是固定点差,虽然慢一点,但能模拟真实报价环境。如果EA对进场时间敏感,比如专门做数据行情的,那还得在代码里加一个判断:当前tick时间与上一tick时间差超过X秒就跳过,避免在缺口位置开仓。
还有一个容易忽略的点:VPS上跑实盘和本地跑回测,用的历史数据可能不是同一套。我现在的习惯是,每次换VPS或者重装MT4之后,先把历史数据中心里的M1数据全部删掉重新下载一遍,然后再跑一次回测对比。如果回测结果跟之前差很多,那说明数据源变了,实盘表现大概率也会变。
说到底,EA回测盈利实盘亏损,先别急着改参数或者怀疑策略失效。花十分钟查一下历史数据中心的报价缺口,可能比调三个月参数都有用。你们平时跑回测会特意检查M1数据的完整性吗,还是直接下完就用?
对了,还有个小细节忘了说:历史数据中心里下载完数据最好右键导出成CSV,用Excel扫一眼每根K线的时间戳间隔,缺口一目了然,比在MT4里翻强多了。
这个坑估计很多刚接触EA的朋友都会踩。你从平台下载的历史数据,表面上看K线是连续的,但里面藏着大量“空洞”——某些时间段根本没有tick数据,或者只有零星几个报价。回测引擎遇到这种缺口,会拿前一个有效报价去填充,或者直接跳到下一个报价。结果就是EA在回测里以为某个价位能成交,实盘那个时刻压根没人报这个价。
怎么查?步骤不复杂,但第一次弄容易漏。
- 第一步,打开MT4,按F2调出“历史数据中心”。左侧找到你要测的品种和周期,比如EURUSD的M1。注意,EA回测的精度取决于你下载的最小周期数据,M1数据必须完整,光下M15没用。
- 第二步,右键点击品种,选“导出”。存成CSV,用Excel打开。看两列:时间和成交量(Volume)。如果某一分钟Volume是0,或者连续十几分钟Volume都是1、2这种极低值,那就是缺口。
- 第三步,重点看周五收盘到周一开盘之间、重大数据公布前后5分钟、以及每天凌晨换日的那几分钟。这几个位置最容易出现数据断层。我那次就是发现欧美在每个月第一个周五非农前后,有连续3到7分钟的报价空白。
- 第四步,在MT4里点“工具-选项-图表”,把“图表中最大柱形数”调大,然后手动翻看那几个时间段的1分钟图。缺口位置会显示成一根特别长的柱子,或者直接跳空。
查到缺口之后怎么办?我的做法是换数据源重新下载。MT4自带的数据中心是从你当前登录的服务器拉的,有些平台的历史数据就是不全。可以找那些提供tick级历史数据的第三方工具,导入后再跑回测。另外,回测时把“点差”设成“当前点差”而不是固定点差,虽然慢一点,但能模拟真实报价环境。如果EA对进场时间敏感,比如专门做数据行情的,那还得在代码里加一个判断:当前tick时间与上一tick时间差超过X秒就跳过,避免在缺口位置开仓。
还有一个容易忽略的点:VPS上跑实盘和本地跑回测,用的历史数据可能不是同一套。我现在的习惯是,每次换VPS或者重装MT4之后,先把历史数据中心里的M1数据全部删掉重新下载一遍,然后再跑一次回测对比。如果回测结果跟之前差很多,那说明数据源变了,实盘表现大概率也会变。
说到底,EA回测盈利实盘亏损,先别急着改参数或者怀疑策略失效。花十分钟查一下历史数据中心的报价缺口,可能比调三个月参数都有用。你们平时跑回测会特意检查M1数据的完整性吗,还是直接下完就用?
对了,还有个小细节忘了说:历史数据中心里下载完数据最好右键导出成CSV,用Excel扫一眼每根K线的时间戳间隔,缺口一目了然,比在MT4里翻强多了。
