MT5 错误代码详解:10027、10030、10016 等
MT5 / MQL5 错误代码:返回代码 10004–10031 与运行时错误
MT5 会报告两类错误:5 位数的交易返回代码(如 10027 自动交易被禁用、10030 不支持的成交方式、10016 无效止损、10019 资金不足),以及由 GetLastError() 返回的 4 位数运行时错误(如 4401、4756)——下表列出了每个代码对应的解决方法。
速查表:代码 → 含义 → 解决方法
编号与常量名称均以 MQL5 官方参考文档为准(交易服务器返回代码和运行时错误)。
交易返回代码(MqlTradeResult.retcode)
| 代码 | 常量 | 含义 | 解决方法 | 详情 |
|---|---|---|---|---|
| 10004 | TRADE_RETCODE_REQUOTE | 重新报价——成交前价格已变动 | 放宽允许的偏差(deviation),或按最新价格重新发送 | Off quotes 与重新报价 |
| 10006 | TRADE_RETCODE_REJECT | 请求被拒绝 | 通常由点差过大或行情过快引起;让 EA 在之后的 Tick 重试即可 | — |
| 10013 | TRADE_RETCODE_INVALID | 无效请求 | 请求中的某个字段(操作、订单类型、交易品种)有误;发送前先用 OrderCheck() 校验 | — |
| 10014 | TRADE_RETCODE_INVALID_VOLUME | 请求中的交易量无效 | 将手数按交易品种的最小值、最大值和步长(SYMBOL_VOLUME_MIN / MAX / STEP)取整 | — |
| 10015 | TRADE_RETCODE_INVALID_PRICE | 请求中的价格无效 | 按交易品种的小数位数和最小报价单位规范化价格;确认挂单位于市价的正确一侧 | — |
| 10016 | TRADE_RETCODE_INVALID_STOPS | 请求中的止损止盈无效 | 让 SL/TP 的距离大于券商的止损级别,并位于价格的正确一侧 | Invalid stops |
| 10017 | TRADE_RETCODE_TRADE_DISABLED | 交易被禁用 | 在规格中查看该品种的交易模式,并确认是用交易密码(而非投资者密码)登录;否则请咨询券商 | — |
| 10018 | TRADE_RETCODE_MARKET_CLOSED | 市场已关闭 | 等待该品种的交易时段开启 | Market closed |
| 10019 | TRADE_RETCODE_NO_MONEY | 资金不足,无法完成请求 | 减小手数、平掉部分持仓或入金 | Not enough money |
| 10021 | TRADE_RETCODE_PRICE_OFF | 没有可用于处理请求的报价 | 检查连接以及该品种当前是否有报价,然后重试 | Off quotes 与重新报价 |
| 10026 | TRADE_RETCODE_SERVER_DISABLES_AT | 自动交易被服务器禁用 | 券商禁止了该账户的算法交易;请联系券商 | 自动交易被禁用 |
| 10027 | TRADE_RETCODE_CLIENT_DISABLES_AT | 自动交易被客户端禁用 | 打开 Algo Trading 按钮,并在选项和 EA 属性中允许算法交易 | 自动交易被禁用 |
| 10030 | TRADE_RETCODE_INVALID_FILL | 订单成交方式无效 | 将 type_filling 设为该品种支持的方式(FOK / IOC / Return) | Unsupported filling mode |
| 10031 | TRADE_RETCODE_CONNECTION | 未与交易服务器建立连接 | 检查连接状态栏、VPS 网络以及券商的服务器状态 | — |
运行时错误(GetLastError())
| 代码 | 常量 | 含义 | 解决方法 | 详情 |
|---|---|---|---|---|
| 4001 | ERR_INTERNAL_ERROR | 意外的内部错误 | 并不对应某一个具体原因:在要检查的函数之前调用 ResetLastError(),若持续出现则重启或更新终端 | — |
| 4401 | ERR_HISTORY_NOT_FOUND | 未找到请求的历史记录 | 读取之前,先用包含该成交或订单的时间段调用 HistorySelect() | — |
| 4752 | ERR_TRADE_DISABLED | 禁止 Expert Advisor 交易 | 打开 Algo Trading,并在 EA 属性中勾选「Allow Algo Trading」 | 自动交易被禁用 |
| 4756 | ERR_TRADE_SEND_FAILED | 交易请求发送失败 | OrderSend() 返回了 false;请读取 MqlTradeResult.retcode 了解真正原因(常见为 10027、10030 或 10016) | — |
从 MT4 转过来? 对于同样的情况,MT4 使用的是另一套编号,大多为 3 位数(134、130、132、136、4109 ……)。下文各小节都列出了取自 MQL4 官方参考文档的 MT4 对应代码。请注意,在 MT5 中 4109 表示 ERR_CHART_WRONG_PROPERTY(图表错误),而不是交易错误。
📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集
订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。
※ 严格保护隐私。可随时取消订阅。
如何查看Expert日志标签页
点击 MT5 底部的 Expert 标签页,即可按时间顺序查看所有 EA 的活动日志。
显示格式:
2026.05.18 10:00:01.234 GOLD VIPER XAUUSD,M30: [ERROR] 10016
时间 EA名称 交易品种 时间框架 消息内容
出现错误时,请根据代码编号在上表中查找原因。
常见错误代码及处理方法
10019 — 资金不足(TRADE_RETCODE_NO_MONEY)
MT4 对应代码: 134 ERR_NOT_ENOUGH_MONEY。ERR_NO_MONEY 是对同一情况广泛使用的简称。
示例消息: "Order failed: not enough money"
"No money"
原因: 保证金不足,EA 无法开立新仓位。
处理方法:
- 在 MT5 的交易标签页中确认当前的保证金维持率
- 若维持率接近或低于 100%,考虑追加入金
- 调低 EA 的
RiskPercent设置以减小仓位规模 - 手动平掉部分持仓,释放保证金
📖 为什么余额看起来充足却仍然出现,以及用于预防的 MQL5 代码,请参阅 MT5 的 Not enough money — 原因与解决方法。
10027 — 自动交易被客户端禁用(TRADE_RETCODE_CLIENT_DISABLES_AT)
相关的 MT5 运行时错误: 4752 ERR_TRADE_DISABLED。MT4 对应代码: 4109 ERR_TRADE_NOT_ALLOWED。
示例消息: "AutoTrading disabled by client"
"Trade is not allowed"
原因: MT5 的自动交易功能已关闭。
处理方法:
- 点击 MT5 工具栏上的 Algo Trading 按钮将其开启(按钮应变为绿色)
- 进入工具 → 选项 → Expert Advisors → 启用 Allow Algo Trading,然后重启 MT5
此错误常见于 VPS 重启后 MT5 自动启动时。
📖 完整的权限链(选项设置、各图表的 Allow Algo Trading、投资者密码,以及 10027 与 10026 的区别),请参阅 MT5 自动交易被禁用 — 彻底解决。
10018 — 市场已关闭(TRADE_RETCODE_MARKET_CLOSED)
MT4 对应代码: 132 ERR_MARKET_CLOSED。
示例消息: "Market closed"
原因: EA 在非交易时间(周末或节假日)尝试入场。
处理方法: 无需处理。周末市场处于关闭状态,在此期间任何入场尝试都会出现此错误;市场重新开盘后 EA 会自动恢复。
📖 工作日也出现?交易品种的交易时段、服务器时间和仅平仓模式,详见 Market closed(10018/132)— 原因与解决方法。
10016 — 无效止损(TRADE_RETCODE_INVALID_STOPS)
MT4 对应代码: 130 ERR_INVALID_STOPS。
示例消息: "Invalid stops"
原因: SL(止损)或 TP(止盈)的数值违反了券商的最小止损级别要求。
处理方法:
- 确认券商的止损级别(最小 SL 距离):在 MT5 中右键点击交易品种 → 规格 → 查看止损级别一栏
- 确保 EA 的 SL 距离大于止损级别
- 此错误最常见于 ATR 值极小的低波动时段
📖 止损级别的实际运作方式、10016 与 130 的区别,以及一劳永逸地避免它的 MQL5 代码,请参阅 Invalid stops(10016/130)— 彻底解决。
10021 — 无报价(TRADE_RETCODE_PRICE_OFF)
MT4 对应代码: 136 ERR_OFF_QUOTES。
示例消息: "Off quotes"
原因: 未能从券商服务器接收到报价,属于连接问题。
处理方法:
- 在 MT5 屏幕底部的状态栏中确认连接状态
- 若已断开,请重启 MT5
- 在券商的服务器状态页面查看是否有故障
- 检查 VPS 的网络连接
📖 与重新报价(10004/138)的区别、偏差(deviation)调整以及重试的实现方式,请参阅 Off quotes 与重新报价(10021/10004)— 彻底解决。
📖 刚更换券商就出现 Unsupported filling mode(10030)?那是另一个问题——请参阅 Unsupported filling mode(10030)— 解决方法。
10012 — 请求超时(TRADE_RETCODE_TIMEOUT)
MT4 对应代码: 128 ERR_TRADE_TIMEOUT。
示例消息: "Request canceled by timeout"
原因: 由于服务器拥堵或网络延迟,订单超时。
处理方法:
- 此错误最常见于重大新闻公布后服务器负载较高的时段
- EA 通常会在下一个 Tick 重试——无需处理
- 若频繁发生,请检查 VPS 的网络环境或考虑更换券商
10006 — 请求被拒绝(TRADE_RETCODE_REJECT)
示例消息: "Request rejected"
原因: 订单被券商拒绝——通常是因为点差超出限制或价格变动过快。
处理方法:
- 检查
MaxSpreadPoints设置;点差大幅扩大时此错误较为常见 - 在新闻公布期间及公布后不久,这属于预期行为——可以忽略
- 若频繁发生,可适当调高
MaxSpreadPoints的值
"Margin level too low"
示例消息: "Margin level too low. Skip signal."
原因: EA 的 UseMarginCheck = true 设置检测到保证金维持率已低于 MinMarginLevel(如 200%),因此自动阻止新的入场。
处理方法:
- 这是正常的保护机制——并非错误
- 保证金维持率恢复后,入场将自动恢复
- 根本解决方案:追加入金或调低
RiskPercent
"No signal on this bar" 或 "Wait for next bar"
这些不是错误,而是调试日志。
"No signal. ATR=1245, EMA(50)=1998.23"
EA 会在每根 K 线上评估图表,并在未满足入场条件时输出日志。这属于正常运行。
错误优先级分类
| 优先级 | 错误 | 处理方式 |
|---|---|---|
| 紧急 | 10019 资金不足(MT4:134) | 立即入金或减小手数 |
| 紧急 | 10027 自动交易被禁用 / 4752(MT4:4109) | 开启 Algo Trading |
| 注意 | 10016 无效止损(MT4:130) | 重新检查 SL 设置 |
| 注意 | 10030 成交方式无效 | 设置该品种支持的成交方式 |
| 注意 | 10021 无报价(MT4:136)反复出现 | 检查连接状况 |
| 正常 | 10018 市场已关闭(MT4:132)仅限周末 | 无需处理 |
| 正常 | 10012 超时(MT4:128)偶发 | 无需处理 |
| 正常 | Margin level too low | 保证金偏低时的正常保护动作 |
高效查看Expert日志的方法
筛选日志
在 Expert 标签页内右键点击并选择过滤器,即可仅显示特定 EA 或特定错误类型的日志。
日志文件保存位置
MT5 的日志文件保存在以下路径:
C:\Users\[用户名]\AppData\Roaming\MetaQuotes\Terminal\[ID]\MQL5\Logs\
文件会按日期自动生成。排查错误时,请打开该文件夹。
总结
EA 的绝大多数错误可归为以下四类:
- 保证金不足(10019) — 追加入金或减小手数
- 自动交易已关闭(10027 / 4752) — 点击 Algo Trading 按钮将其开启
- 连接问题(10021 / 10031) — 重启 MT5 或检查 VPS 网络
- 正常行为 — 无需处理(周末休市、回避点差扩大等)
建议养成每天查看 Expert 标签页的习惯,以便在紧急错误(10019 和 10027)造成问题之前及时发现。
常见问题(FAQ)
Q:在哪里可以查询错误代码?
MQL5 官方参考文档列出了所有代码:10004–10046 范围见交易服务器返回代码,4xxx 范围见运行时错误。也可以通过 MT5 的内置帮助(按 F1 键)进行搜索。
Q:返回代码(retcode)和 GetLastError() 有什么区别?
返回代码(10004–10046)是交易服务器对订单的答复,保存在 MqlTradeResult.retcode 中。GetLastError() 返回的是 MQL5 程序自身的运行时错误(4xxx 和 5xxx)。当 OrderSend() 失败时,往往两者都会出现:GetLastError() 返回 4756,同时还有一个说明实际原因的返回代码。
Q:错误频繁出现时,是否应该停止 EA?
如果 10018(市场已关闭)或 10012(超时)只是偶尔出现,无需停止 EA。但若 10019(资金不足)反复出现,请暂停 EA,检查保证金状况,问题解决后再重新启动。
Q:出现「Invalid account」错误。
MT5 的登录信息(服务器名、登录 ID 或密码)可能有误。请通过文件 → 开设账户重新登录。
Q:没有显示任何错误,但 EA 不入场。
如果既没有错误也没有入场,说明 EA 只是在等待入场条件满足——这完全正常。EA 并非在每根 K 线都会入场,只有在所有条件同时满足时才会入场。请耐心等待一段时间。H1 的 EA 每天入场 1 至 3 次属于正常运行。
相关文章
📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集
订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。
※ 严格保护隐私。可随时取消订阅。