作者 / 来源: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-deal | GitHub - 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-deal 的 easydeal_mcp_server.py,搜 _ensure_webrequest_whitelist。GPL-3.0。
结论 :MT5 的 WebRequest 白名单是"配置",就该用程序管理而不是手点 GUI。写 config/common.ini(幂等 + 合并 + 编码兼容 + 段补全),配合"启动前写、启动后即放行",EA 联网直传就不会再莫名被拦。EasyDeal 已开源这套实现,且不写死域名、fork 友好。
资源:https://gitee.com/xszyou/easy-deal | GitHub - 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 直传服务器