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

MT5 报错 10030 invalid fill:这个品种不支持你选的成交方式

下单被拒,日志写 retcode=10030。手数和价格都没问题,问题出在「成交方式」(Filling Mode)——你请求的成交方式,这个品种不支持。

retcode 10030Invalid order filling type / 订单成交方式无效
先看这一句

先查品种支持哪几种成交方式(SYMBOL_FILLING_MODE),再看你请求的 type_filling 是否在支持列表里。EA 里最常见是把 FOK 写死了,而该品种只允许 IOC。

这个码是什么意思

10030 对应 TRADE_RETCODE_INVALID_FILL,官方释义是「订单成交方式无效」。MT5 的成交方式有四种:FOK(Fill or Kill,全部成交否则撤销)、IOC(Immediate or Cancel,能成交多少成交多少,剩余撤销)、RETURN(退回,只用于挂单)、EXCHANGE(交易所模式,按交易所规则撮合)。每个品种支持哪几种由经纪商在服务器端配置,客户端必须按品种实际支持的方式发请求,否则直接返回 10030。

会在哪些地方出现

出现位置具体表现
EA 市价单MqlTradeRequest.type_filling 硬编码 ORDER_FILLING_FOK,但品种只支持 IOC。这是 10030 的第一大来源。
挂单挂单只支持 RETURN(部分服务器支持 FOK/IOC)。给挂单填 FOK 就是 10030。
换经纪商后突然报错代码没变、账户换了,新经纪商对该品种的成交方式配置不同,原本能跑的策略全线 10030。
策略测试器测试器的品种成交方式与实盘不一致,回测通过但实盘报 10030。

成交方式怎么查、怎么选

项怎么看 / 怎么算
查品种支持列表 SYMBOL_FILLING_MODE这是位掩码(bitmask):1 = FOK 允许,2 = IOC 允许,4 = RETURN 允许。用 SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) 取出后按位与判断。
市价单优先 IOCIOC 在多数外汇品种上都被支持,容错最高。FOK 要求一次性全部成交,流动性不足时会直接整笔失败。
挂单只用 RETURNTRADE_ACTION_PENDING 的请求,type_filling 必须是 ORDER_FILLING_RETURN,这是规则层面要求,不是配置问题。
不要硬编码把成交方式写成常量是 10030 的根因。正确做法是运行时查询支持列表,从中挑一个当前请求类型允许的。

怎么判断是哪一类

你看到的现象指向的原因
手动下单能成交,EA 报 10030EA 写死了不被支持的成交方式。手动下单走的是界面默认值,通常是服务器推荐的那一种。
换成 IOC 就正常了确认是 FOK 不被支持。但不是所有品种都支持 IOC,仍需按品种查询,不要一刀切改成 IOC。
挂单报 10030,市价单正常挂单必须用 RETURN,你传了市价单用的成交方式。
回测正常,实盘 10030测试器不校验成交方式位掩码,实盘才校验。以实盘品种的 SYMBOL_FILLING_MODE 为准。
只有某个品种报错该品种的配置与其他品种不同(常见于股指、能源、加密货币 CFD)。按品种单独判断。

按顺序排查

  1. 查这个品种支持的成交方式

    EA 里加一行 Print:SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE)。返回值按位解读:1 支持 FOK,2 支持 IOC,4 支持 RETURN。比如返回 3,表示 FOK 和 IOC 都支持,RETURN 不支持。

  2. 按请求类型挑一个允许的

    市价单(TRADE_ACTION_DEAL)从 FOK/IOC 里挑;挂单(TRADE_ACTION_PENDING)固定用 RETURN。挑不出来说明这个品种不支持你要做的操作类型,需要换品种或换经纪商。

  3. 改 EA 里的 type_filling

    把常量替换成上面查出来的值。注意很多 EA 在多个函数里都设过 type_filling,要全部改,只改一处常常还有残留。

  4. 手动下单验证一次

    用界面下同方向同手数的一笔,能成交说明账户和品种没问题,问题纯在请求参数。

  5. 换经纪商后重新核对

    换服务器后第一件事就是重查所有交易品种的 SYMBOL_FILLING_MODE,不要沿用旧代码的假设。

和相邻码的区别

另一个码区别在哪
10013 invalid request10013 是请求结构非法,可能连 type_filling 字段都没填。10030 是填了,但填的值不被这个品种支持。
10020 price changed10020 是价格在传输过程中变了。10030 和价格无关,纯粹是成交方式配置。
10021 no quotes10021 是当前没有报价可用来成交(非交易时段或流动性断档)。10030 即使有报价也会报,因为方式本身不允许。
10026 / 10027 autotrading disabled那两个是自动交易开关问题(服务器端 / 客户端),和成交方式无关,且手动下单不受影响;10030 手动下单同样会复现。

避免再次出现

相关提问

FOK 和 IOC 到底差在哪?
FOK 是「全成或全撤」:要求请求的整笔量一次性全部成交,只要可供成交量不够就整笔失败。IOC 是「能成多少成多少」:立即成交可成交的部分,剩余自动撤销。所以小账户下大手数时,FOK 更容易失败,IOC 更容易部分成交。
为什么同一个品种在 A 经纪商能跑,B 经纪商报 10030?
成交方式是经纪商在服务器端按品种配置的,不是 MT5 软件的统一设定。两家经纪商对同一个 EURUSD 可以配置不同的允许列表,代码里写死就会在换家时炸掉。
挂单为什么不能用 FOK?
挂单是等待价格到达才触发的指令,请求发出时并不立即成交,所以不存在「立即全部成交」这个概念。规则上挂单只接受 RETURN 类型。
10030 会导致重复下单吗?
不会。10030 是请求在服务器校验阶段就被拒绝,没有进入撮合,不会产生任何订单或持仓。可以放心重试,但要先改对参数,否则重试还是同样的结果。

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