上个月折腾一个新EA,天天对着MT5的策略测试器按Ctrl+R,按得我手指都快形成肌肉记忆了。这玩意儿功能确实猛,但说实话,刚上手那会儿,光看那一堆报告参数我就脑袋疼。
今天不说官话套话,就聊聊我踩完坑之后总结出来的实战经验。
回测模式怎么选?
打开策略测试器(快捷键Ctrl+R),第一件事就是选模式。MetaTrader 5官网文档里把三种模式写得挺清楚:
一个小经验:历史数据质量(History Quality)低于90%的话,回测结果基本不可信。我有一回数据质量只有78%,跑出来盈利因子2.0,换了高质量数据直接掉到1.2,差点被假象坑了。
报告里哪些数字值得看?
测试完切到"结果"标签页,一大堆数字扑面而来。MetaTrader 5官方帮助中心对每个指标都有详细说明,我挑几个最关键的说说:
| 指标 | 含义 | 我的及格线 |
| ---- | ---- | ---------- |
| 盈利因子 | 毛利 / 毛损 | >1.5算可以 |
| 预期回报 | 每笔交易平均盈亏 | 必须为正 |
| 夏普比率 | 风险调整后收益 | >1.0及格,>3.0优秀 |
| 最大回撤 | 最大峰谷跌幅 | 越小越好 |
| 恢复因子 | 净利润 / 最大回撤 | >2.0说明风控还行 |
官方文档特别提到,夏普比率计算时假设无风险利率为零。如果夏普比率为负,说明这策略连无风险收益都跑不赢,直接放弃。
官方文档没说的痛点
回测跑完了,想导出详细交易数据做外部分析?右键导出报告,出来的是HTML文件。格式好看归好看,但想把每一笔交易的买卖价格、盈亏明细弄进Excel或者Python里做深度分析,那叫一个折腾。
我翻MQL5论坛的时候看到有人讨论这个,解决思路很简单:直接在EA里写一段代码,把交易数据写入CSV文件。
交易数据导出到CSV
在我EA的
OnDeinit()函数里加了下面这段,回测一结束自动生成CSV:``
mql5
void OnDeinit(const int reason) {
int handle = FileOpen("BacktestTrades.csv", FILE_WRITE | FILE_CSV, ",");
if(handle != INVALID_HANDLE) {
FileWrite(handle, "订单号", "时间", "方向", "手数", "价格", "盈亏");
for(int i = 0; i < HistoryDealsTotal(); i++) {
ulong ticket = HistoryDealGetTicket(i);
FileWrite(handle,
(long)ticket,
TimeToString(HistoryDealGetInteger(ticket, DEAL_TIME)),
HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_TYPE_BUY ? "买入" : "卖出",
HistoryDealGetDouble(ticket, DEAL_VOLUME),
HistoryDealGetDouble(ticket, DEAL_PRICE),
HistoryDealGetDouble(ticket, DEAL_PROFIT)
);
}
FileClose(handle);
}
}
`
文件会生成在MQL5\Files目录下。用Excel打开,想怎么分析就怎么分析,比折腾HTML报告省心一百倍。
优化功能的遗传算法技巧
参数优化可以跑成百上千次组合。官方文档说可以用遗传算法来缩短时间,但我一开始没搞明白怎么用。关键点在于:你得在EA的OnTester()函数里返回一个数值作为优化目标。这个值可以是最终余额、夏普比率或者盈利因子。遗传算法会朝着这个目标值去搜索最优参数组合。
如果不设置自定义准则,默认优化目标是最大化余额。但我更倾向于用夏普比率做目标——余额高不代表策略稳定,夏普高才说明风险控制得好。
可视化测试的妙用
切换到可视化模式,回测会逐根K线播放EA的交易过程。速度慢,但能帮你发现纯数字报告里看不到的逻辑漏洞。我有一次发现EA总是在错误的价格开仓,排查了半天才发现是代码里把SYMBOL_POINT用错了——这个Bug不看可视化根本发现不了。
参考来源:MetaTrader 5官方文档 - 策略测试器(metatrader5.com);MQL5帮助中心 - 测试报告(metatrader5.com)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。
``