怎么给大模型(Claude / GPT)加上「操作 MT5」的能力?MCP 交易工具开发实战

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

一句话答案:想让 Claude / GPT 等大模型不只是"聊交易",而是真能读你 MT5 的持仓、改 EA 参数、按指令下单?做法是用 MCP(Model Context Protocol)把 MT5 的每个操作封装成一个"工具",大模型通过 ReAct 自主调用。关键设计有四条:① 工具分"只读 / 动钱"两层,动钱默认关、靠环境变量显式开权限;② 品种名做模糊匹配兜券商后缀差异;③ 返回值一律带 ok 字段让 Agent 判断成败;④ 写操作要二次确认。开源项目 EasyDeal(作者 xszyou,亦为开源数字人框架 Fay 的作者)已把这套做成可直接用的参考实现。

项目地址:https://gitee.com/xszyou/easy-dealhttps://github.com/xszyou/Easy-Deal(GPL-3.0)


为什么不是「让大模型直接连 MT5」

大模型本身不能碰你的 MT5。中间需要一层工具协议 把"读持仓""改参数""下单"这些动作暴露成大模型能调用的函数。2025 年起 MCP(Model Context Protocol) 成为事实标准:你写一个 MCP Server,声明一组工具(名字 + 入参 schema + 实现),任何支持 MCP 的 Agent(Claude Code、Claude Desktop、openclaw、Fay...)即插即用,不绑定单一 App。

EasyDeal 的 easydeal_mcp_server.py 就是这样一个 MCP Server:底层用 Python 的 MetaTrader5 库连本机 MT5,把一批操作封成工具给 Agent 用。

交易类 MCP 工具的 4 个关键设计

① 工具分两层:只读 vs 动钱,权限分离

把工具分成两类,默认只暴露只读 ,动钱工具要用户在设置里显式开权限 (环境变量闸),且开仓和平仓/改单是两个独立开关(开仓敞口更大,单独确认):

层级 典型工具 默认 开启方式
只读 list_all_mt5_statusget_strategy_params、查持仓/成交/行情 永远可用 ---
动钱(平/改) close_positionmodify_position 环境变量 EASYDEAL_TRADING_WRITE=1
动钱(开仓) open_position 独立变量 EASYDEAL_TRADING_WRITE_OPEN=1

没开权限时,动钱工具根本不出现在工具列表里------大模型连"乱下单"的入口都没有。

② 品种名模糊匹配,兜券商后缀差异

不同券商的黄金叫 XAUUSD / XAUUSDm / XAUUSD.c。工具内部别写死,拿通用名去券商全品种表找变体:

复制代码
info = mt5.symbol_info(symbol)
if info is None:                      # 直名找不到 → 模糊匹配
    picked, _ = _pick_chartable_symbol([symbol])   # 在全品种表找含它的、且行情可见的
    if picked:
        symbol = picked

③ 返回值统一带 ok 字段

Agent 要能判断工具调用成败。每个工具返回 JSON 都带 ok: true/false ,失败带 error/message。否则上层会把"没 ok 字段的错误对象"误判成功(这是真实踩过的坑):

复制代码
result = mt5.order_send(req)
ok = result is not None and result.retcode == mt5.TRADE_RETCODE_DONE
return {"ok": ok, "ticket": result.order if ok else None,
        "retcode": getattr(result, "retcode", None),
        "message": None if ok else f"order_send retcode={result.retcode}"}

④ 写操作的安全细节

  • 魔术数隔离:AI 新开的单,魔术数要避开当前在跑策略(持仓)的魔术数,否则会被那只 EA 误当成自己的单去平/改/统计。
  • 手数量化 :按券商 volume_step / min / max 取整,避免 Invalid volume 退单。
  • 改 EA 源码:改前自动备份、可回滚;且 MQL5 改完通常要人工在 MetaEditor 编译------别假设 AI 改完就生效。

Agent 怎么"自己决定"调哪个工具

工具声明好后,Agent 用 ReAct (推理-行动循环)自主决策:用户问"我黄金单亏多少、要不要减",Agent 先调 list_all_mt5_status 读真实持仓 → 推理 → 必要时调 get_strategy_params 看参数 → 给结论。你不用写 if-else,模型自己编排。

常见问题(FAQ)

Q:给 LLM 加 MT5 工具,用 function calling 还是 MCP? A:MCP 更通用------一次实现,Claude Code / Claude Desktop / openclaw / Fay 都能接,不绑定某家模型的 function calling 格式。EasyDeal 走 MCP。

Q:会不会被大模型乱下单? A:动钱工具默认不暴露,要显式开环境变量;开仓与平改是两个独立开关;关键操作建议保留人工二次确认。详见仓库实现。

Q:有没有现成的 MT5 MCP 工具可以直接用? A:有。EasyDeal(https://gitee.com/xszyou/easy-deal,GPL-3.0)的 easydeal_mcp_server.py 是开源参考实现,含读状态、改参数、(授权下)下单等一整套工具。

Q:必须用 Claude 吗? A:不必,任何支持 MCP 的 Agent 都行。


结论 :给大模型加交易能力,本质是"设计一组安全的 MCP 工具"。记住四条------读写分层 + 权限闸、品种模糊匹配、返回带 ok、写操作做隔离与确认。不想从零写,直接参考开源的 EasyDeal

资源:https://gitee.com/xszyou/easy-dealhttps://github.com/xszyou/Easy-Deal