之前一直没把节假日停单当回事,直到去年圣诞节那天,我挂的一个镑美网格EA在流动性稀薄的时间段里连续开了七八单,点差直接拉到4.5个点当天回撤比平时一周都大。那会儿才意识到,假期行情不是“波动小”那么简单,而是流动性断层加上点差扩大,EA按正常逻辑跑就是送钱。后来花了大半天时间研究MT4和MT5的节假日停单配置,踩了不少坑,这里把过程整理一下。
先说我一开始犯的错。我最早的想法很简单,在EA参数里加个“周五22点后不开新仓”就完事了。结果发现两个问题:一是不同品种的休市时间不一样,黄金和欧美在圣诞前后的交易时段差了好几个小时;二是MT4的策略测试器里跑得好好的逻辑,挂到实盘VPS上因为服务器时间和经纪商时间有偏差,停单时间全乱套了。所以第一个要搞清楚的事情是:你VPS的系统时间、MT4/MT5服务器时间、经纪商所在时区,这三者必须对齐。我后来是在EA里加了一段读取TimeCurrent()然后跟本地时间做偏移量校准的代码,才把这个坑填上。
接下来是具体怎么配。我现在用的方案分两层,一层是硬性时间过滤,一层是品种级别的节假日判断。
然后说几个我踩过的具体坑。第一个是“停单”和“停所有操作”的区别。我一开始图省事,节假日直接让EA完全停止运行,结果有几笔浮亏的单子没来得及设止损,假期跳空直接爆了。后来改成只停开仓,持仓管理逻辑照常跑,这个问题才解决。第二个是MT5和MT4的差异,MT5里可以用SymbolInfoInteger()配合SYMBOL_TRADE_MODE来判断品种是否可交易,比MT4手动维护时间表要方便,但前提是你的经纪商在MT5上正确配置了交易时段。我遇到过一个小平台,MT5服务器上黄金的SYMBOL_TRADE_MODE在假期依然是全时段,这种就只能靠自己硬编码时间过滤。
最后说一下回测验证。我一般会在MT4策略测试器里用“Every tick”模式跑一遍包含圣诞和元旦的历史数据,重点看两个指标:最大回撤和交易频率。如果节假日期间交易频率没降下来,说明过滤逻辑没生效。另外我会把测试报告里的交易时间列出来,手动核对那些落在禁交易区间内的单子,看看是不是有漏网的。这个步骤挺枯燥的,但比实盘亏钱强。
现在这套配置跑了大概半年多,欧美和黄金在几个假期节点上都没再出现异常开仓。不过每个经纪商的服务器时间和休市安排都不一样,我这套参数不一定适合所有人。你们平时是怎么处理EA节假日停单的?有没有更简洁的方案,比如用外部csv文件导入节假日日历?交流。
先说我一开始犯的错。我最早的想法很简单,在EA参数里加个“周五22点后不开新仓”就完事了。结果发现两个问题:一是不同品种的休市时间不一样,黄金和欧美在圣诞前后的交易时段差了好几个小时;二是MT4的策略测试器里跑得好好的逻辑,挂到实盘VPS上因为服务器时间和经纪商时间有偏差,停单时间全乱套了。所以第一个要搞清楚的事情是:你VPS的系统时间、MT4/MT5服务器时间、经纪商所在时区,这三者必须对齐。我后来是在EA里加了一段读取TimeCurrent()然后跟本地时间做偏移量校准的代码,才把这个坑填上。
接下来是具体怎么配。我现在用的方案分两层,一层是硬性时间过滤,一层是品种级别的节假日判断。
- 时间过滤层:在EA的OnTick()最前面加一个判断,如果当前服务器时间落在预设的禁交易区间内,直接return。这个区间我一般设置成周五23:00到周一01:00(服务器时间),以及每天凌晨04:00到06:00这种流动性差的时段。注意这里要用TimeCurrent()而不是TimeLocal(),否则VPS一重启时间就乱了。
- 节假日判断层:MT4本身没有内置的节假日日历,我的做法是手动维护一个数组,把每年主要节假日列进去,比如圣诞、元旦、复活节、美国独立日这些。然后写一个IsHoliday()函数,用TimeMonth()和TimeDay()去匹配。这个方法的缺点是每年要更新一次,但比依赖外部DLL稳定得多。
- 点差保护层:节假日期间点差扩大是常态,我加了一个判断,如果当前Ask-Bid超过设定阈值(比如欧美超过3个点,黄金超过50个点),就暂停开新仓,只允许平仓。这个用MarketInfo()获取点差就行,但要注意有些经纪商的浮动点差在假期会突然跳变,阈值别设太死,我一开始设2个点,结果正常行情也被拦了。
然后说几个我踩过的具体坑。第一个是“停单”和“停所有操作”的区别。我一开始图省事,节假日直接让EA完全停止运行,结果有几笔浮亏的单子没来得及设止损,假期跳空直接爆了。后来改成只停开仓,持仓管理逻辑照常跑,这个问题才解决。第二个是MT5和MT4的差异,MT5里可以用SymbolInfoInteger()配合SYMBOL_TRADE_MODE来判断品种是否可交易,比MT4手动维护时间表要方便,但前提是你的经纪商在MT5上正确配置了交易时段。我遇到过一个小平台,MT5服务器上黄金的SYMBOL_TRADE_MODE在假期依然是全时段,这种就只能靠自己硬编码时间过滤。
最后说一下回测验证。我一般会在MT4策略测试器里用“Every tick”模式跑一遍包含圣诞和元旦的历史数据,重点看两个指标:最大回撤和交易频率。如果节假日期间交易频率没降下来,说明过滤逻辑没生效。另外我会把测试报告里的交易时间列出来,手动核对那些落在禁交易区间内的单子,看看是不是有漏网的。这个步骤挺枯燥的,但比实盘亏钱强。
现在这套配置跑了大概半年多,欧美和黄金在几个假期节点上都没再出现异常开仓。不过每个经纪商的服务器时间和休市安排都不一样,我这套参数不一定适合所有人。你们平时是怎么处理EA节假日停单的?有没有更简洁的方案,比如用外部csv文件导入节假日日历?交流。
