最后由 paullhou 于 2026-8-16 08:13 编辑
EA 报警推到手机上:三个必踩的坑
策略挂在 VPS 上,人不可能一直盯着。让 EA 用 WebRequest 把消息发到钉钉或企业微信的群机器人,手机就能秒收。
功能不复杂,但下面三个坑几乎人人踩一遍,说清楚能省你一整天。
坑一:重载选错,JSON 永远发不出去
WebRequest 有两个版本,一个九个参数、一个七个参数。区别不在参数多少,而在七参数那版才有 headers。
机器人只收 JSON,你必须能设置 Content-Type: application/json;九参数那版第三、四个参数被固定成了 cookie 和 referer,没地方塞。
用错了还不报错:服务端要么回 400,要么直接丢掉,而你在 MT 里看着像"发出去了"。认准七参数那个就行。
坑二:白名单填不对
位置:工具 → 选项 → EA交易 → 允许 WebRequest 访问以下 URL。
- 填域名前缀就行,别填带参数的完整地址;
- 子域名不通配:填了 dingtalk.com,oapi.dingtalk.com 照样不通;
- 带端口的必须写端口,自建服务最容易漏这个;
- 策略测试器里 WebRequest 用不了,这是设计如此,不是你代码的问题。
最后一条最坑人:在测试器里怎么调都没反应,其实挂到图表上就好了。
坑三:不做冷却,你会被自己的 EA 刷屏
价格在关键位反复穿越是常态。"突破就报警"的逻辑,震荡时十分钟能报二十次,手机响到你想卸载。更麻烦的是机器人有频控,刷多了被限流,真正重要的那条反而发不出去。
两条规则就够:
- 同一品种、同一方向,N 分钟内只发一次(我用 15 分钟);
- 方向变了立刻放行,不受冷却限制。
别只用一个全局时间戳——那样做多的信号会把做空的信号一起吃掉,得按"品种 + 方向"分开记。
还有个更隐蔽的:时间戳要等发送成功了再记。如果检查冷却时顺手就写上了,那么一次网络抖动造成的失败,同样会启动 15 分钟冷却,真信号就被这次失败吞掉了。
- // 检查在前,记录在后 —— 发成功了才算数
- if(TimeCurrent() - lastSend < InpCooldown * 60) return;
- if(SendAlert(msg)) lastSend = TimeCurrent();
复制代码 发送函数
- input string InpWebhook = ""; // robot webhook url
-
- bool SendAlert(string text)
- {
- uchar post[], result[]; // uchar, not char
- string headers;
- string body = "{"msgtype":"text","text":{"content":"" + text + ""}}";
-
- // StringToCharArray 会把结尾的 0 也算进去,所以要减 1
- int len = StringToCharArray(body, post, 0, WHOLE_ARRAY, CP_UTF8) - 1;
- if(len < 0) len = 0;
- ArrayResize(post, len);
-
- ResetLastError();
- int code = WebRequest("POST", InpWebhook, "Content-Type: application/json\r\n",
- 5000, post, result, headers);
- if(code == -1) { Print("failed, err=", GetLastError()); return false; }
-
- // 返回体一定要打印,而且按 UTF8 解码,否则中文报错信息是乱码
- Print("http=", code, " ", CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8));
- return (code == 200);
- }
复制代码 消息正文如果带引号、反斜杠或换行,记得先转义再拼进 JSON,否则整条消息会被判为格式非法。
出错了看这张表
| 现象 | 原因 | | 返回 -1,错误码 4060(MT4)/ 4014(MT5) | URL 不在白名单,或者你从**指标**里调用了 | | 服务端 400 / 收不到 | 重载用错了,没法设 Content-Type | | 测试器里毫无反应 | 策略测试器不支持,正常现象 | | HTTP 200 但手机没收到 | 看返回体,多半是被限流,或机器人的关键词/加签没配对 | | 中文变问号或乱码 | 转换和解码都要显式写 `CP_UTF8` | 最后
重载和白名单这两个坑,查文档能解决;冷却这个坑,只有被自己的 EA 刷过屏才会长记性。
做新策略时顺手把冷却加上,几行代码的事,换来的是观察期能真的观察下去。 |