Python对接MT5下单的完整教程

新帖
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
山间闲人
山间闲人 楼主 3 小时前 浏览 7 回复 0 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 1 帖数 13 积分 1511 汇币 1177
1楼
昨晚挂了个Python脚本想自动平掉黄金的几个挂单,结果日志一直报 OrderSend failed with error 10027,查了半天才发现是MT5终端里“允许算法交易”那个按钮没点亮。这种低级坑估计不少人都踩过,今天索性把Python对接MT5下单的整套流程捋一遍,从环境配置到实盘成交,重点讲我遇到过的那些报错。
先明确一点,Python连MT5走的是官方 MetaTrader5 这个库,底层还是通过终端和经纪商服务器通信。所以你的MT5终端必须处于登录状态,而且得是同一个经纪商的账户。我试过用A账户的脚本去操作B账户的图表,结果持仓函数返回空列表,白折腾一晚上。安装很简单,pip install MetaTrader5 就完事,但注意 Python位数要和MT5终端一致,64位终端配32位Python会直接初始化失败,报错代码 -10000 那种。
初始化这块有个坑我踩了两次。第一次是 mt5.initialize() 没传路径参数,系统默认去找安装目录下的terminal64.exe,但我当时装了两份MT5,一份用来跑黄金,一份跑镑美,结果脚本连到了错误的终端上,下单品种对不上。后来改成 mt5.initialize(path=“C:/Program Files/MetaTrader 5/terminal64.exe”) 才稳定。还有,初始化之后最好用 mt5.terminal_info() 确认一下 connected 和 trade_allowed 两个字段,都是True才说明能下单。很多人卡在 error 10027 就是 trade_allowed 为 False,要么是终端没开算法交易,要么是账户是只读的投资者密码登录。
接下来是下单核心函数 mt5.order_send(),参数结构体是 MqlTradeRequest。我拿黄金举例,做0.01手多单,关键字段这么填:

  • action 用 mt5.TRADE_ACTION_DEAL,市价单
  • symbol 写 “XAUUSD”,注意有些经纪商是 “GOLD” 或者带后缀 “XAUUSD.a”,写错直接返回 error 4301 未知品种
  • volume 填 0.01,但要注意最小手数限制,黄金一般0.01起步,欧美可能0.01也行
  • type 用 mt5.ORDER_TYPE_BUY 或 SELL
  • price 这个最容易出错,市价单要传 mt5.symbol_info_tick(symbol).ask 或 bid,不能随便填个数字
  • deviation 滑点容忍度,我一般设20到50,黄金波动大设太小容易 requote
  • magic 魔术编号,方便后续区分是自己的EA还是手动单
  • comment 备注,有些经纪商会截断,别写太长

填完这些调 order_send,返回结果里 retcode 等于 mt5.TRADE_RETCODE_DONE 才算成功,其他值都是失败。我遇到过 10004  requote,10006 被拒,10013 无效请求,10014 无效手数,10016 无效止损。最坑的是 10018 市场关闭,有次周五晚上想平黄金的空单,死活平不掉,后来才想起现货黄金周五收盘早,夏令时凌晨5点就休市了,脚本里没做交易日历判断。
止损止盈的设置也有讲究。市价单可以在 order_send 里直接带 sl 和 tp 字段,但要注意价格必须符合经纪商的最小停止距离。比如黄金现价2000,你设sl=1999.5,有些平台要求至少200点距离,就会报 10016。稳妥的做法是先开仓,成功后再用 TRADE_ACTION_SLTP 单独修改。我写过一个封装函数,开仓后循环检查持仓,如果sl为空就补设,但要注意循环里加 time.sleep(0.5),不然请求太频繁会被服务器限流。
最后说下VPS部署的坑。本地跑得好好的脚本,扔到VPS上就报连接失败。排查下来是 VPS的时区跟经纪商服务器时间不一致,导致K线时间错乱,指标计算全偏。解决办法是在VPS里把时区同步成经纪商时间,一般MT5服务器是 GMT+2 或 GMT+3,Windows VPS 直接在设置里改。另外VPS性能不用太夸张,我跑一个黄金EA加一个镑美EA,2核4G够用,但网络延迟要低,选机房尽量靠近经纪商服务器,比如经纪商在伦敦就选伦敦节点,延迟能压到5ms以内。
上面这些坑我都踩过一遍,现在脚本跑得还算稳。你们在用Python对接MT5的时候有没有遇到过什么奇葩报错?尤其是那种 retcode 看着正常但实际没成交的情况,回帖交流,我看看是不是还有我没覆盖到的坑。
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 策略回测多少年数据才够用怎么破?在线等 下一帖 → EUR/USD的波段机会:从周线看趋势