冷清0.2

EA交易时间过滤设置这几个细节很多人忽略

XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
BlueOcean4
BlueOcean4 楼主
1 小时前 3 0 1分钟 新汇友(注册会员) Lv.1 主题3 帖数4 积分726 汇币513
1楼
说实话,我最早用EA的时候,时间过滤这块栽过好几次跟头。当时跑一个镑美的均值回归策略,回测里明明表现很稳,一上实盘就开始连续小亏,查了半天日志才发现问题——EA在伦敦开盘前那段时间就开始挂单,流动性稀薄得跟水一样,点差拉得老宽,那些看似有效的信号全是噪音。后来我花了两周专门调时间过滤,才算是把这个问题理顺了。
第一个坑就是TimeCurrent()和TimeTradeServer()的混淆。很多初写EA的朋友直接用TimeCurrent(),这是客户端本地时间,如果你VPS设的是UTC+8,而经纪商服务器时间是UTC+2或者UTC+3,那你的过滤窗口就全偏了。我吃过这个亏,EA设定只在下午三点到五点开仓,结果实际执行时间差了六个小时,等于在凌晨跑策略。解决办法很简单,统一用TimeTradeServer(),或者干脆在init函数里算好服务器和本地的时差偏移量,存成全局变量。别偷懒,这一步做不好后面全是白搭。
第二个容易被忽略的点是星期几的判断和节假日日历。我见过不少EA只写了Hour()>8 && Hour()<20这种粗粒度过滤,结果周一早上八点就开仓,碰上某些平台因为流动性不足把点差放大到平时的三倍,止损直接被扫。更麻烦的是像圣诞、元旦这种大假期,有些经纪商会提前休市,但MT4的服务器时间照常走,你的EA照样按时间窗口开单,结果单子挂在那边没人接。我现在的做法是维护一个简单的节假日排除表,用数组存好每年固定的休市日期,在开仓前先做个日期检查。虽然麻烦点,但至少不会在流动性真空期裸奔。
第三个细节是关于过滤窗口的边界处理。很多人写if(Hour()>=start && Hour()<=end),但没考虑到分钟级别的情况。比如你想只在伦敦开盘后一小时到两小时之间交易,也就是9:00到10:00,但EA可能在9:59:58开了一单,然后10:00:01价格刚好触发止盈,这没问题。可如果策略是持仓过几分钟才平仓,那你10点整开的单子,等到10点15分平仓,这时候流动性已经变了,成交滑点可能很大。我的建议是把过滤条件写成if(TimeCurrent()>=startTime && TimeCurrent()<=endTime-60),留出至少一分钟的缓冲,避免在窗口边界上开仓。
另外,多品种对冲时的时间过滤要分开设置。我跑过一个EURUSD和GBPUSD的统计套利EA,两个品种的活跃时段其实有差异,EURUSD在伦敦盘和纽约盘交接的时候波动最稳定,而GBPUSD往往在伦敦早盘就有一波趋势。如果共用一套时间过滤参数,要么错过GBPUSD的最佳入场,要么在EURUSD的垃圾时段频繁开仓。我后来把时间参数做成外部输入变量,每个品种单独一组,跑优化的时候也分开调,相关系数矩阵的稳定性明显提升了不少。
最后提一下日志记录的重要性。我每次调整时间过滤逻辑,都会在EA里加一条Print语句,把每次开仓被拦截的原因和时间戳打出来。这样复盘的时候能清楚看到哪些单子是被时间规则挡掉的,哪些是正常通过但亏损的。曾经有个汇友跟我抱怨说EA老是错过好行情,结果一查日志,发现他的时间过滤设成了UTC时间,而他的VPS是北京时间,等于把最佳交易时段全屏蔽了。这种问题不靠日志排查,光看回测曲线根本发现不了。
不知道你们平时写时间过滤的时候,是直接用Hour()还是用更细粒度的时间戳比较?有没有遇到过因为时区或者节假日导致EA乱开仓的情况?贴代码片段一起讨论。
0 回复 复制 众裁0
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。汇友之家合作的各家经纪商均为持有正规外汇牌照的经纪商,我们不参与经纪商的任何经营活动。经纪商在经营过程中可能出现破产清算、资不抵债、跑路或躲避责任等情况,这些问题汇友之家无法控制,亦不承诺任何经纪商资金的绝对安全。请知悉!
← 上一帖 量化API限频了有什么解决办法