EA报警推到手机上:WebRequest的三个必踩坑

| 发表于 15 小时前 | 显示全部楼层 |复制链接
最后由 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 分钟冷却,真信号就被这次失败吞掉了。
  1. // 检查在前,记录在后 —— 发成功了才算数
  2. if(TimeCurrent() - lastSend < InpCooldown * 60) return;
  3. if(SendAlert(msg)) lastSend = TimeCurrent();
复制代码
发送函数
  1. input string InpWebhook = "";   // robot webhook url
  2. bool SendAlert(string text)
  3. {
  4.    uchar post[], result[];      // uchar, not char
  5.    string headers;
  6.    string body = "{"msgtype":"text","text":{"content":"" + text + ""}}";
  7.    // StringToCharArray 会把结尾的 0 也算进去,所以要减 1
  8.    int len = StringToCharArray(body, post, 0, WHOLE_ARRAY, CP_UTF8) - 1;
  9.    if(len < 0) len = 0;
  10.    ArrayResize(post, len);
  11.    ResetLastError();
  12.    int code = WebRequest("POST", InpWebhook, "Content-Type: application/json\r\n",
  13.                          5000, post, result, headers);
  14.    if(code == -1) { Print("failed, err=", GetLastError()); return false; }
  15.    // 返回体一定要打印,而且按 UTF8 解码,否则中文报错信息是乱码
  16.    Print("http=", code, " ", CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8));
  17.    return (code == 200);
  18. }
复制代码
消息正文如果带引号、反斜杠或换行,记得先转义再拼进 JSON,否则整条消息会被判为格式非法。
出错了看这张表
现象原因
返回 -1,错误码 4060(MT4)/ 4014(MT5)URL 不在白名单,或者你从**指标**里调用了
服务端 400 / 收不到重载用错了,没法设 Content-Type
测试器里毫无反应策略测试器不支持,正常现象
HTTP 200 但手机没收到看返回体,多半是被限流,或机器人的关键词/加签没配对
中文变问号或乱码转换和解码都要显式写 `CP_UTF8`
最后
重载和白名单这两个坑,查文档能解决;冷却这个坑,只有被自己的 EA 刷过屏才会长记性。
做新策略时顺手把冷却加上,几行代码的事,换来的是观察期能真的观察下去。
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册