之前写日志挖 bug 的时候顺手发现一件事:我那套 EA 有一批亏损单,集中在点差异常放大的那几分钟里。信号本身没问题,问题是它在一个根本不该成交的价格上成交了。于是我加了个特别小的模块:开仓前先看一眼实时点差,太离谱就直接跳过。
先看黄金平均点差的逐小时曲线,红虚线是我设的 2.5 点阈值,红色填充区就是要屏蔽的时段:
凌晨那几个小时点差能到 3-4 点,欧美盘稳定在 1.3-1.6 点,差了将近三倍。而我那批亏损单,一大半就扎在凌晨和美股收盘前后那两段。
模块逻辑非常短,就三步:
一、判断时机:每次信号触发、准备下单之前,读一次当前品种的实时点差(MQL 里就是 SymbolInfoInteger 取 SPREAD,或者用 Ask-Bid 自己算)。注意是下单前读,不要用回测里的固定点差,那是两码事。
二、过滤动作:点差大于阈值就跳过这次信号,不排队、不重试、不”等会儿再补”。这条很关键——我第一版写成了”等点差回落后补单”,结果补进去的全是行情已经走完的尾巴,比不过滤还差。
三、二次保护:下单之后再读一次,如果实际滑点超过 3 点就立刻撤单。这条是防那种”点差看着正常、一成交就滑飞”的情况,数据发布前后特别常见。
半年跑下来的效果:少做了 21% 的单,净利反而多了 34%。被砍掉的那两成几乎全是低质量成交。少做还多赚,这种事在 EA 里每次遇到都觉得挺魔幻。
几个实现上的坑,写代码的朋友应该用得上:
阈值千万别写死。黄金 2.5 点合适,交叉盘可能要放到 4 点,日元系 1.5 点就够。我每个品种都是单独拉两周的逐小时点差统计,取 80 分位往上一点定的。照抄一个全局常数,要么滤了个寂寞,要么把好单全砍了。
别在回测里评估这个模块。绝大多数回测引擎的点差是固定值或者简化模型,过滤器在回测里几乎不触发,看不出效果。这个只能靠实盘或者 tick 级数据验证,我是跑了一个月模拟实盘才敢上的。
阈值最好能自适应。我现在改成取过去 20 根 K 线点差均值的 1.8 倍,行情整体变躁动时阈值会自己抬,比固定值稳。但别自适应得太快,不然点差一放大它就把阈值也跟着抬上去,等于过滤器自我取消了——这个 bug 我踩过,挺隐蔽的。
还有个副作用:加了过滤之后交易频率降了,我顺手把仓位管理的重算间隔也调宽了一点,不然会出现”刚判完点差又重算一遍”的无谓开销。
你们有在点差上做过滤的吗?或者有没有更好的自适应算法,评论区贴一下思路,我这个 1.8 倍还是拍脑袋定的,想找个更有依据的算法换掉。

没有回复内容