10030:成交方式与品种不匹配
同一个平台,不同品种支持的成交方式可能不一样。选项里有,不代表这个品种能用。
Invalid 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) 取出后按位与判断。 |
| 市价单优先 IOC | IOC 在多数外汇品种上都被支持,容错最高。FOK 要求一次性全部成交,流动性不足时会直接整笔失败。 |
| 挂单只用 RETURN | TRADE_ACTION_PENDING 的请求,type_filling 必须是 ORDER_FILLING_RETURN,这是规则层面要求,不是配置问题。 |
| 不要硬编码 | 把成交方式写成常量是 10030 的根因。正确做法是运行时查询支持列表,从中挑一个当前请求类型允许的。 |
怎么判断是哪一类
| 你看到的现象 | 指向的原因 |
|---|---|
| 手动下单能成交,EA 报 10030 | EA 写死了不被支持的成交方式。手动下单走的是界面默认值,通常是服务器推荐的那一种。 |
| 换成 IOC 就正常了 | 确认是 FOK 不被支持。但不是所有品种都支持 IOC,仍需按品种查询,不要一刀切改成 IOC。 |
| 挂单报 10030,市价单正常 | 挂单必须用 RETURN,你传了市价单用的成交方式。 |
| 回测正常,实盘 10030 | 测试器不校验成交方式位掩码,实盘才校验。以实盘品种的 SYMBOL_FILLING_MODE 为准。 |
| 只有某个品种报错 | 该品种的配置与其他品种不同(常见于股指、能源、加密货币 CFD)。按品种单独判断。 |
按顺序排查
查这个品种支持的成交方式
EA 里加一行 Print:SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE)。返回值按位解读:1 支持 FOK,2 支持 IOC,4 支持 RETURN。比如返回 3,表示 FOK 和 IOC 都支持,RETURN 不支持。
按请求类型挑一个允许的
市价单(TRADE_ACTION_DEAL)从 FOK/IOC 里挑;挂单(TRADE_ACTION_PENDING)固定用 RETURN。挑不出来说明这个品种不支持你要做的操作类型,需要换品种或换经纪商。
改 EA 里的 type_filling
把常量替换成上面查出来的值。注意很多 EA 在多个函数里都设过 type_filling,要全部改,只改一处常常还有残留。
手动下单验证一次
用界面下同方向同手数的一笔,能成交说明账户和品种没问题,问题纯在请求参数。
换经纪商后重新核对
换服务器后第一件事就是重查所有交易品种的 SYMBOL_FILLING_MODE,不要沿用旧代码的假设。
和相邻码的区别
| 另一个码 | 区别在哪 |
|---|---|
| 10013 invalid request | 10013 是请求结构非法,可能连 type_filling 字段都没填。10030 是填了,但填的值不被这个品种支持。 |
| 10020 price changed | 10020 是价格在传输过程中变了。10030 和价格无关,纯粹是成交方式配置。 |
| 10021 no quotes | 10021 是当前没有报价可用来成交(非交易时段或流动性断档)。10030 即使有报价也会报,因为方式本身不允许。 |
| 10026 / 10027 autotrading disabled | 那两个是自动交易开关问题(服务器端 / 客户端),和成交方式无关,且手动下单不受影响;10030 手动下单同样会复现。 |
避免再次出现
- 所有下单函数统一走一个 FillModeFor(symbol, action) 辅助函数,运行时查询位掩码后返回可用的成交方式,杜绝硬编码。
- EA 初始化时(OnInit)就把所有交易品种的成交方式打一遍日志,换经纪商时一眼能看出差异。
- 区分市价与挂单两条路径,挂单固定 RETURN,不要复用市价单的参数。
- 回测通过不等于实盘可用。成交方式是少数几个测试器不校验、实盘严格校验的项,必须实盘小单验证。
相关提问
FOK 和 IOC 到底差在哪?
为什么同一个品种在 A 经纪商能跑,B 经纪商报 10030?
挂单为什么不能用 FOK?
10030 会导致重复下单吗?
接着看
码值定义参照 MetaTrader 5 交易服务器返回码;最后核对:2026 年 10 月 29 日