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

MT5 报错 10014 invalid volume:手数不在允许范围内

下单时提示「Invalid volume」,日志写 retcode=10014。手数看起来没问题(比如 0.1 手),但服务器就是不认——因为每个品种都有自己的最小手数、最大手数和步长三套规则,三者必须同时满足。

retcode 10014Invalid 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 这种值直接发了。用上面公式处理。
平仓时报错但仓位明明够平仓量不符合步长,或平仓量精度超了。按持仓量的步长取整。

按顺序排查

  1. 查这个品种的三个手数参数

    市场报价窗口右键品种 →「规格」→「交易」标签,记下最小交易量、最大交易量、交易量步长。三个值一起看,只看一个容易误判。

  2. 把手数按步长向下取整

    用 MathFloor(手数 / 步长) * 步长,宁可少下一点也不要向上取整——向上取整可能超过最大手数,也可能超出保证金。

  3. 确认没有低于最小手数

    取整后如果小于最小手数,直接放弃这笔交易,不要硬凑到最小值。凑到最小值往往意味着风险敞口超出你的计算,比不下单更危险。

  4. 检查是不是超过单笔上限

    超过最大手数就拆单:100 手上限、要下 150 手,拆成 100 + 50 两笔。拆单要注意两笔之间的滑点。

  5. 用下拉框验证一次

    手动下单时点手数输入框右侧的下拉箭头,能看到这个品种允许的所有手数档位。你输入的值不在这个列表里,就是 10014。

和相邻码的区别

另一个码区别在哪
10013 invalid request10013 是请求结构就不对,服务器没走到手数校验。10014 说明结构没问题,只是这个数不合法。
10019 not enough money10019 是手数合法但保证金不够。同一个手数在小账户报 10019、在大账户能成交,就是这个区别。
10034 limit volume10034 是该品种的总持仓量(含已有仓位)超过上限,不是单笔手数问题。已有 40 手、上限 50 手,再下 20 手报 10034,不是 10014。
10038 invalid close volume10038 是平仓量大于当前持仓量,属于平仓专属校验,和步长无关。

避免再次出现

相关提问

为什么 0.1 手在 EURUSD 能下,在黄金上不行?
因为手数的合法区间是按品种单独定义的。EURUSD 常见最小 0.01、步长 0.01;黄金(XAUUSD)部分经纪商最小 0.1 或 0.01 但最大手数小得多;股指 CFD 常见最小 1 手、步长 1。同一个数字在不同品种上合法性完全不同。
10014 是不是意味着我的钱不够?
不是。资金不够报的是 10019 not enough money。10014 只跟手数的取值范围和步长有关,和账户余额无关。大资金账户同样会报 10014。
EA 里怎么避免 10014?
三步:用 SYMBOL_VOLUME_STEP 做向下取整、用 SYMBOL_VOLUME_MIN 做下限判断、用 SYMBOL_VOLUME_MAX 做上限判断或拆单。另外记得 NormalizeDouble 到步长对应的小数位,否则浮点误差会让 0.3 变成 0.29999999。
改了手数还是报 10014?
检查是不是改到了别的地方:EA 可能有多个下单函数;也可能改的是默认手数但实际调用时传了另一个变量。最直接的办法是在 OrderSend 之前把最终 volume 用 Print 打出来,看发出去的真实值。

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