MT5挂单被拒的12种报错代码,逐一拆解修复方案

新帖
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
penglei8869
penglei8869 楼主 2 小时前 浏览 21 回复 2 阅读 1 分钟
新汇友(注册会员) 等级 Lv.1 主题 2 帖数 7 积分 20 汇币 20
1楼
昨晚跑一个镑美挂单脚本,日志里突然蹦出个 TRADE_RETCODE_INVALID_STOPS,可我明明把止损设在入场价下方20个点。折腾到凌晨两点才发现,问题出在STOP_LEVEL 上——那个账户的黄金和镑美最小止损距离不一样,镑美这边要求至少25点。这事让我想起来,MT5的报错代码其实就那么十几种,但每一种背后都对应着不同的账户规则或平台限制,不逐个拆开看很容易反复踩坑。
先说最常见的几种。TRADE_RETCODE_INVALID_STOPS(10016) 我遇到过至少三种触发场景:止损设得太近、挂单价格离市价太近、或者经纪商对特定品种有独立的挂单距离要求。解决办法是先用 SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) 把最小距离读出来,再决定挂单参数。另一个高频的是 TRADE_RETCODE_NO_MONEY(10019),很多人以为是余额不够,其实预付款不足也会报这个,尤其是你同时挂了好几单欧美和黄金的时候,占用保证金叠加起来很容易超。
TRADE_RETCODE_INVALID_PRICE(10015) 这个坑我踩过两次。一次是挂 buy limit 时价格填得比当前卖价还高,另一次是报价精度没对齐,比如欧美你填了1.08523,但平台只认五位小数里的1.0852。修复方法很简单,挂单前用 NormalizeDouble(price, _Digits) 处理一下,再用 SymbolInfoDouble(_Symbol, SYMBOL_ASK) 校验方向对不对。
下面这几类是我整理出来的高频报错和对应处理思路:

  • 10014 INVALID_VOLUME:手数不在 MIN_LOT 到 MAX_LOT 之间,或者不是 LOT_STEP 的整数倍。黄金最小0.01手,但有些平台镑美最小0.1手,写EA时最好动态读。
  • 10017 TRADE_DISABLED:账户被设为只读,或者该品种当前禁止交易。检查 AccountInfoInteger(ACCOUNT_TRADE_EXPERT) 和品种的 SYMBOL_TRADE_MODE。
  • 10018 MARKET_CLOSED:休市或流动性断档,周五收盘后挂单必报。加个 SymbolInfoSessionTrade 判断时段能省很多无效请求。
  • 10020 PRICE_CHANGED:发送请求到服务器执行之间价格跳了,重试时把 deviation 适当放宽,但别超过5个点。
  • 10021 PRICE_OFF:和上面类似,但更多出现在VPS延迟高的时候,换个东京或新加坡节点会好一些。
  • 10022 INVALID_EXPIRATION:到期时间格式不对,要用 ORDER_TIME_SPECIFIED 配合正确的UTC时间戳。
  • 10023 ORDER_CHANGED:订单状态在队列里被改了,重新查询 OrderGetTicket 再操作。
  • 10024 TOO_MANY_REQUESTS:请求频率过高,加个 Sleep(200) 或做请求队列。
  • 10025 NO_CHANGES:修改挂单时参数和原值完全一样,MT5直接拒绝。
  • 10026 SERVER_DISABLES_AT:服务器端禁用了该品种的自动交易,只能换品种或换平台。
  • 10027 CLIENT_DISABLES_AT:客户端EA设置里没勾选允许算法交易,这个最冤。
  • 10030 INVALID_FILL:填充模式不匹配,用 SYMBOL_FILLING_MODE 查一下是FOK还是IOC。

我现在的习惯是,EA里建一个 retcode 字典,把上面这些映射成中文提示,出错时直接写日志并推送手机通知。这样跑在VPS上不用整天盯着,出问题也能快速定位。另外提醒一句,不同经纪商对同一报错的触发阈值可能不一样,比如同样是镑美,A平台止损最小20点,B平台可能要30点,换平台时记得重新测一遍。
你们平时挂单被拒最多的是哪个代码?有没有遇到过10016但参数看着完全没问题的?贴日志一起看看。
0 回复 众裁0 复制
#1
zhaohong5013
zhaohong5013 #3· 1 小时前
3楼
缓存的话万一平台盘中调规则就凉了,我吃过这亏。你那个黄金和镑美STOP_LEVEL不同的问题,是下单前循环里逐个SymbolInfoInteger读,还是只在init里读一次存数组?
赞 回复 众裁0 复制
1 小时前 #3
外汇讲师
外汇讲师 #2· 1 小时前
2楼
你提到的STOP_LEVEL按品种查这点我记下了。想问下,如果同一账户里镑美和黄金的STOP_LEVEL不同,写EA时是每次下单前都动态读一次,还是初始化时缓存就行?
赞 回复 众裁0 复制
1 小时前 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 手数计算总差0.01,是平台合约规格没搞懂吗,有人遇到过吗? 下一帖 → 一根均线用了三年,为什么我还是不敢加仓,从亏损到盈利我做对了什么