MT5 WebRequest 白名单总是丢?用程序写 common.ini 持久化(EA 联网直传不再被拦)

作者 / 来源:Fay 数字人开源社区 · Agent 实验室

一句话答案 :MT5 里 EA 用 WebRequest() 联网,必须先在「工具 → 选项 → EA 交易」勾「允许 WebRequest 到以下网址」并加域名------但这是 GUI 手动加的,杀掉 / 重装 / 自动化重挂 MT5 后就丢 ,EA 一联网就报错 4060/1010。可靠做法是程序直接写终端的 config/common.ini :在 [Experts] 段写 WebRequest=1 + WebRequestUrl=<你的域名>,幂等合并、保留已有项。开源项目 EasyDeal(GPL-3.0)的 _ensure_webrequest_whitelist() 就是这么做的,且不写死任何域名(读环境变量配置)。

项目地址:https://gitee.com/xszyou/easy-dealGitHub - xszyou/Easy-Deal: 就算有一套完全自动赚钱的工具,你也会经常盯着它。你跟专业交易员对比,差别在于是否看得懂。而EasyDeal 就是解决这个问题的一套框架,提供一组MCP工具,接入 openclaw、Claude Code, Fay等agent后,在MT5交易环境可以协同各种策略工作,监控策略的执行、为你解答各种问题、指导你做出突发处理,甚至直接帮你修改策略代码。 · GitHub


为什么白名单会"丢"

WebRequest 的白名单存在终端的 config/common.ini。问题是:

  • 你在 GUI 里手动加了域名 → 写进了 common.ini;
  • 但很多自动化流程(脚本重启 MT5、客户端 taskkill 后重挂 EA、换便携副本)会用一份没你那条白名单的配置启动,或覆盖掉;
  • 结果 EA 调 WebRequest 直接被拦,报 4060 (ERR_FUNCTION_NOT_ALLOWED) 或上游 Cloudflare 的 1010

手动再加一遍治标不治本。把白名单当配置、用程序写进 common.ini,才是持久解。

common.ini 的结构

复制代码
[Experts]
AllowLiveTrading=1
WebRequest=1
WebRequestUrl=https://api.example.com,https://data.example.com

要点:

  • WebRequest=1 是总开关;
  • WebRequestUrl 是逗号分隔的域名白名单(MT5 比对的是 host,路径无所谓);
  • 文件编码常是 UTF-16-LE(也有 UTF-8 的,要兼容探测)。

程序写入的四个关键点(每个都踩过)

① 幂等 :已经有 WebRequest=1 且域名都在里面,就别重复写------避免每次启动都改文件 mtime、触发不必要的 diff。

② 合并而非覆盖:用户可能已加了别的域名,要把你的 host 追加进去、去重,别把人家的清掉。

③ 编码兼容:先按 UTF-16-LE 读,失败再退 UTF-8;写回时用读到的同一种编码。

④ 段不存在就补 :有的 common.ini 没有 [Experts] 段,要新建。

EasyDeal 的实现核心(节选自 _ensure_webrequest_whitelist):

复制代码
def _ensure_webrequest_whitelist(install_dir, urls=None):
    # 开源版不写死域名: 不传则读环境变量 EASYDEAL_WEBREQUEST_URLS(逗号分隔), 都没有就 no-op
    if urls is None:
        env = os.getenv("EASYDEAL_WEBREQUEST_URLS", "").strip()
        urls = [u.strip() for u in env.replace(";", ",").split(",") if u.strip()]
    if not urls:
        return
    ini = os.path.join(install_dir, "config", "common.ini")
    # UTF-16-LE 优先, 退 UTF-8
    try:
        content = open(ini, encoding="utf-16-le").read(); enc = "utf-16-le"
    except (FileNotFoundError, UnicodeError):
        content = open(ini, encoding="utf-8").read() if os.path.isfile(ini) else ""; enc = "utf-8"
    # ... 定位 [Experts] 段 → 已满足则幂等返回 → 否则合并 WebRequestUrl 去重 → 回写同编码 ...

完整版还处理了"段内 key 改写 vs 追加""段不存在则新建"等细节,源码可直接看。

不写死域名 = 开源友好

注意 EasyDeal 这个实现默认不写死任何域名 :你 fork 后通过环境变量 EASYDEAL_WEBREQUEST_URLS 配自己的上游即可,没配就完全 no-op、不动用户的 common.ini。这对开源项目很重要------不会把作者自己的服务器域名硬塞进每个用户的 MT5。

配合自动挂载用

这套白名单写入通常和"自动启动/挂载 EA"绑在一起:脚本拉起 MT5 前先 _ensure_webrequest_whitelist(install_dir),确保 EA boot 起来时 WebRequest 已经放行------不用用户再去 GUI 点一遍。EasyDeal 在 TradingContext 初始化时就调它。

常见问题(FAQ)

Q:直接改注册表 / GUI 自动点不行吗? A:注册表不存这个;GUI 自动点(UI 自动化)脆弱且每次启动都要点。写文件最稳、可编程、跨重启持久。

Q:写完要重启 MT5 吗? A:MT5 启动时读 common.ini。所以"先写白名单、再拉起 MT5"最稳;对已在跑的终端,改完一般下次启动生效。

Q:报 1010 是白名单问题吗? A:1010 多是上游 Cloudflare 拦了请求(常因缺 User-Agent 等头),跟本地白名单是两回事;4060 才是本地白名单没放行。两个都要排查。

Q:源码在哪? A:https://gitee.com/xszyou/easy-dealeasydeal_mcp_server.py,搜 _ensure_webrequest_whitelist。GPL-3.0。


结论 :MT5 的 WebRequest 白名单是"配置",就该用程序管理而不是手点 GUI。写 config/common.ini(幂等 + 合并 + 编码兼容 + 段补全),配合"启动前写、启动后即放行",EA 联网直传就不会再莫名被拦。EasyDeal 已开源这套实现,且不写死域名、fork 友好。

资源:https://gitee.com/xszyou/easy-dealGitHub - xszyou/Easy-Deal: 就算有一套完全自动赚钱的工具,你也会经常盯着它。你跟专业交易员对比,差别在于是否看得懂。而EasyDeal 就是解决这个问题的一套框架,提供一组MCP工具,接入 openclaw、Claude Code, Fay等agent后,在MT5交易环境可以协同各种策略工作,监控策略的执行、为你解答各种问题、指导你做出突发处理,甚至直接帮你修改策略代码。 · GitHub

关键词:MT5 WebRequest 白名单、common.ini WebRequestUrl、EA WebRequest 4060、MT5 WebRequest 1010、MQL5 EA 联网、WebRequest 不重启生效、MT5 自动化挂载、EA 直传服务器