说实话,干这行久了你会发现,EA跑得稳不稳,很多时候不是策略问题,是数据问题。我见过太多人拿着个回测曲线图兴冲冲上实盘,结果半个月就萎了,一问,历史数据是从MT4自带服务器下的,质量稀烂。今天不聊行情,就说说我这些年倒腾历史数据的那些破事。
先讲导入。很多人以为MT4的History Center就是全部,其实那只是冰山一角。我现在的习惯是,数据源优先用Dukascopy或者TrueFX的Tick级数据,尤其是做黄金和镑美这种点差波动大的品种,MT4自带的数据在2015年瑞郎黑天鹅事件前后那段时间,跳空和缺失简直没法看。下载下来的CSV文件,注意编码格式,必须转成UTF-8 without BOM,不然导入的时候时间戳会乱码,我最早吃过这个亏,一晚上回测数据全废。
导入的路径很简单,File -> Open Data Folder,把CSV扔进MQL4/Files目录,然后写个小脚本读取。但这里有个坑,MT4的Time[]数组是按服务器时间对齐的,如果你下载的数据是GMT+2的夏令时,直接读进来会差一个小时,导致K线开收盘价对不上。我的做法是导入前先统一换算成UTC,再在脚本里加个偏移量,这样不管平台怎么调夏令时,数据始终对齐。
接下来是清洗,这才是重头戏。原始数据里什么妖魔鬼怪都有:重复的tick、负点差(某些流动性提供商偶尔抽风)、秒级时间戳乱序。我一般分三步走,
清洗完还有个容易忽略的环节,就是检查时间戳的连续性。周末休市和节假日那几根空K线,MT4默认是跳过的,但如果你导入的数据带了这些空档,回测时EA会在非交易时间触发挂单,造成假信号。我习惯在脚本里加个判断,如果两个tick间隔超过30分钟,直接跳过该时段,直到下一个有效报价。
最后说个我踩过最深的坑,就是数据量太大导致MT4内存溢出。有一次我导了十年的M1数据,结果一开回测就报"Array out of range"。后来学乖了,把数据按年份切分成多个文件,回测时用iCustom或者FileOpen分段读取,虽然代码复杂点,但稳定性天差地别。另外,建议用Solid State Drive跑回测,机械硬盘在读取大文件时延迟高,会影响EA的tick处理速度,导致回测结果和实盘偏差。
就说这么多吧,数据这块门道其实挺深,我也是交了不少学费才摸清。你们有没有遇到过导入后K线实体大小和图表对不上的情况?我怀疑是平台间点差结构差异导致的,但一直没验证,有懂的汇友可以聊聊。
先讲导入。很多人以为MT4的History Center就是全部,其实那只是冰山一角。我现在的习惯是,数据源优先用Dukascopy或者TrueFX的Tick级数据,尤其是做黄金和镑美这种点差波动大的品种,MT4自带的数据在2015年瑞郎黑天鹅事件前后那段时间,跳空和缺失简直没法看。下载下来的CSV文件,注意编码格式,必须转成UTF-8 without BOM,不然导入的时候时间戳会乱码,我最早吃过这个亏,一晚上回测数据全废。
导入的路径很简单,File -> Open Data Folder,把CSV扔进MQL4/Files目录,然后写个小脚本读取。但这里有个坑,MT4的Time[]数组是按服务器时间对齐的,如果你下载的数据是GMT+2的夏令时,直接读进来会差一个小时,导致K线开收盘价对不上。我的做法是导入前先统一换算成UTC,再在脚本里加个偏移量,这样不管平台怎么调夏令时,数据始终对齐。
接下来是清洗,这才是重头戏。原始数据里什么妖魔鬼怪都有:重复的tick、负点差(某些流动性提供商偶尔抽风)、秒级时间戳乱序。我一般分三步走,
- 首先,去重。按timestamp+bid+ask三个字段联合去重,别只按时间,不然同秒内合法报价会被误删。
- 然后,过滤异常值。我设定[bid-ask]绝对值超过正常点差5倍的直接剔除,比如欧美正常2点差,突然蹦出个15点的,多半是数据源插值错误。
- 还有,补全缺失。这里我不用线性插值,用前一个有效tick的last价格填充,因为外汇市场是离散报价,线性插值会制造出根本不存在的价格路径,回测结果会虚高。
清洗完还有个容易忽略的环节,就是检查时间戳的连续性。周末休市和节假日那几根空K线,MT4默认是跳过的,但如果你导入的数据带了这些空档,回测时EA会在非交易时间触发挂单,造成假信号。我习惯在脚本里加个判断,如果两个tick间隔超过30分钟,直接跳过该时段,直到下一个有效报价。
最后说个我踩过最深的坑,就是数据量太大导致MT4内存溢出。有一次我导了十年的M1数据,结果一开回测就报"Array out of range"。后来学乖了,把数据按年份切分成多个文件,回测时用iCustom或者FileOpen分段读取,虽然代码复杂点,但稳定性天差地别。另外,建议用Solid State Drive跑回测,机械硬盘在读取大文件时延迟高,会影响EA的tick处理速度,导致回测结果和实盘偏差。
就说这么多吧,数据这块门道其实挺深,我也是交了不少学费才摸清。你们有没有遇到过导入后K线实体大小和图表对不上的情况?我怀疑是平台间点差结构差异导致的,但一直没验证,有懂的汇友可以聊聊。
