EA的高点差时段自动暂停逻辑

新帖
登录发帖
XM 推荐平台

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

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
量化Coder
量化Coder 楼主 半小时前 浏览 4 回复 0 阅读 1 分钟
Lv.2 活跃汇友 等级 Lv.2 主题 8 帖数 35 积分 1874 汇币 1622
1楼
上周镑美开盘那会儿,我挂的一个网格EA在1.2个点差的瞬间连开了七单,等点差回落到0.3的时候账户已经浮亏了快80美金。后来我翻M1历史数据才发现,那个时间窗口的点差峰值能冲到3.5而我的EA压根没做任何过滤。这事让我下决心把点差暂停逻辑补上,今天把踩过的坑和最终跑通的方案整理一下。
先说问题本质:MT4/MT5里没有现成的“点差超过X就暂停”函数,得自己算。最直接的做法是在OnTick里读MarketInfo(Symbol(), MODE_SPREAD)(MT5用SymbolInfoInteger(SYMBOL_SPREAD)),跟预设阈值比较。但坑在于——这个值返回的是点,不是点差本身,得除以10才是标准点差(五位报价平台)。我第一次写的时候忘了除,设了个阈值50,结果EA一整天都没开过单,排查了半天才发现是单位搞错了 😅
真正跑起来的逻辑我拆成三层:

  • 第一层:时段过滤。用TimeCurrent()判断当前服务器时间是否落在已知的高点差区间(比如周一开盘前15分钟、周五收盘前半小时、重大数据前后5分钟),这些时段直接跳过,不参与点差判断,省得频繁触发。
  • 第二层:动态点差阈值。不要写死一个数,我用最近N根M1的平均点差 × 1.8作为动态上限,再用一个硬上限兜底(比如黄金设80点、欧美设25点)。这样非农那种极端行情也能挡住。
  • 第三层:冷却机制。点差回落之后不能立刻恢复交易,我加了个连续3根M1点差低于阈值才解除暂停,否则会出现点差反复跳动导致EA频繁开关单的情况。

代码核心大概长这样(MT4版):

double avgSpread = 0;
for(int i=1; i<=20; i++) avgSpread += (High[i]-Low[i])/Point/10;
avgSpread /= 20;
double curSpread = MarketInfo(Symbol(), MODE_SPREAD)/10;
double dynLimit = MathMin(avgSpread*1.8, HardLimit);
if(curSpread > dynLimit) { PauseCounter++; return; }
else { if(PauseCounter>0) PauseCounter--; if(PauseCounter>0) return; }
注意那个PauseCounter就是冷却计数器,别用bool直接切,容易抖。另外回测的时候MT4的tick点差是模拟的,这块逻辑测不出真实效果,我是拿实盘demo跑了整整两周才调稳的,建议先用0.01手在波动大的品种上验证,比如黄金和镑美。
还有个容易忽略的点:多品种EA要按品种分别维护状态,别用一个全局变量,不然欧美的点差把黄金的单也停了。我一开始就犯过这错,被自己蠢到。
你们平时是怎么处理高点差时段的?是直接时段过滤还是也做了动态阈值?楼下聊聊各自的实现方式。
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 关于加密货币交易定投一年的成果,分享一个反常识的发现