一个用于 MT5(XAUUSD)+ 外部 AI Agent 的基础实现,目标是搭建“数据导出 -> AI 决策 -> 回传下单”的闭环。
- MT5 EA 对外导出:Tick、K线、持仓。
- Python Bridge 接收数据并接入多厂商 AI API。
- 支持下单类型:
- taker:
buy_market,sell_market - maker:
buy_limit,sell_limit,buy_stop,sell_stop
- taker:
- 权限模式:
kernel(内核权限):Agent 自动生成并下发交易指令,EA 可直接执行。user(用户权限):只给建议,不允许自动下单。
- 风险守卫:
- 最小手数 0.01
- 无 SL/TP 拒绝
- 单笔风险阈值过滤
- 复盘记忆:订单结果持续写入
trade_review.md - 对话接口:
/v1/chat
mql5/Experts/AgentBridgeEA.mq5:EA 桥接器python/mt5_agent/app.py:FastAPI 服务docs/ARCHITECTURE.md:架构说明
- 将
mql5/Experts/AgentBridgeEA.mq5放入 MT5Experts目录并编译。 - 在 MT5 中允许 WebRequest URL:
http://127.0.0.1:8000 - EA 参数里设置:
InpBridgeBaseUrlInpApiKeyInpSymbol=XAUUSD
cd python
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn mt5_agent.app:app --host 0.0.0.0 --port 8000 --reloadcurl -H "X-API-Key: change_me" http://127.0.0.1:8000/v1/agent/modecurl -X POST http://127.0.0.1:8000/v1/agent/mode \
-H "Content-Type: application/json" \
-H "X-API-Key: change_me" \
-d '{"mode":"kernel","reason":"start autonomous execution"}'curl -X POST http://127.0.0.1:8000/v1/agent/mode \
-H "Content-Type: application/json" \
-H "X-API-Key: change_me" \
-d '{"mode":"user","reason":"manual supervision"}'Python 侧支持三类:
gemini:原生 Google Gemini API(默认)anthropic:原生 Claude Messages APIopenai_compatible:兼容 OpenAI Chat Completions 的全系网关(OpenAI、DeepSeek、Qwen兼容网关、Moonshot兼容网关等)
在 .env 配置:
AI_PROVIDER=openai_compatible|anthropic|geminiAI_BASE_URLAI_API_KEYAI_MODELAI_CALL_MIN_INTERVAL(最小调用间隔,默认 10 秒)AI_FORCE_INTERVAL(最长强制调用间隔,默认 60 秒)AI_TRIGGER_PRICE_BPS(价格触发阈值,默认 1.5 bps)RISK_CONTRACT_MULTIPLIER(风险估算合约系数,默认 1.0)
常用 AI_MODEL 示例:
- OpenAI:
gpt-4.1-mini/gpt-4.1/o4-mini - Claude:
claude-3-7-sonnet-latest/claude-3-5-sonnet-latest - Gemini:
gemini-2.5-pro/gemini-2.5-flash - DeepSeek(OpenAI兼容):
deepseek-chat/deepseek-reasoner - Qwen(OpenAI兼容网关):
qwen-max/qwen-plus
示例(Claude 原生):
AI_PROVIDER=anthropic
AI_BASE_URL=https://api.anthropic.com
AI_API_KEY=xxx
AI_MODEL=claude-3-7-sonnet-latest默认示例(Gemini 原生):
AI_PROVIDER=gemini
AI_BASE_URL=https://generativelanguage.googleapis.com
AI_API_KEY=xxx
AI_MODEL=gemini-2.5-flash
GEMINI_PROXY_URL=http://127.0.0.1:7897Vertex AI 模式(可不填 AI_API_KEY):
export GOOGLE_CLOUD_PROJECT=810669871257
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True注意:当
GOOGLE_GENAI_USE_VERTEXAI=True时,建议留空AI_API_KEY,避免 SDK 优先走 API key 鉴权。
示例(DeepSeek OpenAI兼容):
AI_PROVIDER=openai_compatible
AI_BASE_URL=https://api.deepseek.com/v1
AI_API_KEY=xxx
AI_MODEL=deepseek-chat当前实现采用双输入:
- 原始 OHLCV 序列(
candles_m1) - 结构化形态特征(如
doji/engulfing/ trend)
建议后续扩展到 M5/M15/H1,形成多周期共振特征。
常见原因:
- 命中节流:
AI_CALL_MIN_INTERVAL内会跳过 AI,避免高频耗 token。 - 市场变化不明显:未出现新 M1、价格波动不足(
AI_TRIGGER_PRICE_BPS)时会跳过。 - 风险守卫拒绝:无 SL/TP、风险超阈值会被降级为
action=none。 - 鉴权冲突:Vertex 模式下若填了
AI_API_KEY,可能优先走 key 而非项目/区域凭据。
建议参数(兼顾实时与成本):
AI_CALL_MIN_INTERVAL=3~5AI_FORCE_INTERVAL=20~30AI_TRIGGER_PRICE_BPS=0.8~1.2
- “永不爆仓”无法被任何系统绝对保证。
- 本项目通过风险规则显著降低风险,但不能承诺收益。
- 请务必先在模拟盘回测与前向验证。
- 加入新闻上下文 Adapter(宏观事件对黄金影响)。
- 引入回测引擎与绩效报表。
- 增加风格学习器(根据你的历史订单动态调参)。
- 做一个 Web UI 聊天框,仅保留交易相关上下文。
你可以直接调用 /v1/chat,它会基于最近一次 EA 上报的实时快照(价格、持仓、多周期K线)回答,并给出交易建议。
curl -H "X-API-Key: change_me" "http://127.0.0.1:8000/health"重点看返回里的:
last_symbol是否有值candles.m1/m5/m15/h1是否大于 0
curl -X POST "http://127.0.0.1:8000/v1/chat" \
-H "Content-Type: application/json" \
-d '{
"symbol": "XAUUSD",
"message": "给我当前实时行情解读:趋势、关键支撑阻力、以及是否建议开仓"
}'当系统是 kernel 模式时,你可以直接在聊天里下达:
curl -X POST "http://127.0.0.1:8000/v1/chat" \
-H "Content-Type: application/json" \
-d '{
"symbol": "XAUUSD",
"message": "立即下单开仓,给出开仓原因、逻辑和胜率预测"
}'系统会做这些事:
- 立即触发一次 AI 决策(绕过最小间隔节流)
- 返回结构化指令
command(含 action/volume/sl/tp) - 返回
decision_logic、win_rate_estimate、position_management_plan - 若指令可执行,会自动写入
next-command队列,EA 可直接拉取执行 - 若 AI 返回
none,会启用“强制下单兜底”(最小仓位+保守SL/TP),尽量避免“必须下单但被拒绝”
典型返回字段:
answer:自然语言建议command:结构化交易指令(action/volume/sl/tp)force_trade_requested/queued_for_execution:是否是“立即下单”请求,是否已入执行队列decision_logic:当前开单逻辑摘要(H1/M15 趋势、M5/M1 形态)win_rate_estimate:当前策略胜率估计(结合历史交易胜率)position_management_plan:仓位管理建议(静态/动态止盈止损)multi_tf:多周期分析摘要provider:当前 AI 提供商
- “基于当前快照,给出 XAUUSD 的 1 分钟到 1 小时多周期共振方向。”
- “现在是震荡还是趋势?如果不开仓请明确写原因。”
- “请给一个低风险方案:入场、止损、止盈、失效条件。”
提示:
/v1/chat不需要X-API-Key;但如果你希望回答足够“实时”,要先保证 EA 持续向/v1/mt5/ingest推送数据。
已支持:在 kernel 模式下,只要有持仓,每次 ingest 都会强制让 AI 先做“仓位管理扫描”,再考虑新开仓。
AI 现在可以返回以下管理动作:
modify_all_sl_tp:批量更新当前品种所有持仓的止损/止盈(动态移动止盈止损)close_all:主动全部平仓(当行情不确定或策略失效时)
EA 已支持执行以上两个动作,因此可以实现:
- 持仓盈利时动态上移止损(保本/锁盈)
- 持仓亏损且结构破坏时主动止损离场
- 行情不明时优先收缩风险,而不是盲目继续加仓
系统已新增“复盘模块”:
- 每累计
REVIEW_EVERY_N_TRADES笔**已平仓(win/loss)**交易后,自动读取历史交易(含下单原因)做一次复盘。 - 复盘会统计:按动作(buy/sell/close/modify)与按原因标签(trend/breakout/reversal等)的胜负表现。
- 根据统计自动更新策略参数,例如:
- 做多持续亏损时,增大
sl_buffer_factor(更宽止损缓冲) - 趋势跟随表现变差时,下调
tp_factor(更保守止盈) - 连续亏损期切换到更保守
risk_mode
- 做多持续亏损时,增大
策略会持续“新增规则 + 修改参数”,并写入本地文件:
python/data/strategy_playbook.json
可查询当前策略文件:
curl -H "X-API-Key: change_me" "http://127.0.0.1:8000/v1/strategy/playbook"注意:该复盘模块是“策略优化器”,不能保证稳定盈利;建议持续结合回测与模拟盘验证。 说明:复盘触发点在
/v1/mt5/close-result(有真实盈亏后),仅有开仓记录但没有平仓结果时,strategy_playbook.json的统计会保持 0。
已支持:每次 /v1/mt5/ingest 收到报价后,都会落地到本地缓存文件:
python/data/quote_history.jsonl
AI 在每次决策时会自动叠加使用:
- 实时多周期K线分析(原有)
- 本地报价缓存特征(新增):
drift_bps、momentum_10_bps、spread_avg、spread_latest等
这样可以在“当前快照 + 历史微观报价轨迹”上做复合判断,降低只看单帧数据的误判。
可查询最近报价缓存:
curl -H "X-API-Key: change_me" \
"http://127.0.0.1:8000/v1/quotes/recent?symbol=BTCUSD&n=200"已新增数据驱动模块:python/mt5_agent/strategy_lab.py,目标是把“待测试策略”持续加入 Agent 的决策上下文,并根据本地数据回测后决定是否晋升为真实可用策略模板。
工作流:
- 读取本地数据:
quote_history.jsonl+trade_history.jsonl - 构建候选策略(例如动量多/空)
- 进行轻量回测(胜率、平均bps、触发次数)
- 满足阈值则标记为
promoted,写入python/data/strategy_candidates.json - 每次 AI 决策时把
strategy_candidates一并注入 payload,作为“Agent 大脑”候选模板
默认阈值参数:
LAB_MIN_BACKTEST_TRADES=15
抗 M1 噪声提前平仓参数(推荐保留默认):
CLOSE_ALL_MIN_HOLD_SECONDS=120:开仓后最短持仓秒数,防止刚开仓就被短周期波动洗掉CLOSE_ALL_MIN_TF_INVALIDATIONS=2:close_all需要 M5/M15/H1 至少 2 个周期反向确认CLOSE_ALL_FORCE_LOSS=-25:若浮亏超过该值,允许无视上面条件直接风控平仓
接口:
# 主动运行一次策略实验室
curl -X POST -H "X-API-Key: change_me" \
"http://127.0.0.1:8000/v1/strategy/lab/run?symbol=BTCUSD"
# 查看当前候选策略(含 promoted 状态)
curl -H "X-API-Key: change_me" \
"http://127.0.0.1:8000/v1/strategy/candidates?symbol=BTCUSD"