MT5 报错 10014 invalid volume:手数不在允许范围内
下单时提示「Invalid volume」,日志写 retcode=10014。手数看起来没问题(比如 0.1 手),但服务器就是不认——因为每个品种都有自己的最小手数、最大手数和步长三套规则,三者必须同时满足。
Invalid volume in the request / 请求中的交易量无效先查这个品种的「最小手数 / 最大手数 / 手数步长」三个值,再看你的手数是否同时满足。0.1 手在 EURUSD 上合法,在「仅支持整数手」的股指 CFD 上就是非法。
这个码是什么意思
10014 对应 TRADE_RETCODE_INVALID_VOLUME,官方释义是「请求中的交易量无效」。服务器在结构校验(10013)通过之后,会用品种规格里的三个参数来检查手数:SYMBOL_VOLUME_MIN(最小手数)、SYMBOL_VOLUME_MAX(单笔最大手数)、SYMBOL_VOLUME_STEP(手数步长)。手数小于最小值、大于最大值、或者不是步长的整数倍,任何一种都会被判 10014。注意它和 10019(资金不足)、10034(品种总持仓量超限)是不同的码,不要混。
会在哪些地方出现
| 出现位置 | 具体表现 |
|---|---|
| 手动下单 | 手数输入框填了 0.01 但品种最小是 0.1,或者填了 1.5 而步长是 1,确认时立即报错。 |
| EA / 脚本 | 按风险百分比算出的手数没做步长归一化,算出来 0.0137 这种值直接发出去,必报 10014。 |
| 部分平仓 | 平仓量大于当前持仓量时报的是 10038,不是 10014;但如果平仓量本身不符合步长,仍然报 10014。 |
| 跟单 / 信号 | 信号源品种规格与跟随账户不同(一个最小 0.01,一个最小 0.1),跟单时手数被缩放后落在非法区间。 |
三个参数在哪看、怎么算
| 项 | 怎么看 / 怎么算 |
|---|---|
| 最小手数 SYMBOL_VOLUME_MIN | 「市场报价」右键品种 →「规格」→「交易」→「最小交易量」。外汇常见 0.01,股指 CFD 常见 0.1 或 1。 |
| 最大手数 SYMBOL_VOLUME_MAX | 同一页的「最大交易量」。这是单笔上限,不是总持仓上限,总持仓超限报的是 10034。 |
| 手数步长 SYMBOL_VOLUME_STEP | 同一页的「交易量步长」。0.01 表示只能下 0.01 的整数倍;1 表示只能整数手。EA 里必须用它做归一化。 |
| 归一化公式 | vol = MathFloor(vol / step) * step,再夹在 min 和 max 之间,最后按 step 的小数位做 NormalizeDouble。三步缺一不可。 |
怎么判断是哪一类
| 你看到的现象 | 指向的原因 |
|---|---|
| 填 0.01 报错,填 0.1 能过 | 品种最小手数是 0.1,你低于下限。改用手数下拉框里能选到的最小值。 |
| 填 1.5 报错,填 1 或 2 能过 | 步长是 1(整数手品种)。0.5 不是步长倍数。 |
| 大资金账户报错,小资金正常 | 手数超过单笔最大手数。拆成多笔,或改用「按手数」而不是「按金额」计算。 |
| EA 算出带很多小数的手数时报错 | 没做步长归一化,0.0137 这种值直接发了。用上面公式处理。 |
| 平仓时报错但仓位明明够 | 平仓量不符合步长,或平仓量精度超了。按持仓量的步长取整。 |
按顺序排查
查这个品种的三个手数参数
市场报价窗口右键品种 →「规格」→「交易」标签,记下最小交易量、最大交易量、交易量步长。三个值一起看,只看一个容易误判。
把手数按步长向下取整
用 MathFloor(手数 / 步长) * 步长,宁可少下一点也不要向上取整——向上取整可能超过最大手数,也可能超出保证金。
确认没有低于最小手数
取整后如果小于最小手数,直接放弃这笔交易,不要硬凑到最小值。凑到最小值往往意味着风险敞口超出你的计算,比不下单更危险。
检查是不是超过单笔上限
超过最大手数就拆单:100 手上限、要下 150 手,拆成 100 + 50 两笔。拆单要注意两笔之间的滑点。
用下拉框验证一次
手动下单时点手数输入框右侧的下拉箭头,能看到这个品种允许的所有手数档位。你输入的值不在这个列表里,就是 10014。
和相邻码的区别
| 另一个码 | 区别在哪 |
|---|---|
| 10013 invalid request | 10013 是请求结构就不对,服务器没走到手数校验。10014 说明结构没问题,只是这个数不合法。 |
| 10019 not enough money | 10019 是手数合法但保证金不够。同一个手数在小账户报 10019、在大账户能成交,就是这个区别。 |
| 10034 limit volume | 10034 是该品种的总持仓量(含已有仓位)超过上限,不是单笔手数问题。已有 40 手、上限 50 手,再下 20 手报 10034,不是 10014。 |
| 10038 invalid close volume | 10038 是平仓量大于当前持仓量,属于平仓专属校验,和步长无关。 |
避免再次出现
- 把「查规格 → 向下取整 → 上下限夹取 → NormalizeDouble」封装成一个 VolumeNormalize 函数,所有下单路径统一调用。
- 不要相信界面上的手数输入框能拦住非法值,EA 走的是 API 通道,界面校验不生效。
- 跟单或跨账户复制时,先比对两边品种的三个手数参数,参数不同就按比例缩放后再归一化。
- 浮点误差是隐形杀手:0.1 + 0.2 在浮点里是 0.30000000000000004,不做 NormalizeDouble 就是 10014。
相关提问
为什么 0.1 手在 EURUSD 能下,在黄金上不行?
10014 是不是意味着我的钱不够?
EA 里怎么避免 10014?
改了手数还是报 10014?
接着看
码值定义参照 MetaTrader 5 交易服务器返回码;最后核对:2026 年 10 月 29 日