MT5Open 返回码
首页/错误码总表/10013

MT5 报错 10013 invalid request:下单请求本身就不成立

终端提示「Invalid request」,日志里写着 retcode=10013。注意这个码和「价格不对」「手数不对」不是一回事——它说的是整个请求包有问题,服务器根本没去校验里面的参数。

retcode 10013Invalid request / 请求无效
先看这一句

先分清两件事:10013 是「请求没通过格式检查」,10014/10015/10016 是「请求格式没问题是里面的值不合法」。所以 10013 出现时,先别急着改手数和价格,去查品种名、订单号、请求字段有没有漏。

这个码是什么意思

10013 对应服务端常量 TRADE_RETCODE_INVALID,官方释义是「请求无效」。它属于交易请求的最外层校验:服务器收到请求后,先检查结构是否完整、字段是否齐全、引用的对象(品种、订单、持仓)是否还存在,任何一项不通过就直接返回 10013,不会进入后面的价格与保证金校验。所以在排查顺序上,10013 永远排在 10014 到 10016 之前——外层没过,谈内层没有意义。

会在哪些地方出现

出现位置具体表现
手动下单弹窗点「新订单」后确认,弹出 Invalid request,通常伴随品种下拉框里选中的品种已经停止交易或被移除。
EA / 脚本日志Experts 标签页出现 `failed request` 加 retcode=10013,多为 OrderSend 的 MqlTradeRequest 结构体字段没填全。
策略测试器回测时报 10013,常见于在测试器里用了真实账户才有的品种后缀,或测试品种与代码里硬编码的品种名不一致。
修改/删除挂单对已经不存在的订单号发修改请求,服务器找不到对象,同样返回 10013。

请求结构里最常漏的四项

项怎么看 / 怎么算
actionMqlTradeRequest.action 必须与 type 匹配:市价用 TRADE_ACTION_DEAL,挂单用 TRADE_ACTION_PENDING,改单用 TRADE_ACTION_MODIFY。action 填错,后面所有字段都会被判为无效。
symbol必须是经纪商服务器上的完整名称,带后缀。EURUSD 和 EURUSD.m 是两个不同品种,写错就是 10013。
volume / price市价单 price 可以留 0(由服务器成交价决定),但挂单的 price 必须给,且不能是 0。
type_filling部分服务器要求显式声明成交方式。留空在个别经纪商上会直接判请求非法。

怎么判断是哪一类

你看到的现象指向的原因
手动下单也报,EA 也报品种本身不可交易(已下架、只读、或账户无权限)。去「市场报价」右键该品种看「规格」,确认是否可交易。
只有 EA 报,手动正常EA 的请求结构有字段没填,或品种名硬编码错了。重点看 symbol 是否带了后缀。
改单/撤单时报目标订单已不存在(被止损、被手动平掉、或已过期)。先刷新终端持仓列表再操作。
回测时报测试器品种与代码品种不一致,或策略用了实盘才支持的 action 类型。

按顺序排查

  1. 先确认品种名一字不差

    在「市场报价」窗口右键目标品种 →「规格」,复制显示的名称。带后缀的(如 XAUUSD.s、EURUSD.m)必须连后缀一起用。很多 10013 就是漏了后缀。

  2. 核对 action 与 type 是否配套

    市价开平仓用 TRADE_ACTION_DEAL;挂限价/停损单用 TRADE_ACTION_PENDING;改单用 TRADE_ACTION_MODIFY;撤单用 TRADE_ACTION_REMOVE。用 DEAL 去发挂单请求,服务器直接判非法。

  3. 检查请求必填字段有没有留空

    挂单必须有 price 和 type_time;改单必须有 order 票号。缺一项就是 10013。用 Print 把整个 MqlTradeRequest 打印出来逐项对,比猜快得多。

  4. 确认目标对象还存在

    改单或撤单前先 OrderSelect / PositionSelectByTicket 确认票号有效。已经平掉的仓位再去改,必然 10013。

  5. 换手动下单做对照

    手动能下、EA 不能下,问题百分之百在请求结构;手动也不能下,问题在品种或账户权限。这一步能把排查范围砍掉一半。

和相邻码的区别

另一个码区别在哪
10014 invalid volume10014 是请求结构合法、只是手数值不合法。10013 连结构都没过。
10015 invalid price10015 是价格字段存在但值不合理(偏离市价、精度不对)。10013 是价格字段压根没给。
10009 invalid account10009 是账户层面的问题,发生在请求校验之前,连交易通道都没进。
10031 no connection10031 是请求发不出去;10013 是发出去了服务器判无效。

避免再次出现

相关提问

10013 和 10014 到底先改哪个?
先确认是不是 10013。10013 是外层结构校验,10014 到 10016 是内层参数校验,服务器按顺序检,外层不过不会报内层。所以只有 10013 消失之后,才可能看到 10014。两个同时出现时,先解决 10013。
手动下单正常,EA 一直 10013,是不是 EA 坏了?
不一定。最常见是 EA 里硬编码了品种名(比如写死 EURUSD),而你账户的品种带后缀 EURUSD.m。改成 Symbol() 或 _Symbol 取当前图表品种,多数情况立刻恢复。
回测能过、实盘报 10013 是什么原因?
测试器不校验品种权限和服务器端规则,实盘才校验。重点查两处:实盘品种是否支持你用的 action 类型;账户是否为只读(投资者密码登录时下单会先被判无效)。
10013 会自己消失吗?
不会。它对应的是一个确定的结构性错误,不会被服务器「重试成功」。如果偶尔出现偶尔不出现,多半是订单号时序问题——你在请求里引用了刚刚已经成交或撤销的票号。

码值定义参照 MetaTrader 5 交易服务器返回码;最后核对:2026 年 10 月 29 日