报错完整解析:错误代码 131 = ERR_INVALID_TRADE_VOLUME
一、字面含义
无效交易手数,经纪商服务器拒绝本次建仓订单
日志来源:黄金战士 V3.5 MT4 EA,XAUUSD M1 周期,触发建仓失败 131。
和之前 trade is not allowed(无交易权限)、10016 invalid stops(止损止盈距离不足)是完全不同的三类报错。
二、4 类核心触发原因(按高频排序)
1. 计算出的手数小于平台最小交易手数(最常见)
绝大多数黄金 XAUUSD 最小手数 MINLOT=0.01;
如果你用以损定量、马丁补仓、动态风控自动计算手数,风险金额过小会算出 0.005、0.008 这类低于 0.01 的手数,直接报 131。
2. 手数小数不符合步进规则 LOTSTEP
黄金标准步进 0.01,只能 0.01、0.02、0.03……
如果 EA 算出 0.012、0.027、0.055 非 0.01 整数倍,服务器拒收。
典型场景:风险金额动态计算后产生无限小数浮点。
3. 单次开仓手数超过品种最大限制 MAXLOT
平台限制单次最高手数(比如单次最多 20 手 / 50 手),风控算出来总手数超限。
4. 浮点精度 bug(EA 自动计算通病)
代码计算后手数是 0.0200000001 或 0.019999999,肉眼看是 0.02,但底层浮点不标准,服务器判定无效。
三、快速自查步骤(先操作面板,无需改代码)
打开 MT4 市场报价 → 右键 XAUUSD → 规格
记录三个关键参数:
最小交易量 (MINLOT):一般 0.01
交易量步进 (LOTSTEP):一般 0.01
单次最大交易量 (MAXLOT)
打开黄金战士 V3.5 面板,查看当前风控设置:
固定手数模式:直接填 0.01、0.02 标准数值测试;
风险百分比 / 固定亏损金额(以损定量):加大风险额度,避免算出小于 0.01 的手数;
临时测试:手动固定手数 0.02,重启 EA 看是否还报 131。
四、分方案解决
方案 1:面板参数调整(最快,推荐优先试)
若用「风险金额开仓」:提高单笔风险金额,保证计算结果≥0.01;
关闭精细动态分仓,改用固定标准手数(0.01/0.02/0.05);
马丁补仓倍率不要设置过小,防止加仓手数跌破最小 0.01。
方案 2:代码层面根治(开发者适配)
下单前强制标准化手数,对齐平台步进,限制最小手数:
mql4
// 获取XAUUSD交易规则
double minLot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double lotStep= SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double maxLot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
// 标准化手数
double lot = 计算出来的动态手数;
lot = NormalizeDouble(lot,2); // 黄金保留2位小数
lot = floor(lot / lotStep) * lotStep; // 对齐步进
if(lot < minLot) lot = minLot; // 低于最小手数强制拉到最小值
if(lot > maxLot) lot = maxLot; // 超过最大手数截断
经过标准化后的 lot 再传入 OrderSend,彻底杜绝 131 报错。
方案 3、特殊场景排查
模拟 / 实盘规格不一致:回测没问题,实盘报 131 → 实盘最小手数更高;
微型账户 / 标准账户混淆:微账户允许 0.001,标准账户最低 0.01;
服务器临时限制:换时间段测试,排除平台临时风控。
五、和你之前报错区分总结
trade is not allowed:EA 没开启自动交易权限;
err=10016 invalid stops:止盈止损离现价太近;
err=131 invalid trade volume:开仓手数不符合经纪商规格。












暂无评论内容