LEARN · ZH · easyquanttrading.com
MT5 EA回测正常,实盘不交易或结果不同,怎么排查?
先把问题分成两类:实盘没有发出订单,或有交易但与历史回测不同。固定EA版本与参数,从一条信号追到请求和成交,找到第一个差异点,再修改对应环节。只比较最终收益曲线,定位不了原因。
- 固定EA文件版本、参数文件、券商品种名称和周期;不要一边排查一边重新优化。
- 先查第一条不同的信号、请求或成交,再比较收益。
- 终端历史复测、冻结历史样本外、冻结版本后的模拟账户新行情观察,需要分别标注。
一、完全没有交易:信号与订单分开查
选择测试器里确实出现过信号的区间,记录服务器时间、品种、周期、指标状态和过滤条件。检查终端与EA交易权限、连接状态、交易时段、已有持仓限制及历史数据是否准备完成。没有订单也可能是过滤条件正常生效。
日志分成四层:信号计算、过滤结果、订单提交、服务器响应。没有请求,就回查信号与过滤路径;有请求却没有成交,就检查返回结果。不要用放宽入场条件来掩盖执行问题。
OrderCheck需要检查返回值及结果字段,通过检查仍不保证后续执行。OrderSend返回true也不等于已经成交,需要核对retcode以及后续交易事务或成交记录。两项区别见下方MQL5官方文档。
二、找到第一个差异点
围绕第一处差异导出两边的少量记录,按服务器时间与事件匹配,包含指标预热区间。不要默认两份数据的同一行就是同一个时刻。
- 信号不同:对比输入K线、指标值、品种映射、缺失历史、收盘判定与时间过滤。
- 有信号但没有请求:对比权限、过滤结果、持仓状态和请求构造。
- 有请求却没有成交:查看返回码、手数、止损距离、交易时段与保证金检查结果。
- 信号与请求一致但成交或收益不同:对比bid/ask、费用、执行时间、成交规则和离场事件顺序。
三、写清测试模式与成本假设
MT5支持多种tick模式和执行延迟设置。记录实际模式、是否有券商真实tick以及延迟设置;不要把所有MT5回测都描述成固定点差或零延迟。配置说明见下方Strategy Testing官方文档。
依赖K线内部触发的策略,需要在合适的tick精度下核对事件顺序。单根K线的最高价和最低价本身,并没有说明止盈与止损谁先触发。一次只改变一个测试设置,保留前后报告。
同时记录合约大小、最小价格变化、手数步长、账户币种、佣金及隔夜费用。规格不一致是需要验证的假设,单凭差异不能确认亏损原因。
四、执行一致性与策略独立证据分开验证
在MT5终端重放过去行情属于历史引擎对比,可以暴露实现差异。它不会把策略发现阶段见过的历史变成独立证据。发现与选参前冻结按时间划分的样本外,保存时间戳,并排除在候选排名之外。
若观察新行情,应先冻结版本和参数,再收集模拟账户的信号、拒单和成交记录。写明观察区间与尚未解释的差异;模拟账户表现也不证明未来真实账户收益。
本站公开的冻结样本外审查记录了一次数据重叠问题和证据限制。教程不引用缺少可核对来源的全库通过率,也不把历史复测通过当成部署认证。
五、保存可复查的排障材料
- EA版本标识、参数文件、测试配置、券商品种规格和起止时间。
- 第一个差异事件及两侧前后日志;分享时删除账户标识与凭据。
- 本轮只改了什么、是否解决这一个差异,以及仍待解释的事件。
- 保存原始对比。收益曲线变好,不能替代对原差异的解释。
官方参考与更新
更新:2026-10-04 · EasyQuant Research Team
Read this guide in EnglishFAQ
- EA回测会交易,实盘为什么没有订单?
- 从信号、过滤、请求提交、服务器响应四层逐步记录。先固定版本与参数,并选择确实存在信号的区间,核对券商品种与服务器时间。
- OrderSend返回true就代表成交吗?
- 还需要查看交易结果返回码,以及后续交易事务或成交记录,具体语义见MQL5官方文档。
- 终端历史复测算实盘前向测试吗?
- 终端历史重放是历史引擎对比;冻结未见历史检验独立历史表现;冻结版本后收集模拟账户新行情属于前瞻观察。三者分别记录。