10013:参数组合不成立
这个码不挑具体哪一项,只说“这组参数不成立”。所以要按顺序排除,而不是猜。
Invalid 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。 |
请求结构里最常漏的四项
| 项 | 怎么看 / 怎么算 |
|---|---|
| action | MqlTradeRequest.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 类型。 |
按顺序排查
先确认品种名一字不差
在「市场报价」窗口右键目标品种 →「规格」,复制显示的名称。带后缀的(如 XAUUSD.s、EURUSD.m)必须连后缀一起用。很多 10013 就是漏了后缀。
核对 action 与 type 是否配套
市价开平仓用 TRADE_ACTION_DEAL;挂限价/停损单用 TRADE_ACTION_PENDING;改单用 TRADE_ACTION_MODIFY;撤单用 TRADE_ACTION_REMOVE。用 DEAL 去发挂单请求,服务器直接判非法。
检查请求必填字段有没有留空
挂单必须有 price 和 type_time;改单必须有 order 票号。缺一项就是 10013。用 Print 把整个 MqlTradeRequest 打印出来逐项对,比猜快得多。
确认目标对象还存在
改单或撤单前先 OrderSelect / PositionSelectByTicket 确认票号有效。已经平掉的仓位再去改,必然 10013。
换手动下单做对照
手动能下、EA 不能下,问题百分之百在请求结构;手动也不能下,问题在品种或账户权限。这一步能把排查范围砍掉一半。
和相邻码的区别
| 另一个码 | 区别在哪 |
|---|---|
| 10014 invalid volume | 10014 是请求结构合法、只是手数值不合法。10013 连结构都没过。 |
| 10015 invalid price | 10015 是价格字段存在但值不合理(偏离市价、精度不对)。10013 是价格字段压根没给。 |
| 10009 invalid account | 10009 是账户层面的问题,发生在请求校验之前,连交易通道都没进。 |
| 10031 no connection | 10031 是请求发不出去;10013 是发出去了服务器判无效。 |
避免再次出现
- EA 里不要硬编码品种名,统一用 _Symbol 或输入参数,避免换经纪商后全线报错。
- 发请求前先做一次自检:symbol 非空、action 与 type 匹配、挂单带 price、改单带票号。四个条件写成一个 CheckRequest 函数,长期省事。
- 改单撤单前用 OrderSelect 确认票号,拿返回值判断,不要假设订单还在。
- 换经纪商或换服务器后,第一件事是重新核对品种后缀,不要直接沿用旧代码。
相关提问
10013 和 10014 到底先改哪个?
手动下单正常,EA 一直 10013,是不是 EA 坏了?
回测能过、实盘报 10013 是什么原因?
10013 会自己消失吗?
接着看
码值定义参照 MetaTrader 5 交易服务器返回码;最后核对:2026 年 10 月 29 日