创建 EA 交易优化的自定义标准(基础篇)
◍ 给 EA 优化装上你自己的评分尺
MT5 自带的优化目标只有净利润、夏普之类固定几项,真要按自己的交易逻辑挑参数,得自己写自定义标准。 自定义标准本质是写一个 double 类型的 OnTester() 函数,回测每跑完一组参数,终端就调用它一次,把返回值当成该组参数的拟合分。 下面这段是最小骨架:在函数里读权益曲线,算一个“盈利交易占比 × 平均盈利因子”的复合值返回,比单看净利润更抗过拟合。 外汇与贵金属回测的高风险在于:历史拟合优不代表未来实盘同分布,自定义标准只是筛参工具,不预示收益。
class="type">class="kw">double OnTester() { class="type">class="kw">double ret = class="num">0.0; class=class="str">"cmt">// 获取平仓交易总数 class="type">class="kw">ulong total = HistoryDealsTotal(); if(total == class="num">0) class="kw">return ret; class="type">int wins = class="num">0; class="type">class="kw">double gross_profit = class="num">0.0, gross_loss = class="num">0.0; for(class="type">class="kw">ulong i=class="num">0; i<total; i++) { class="type">class="kw">ulong ticket = HistoryDealGetTicket(i); class="type">class="kw">double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); if(profit > class="num">0) { wins++; gross_profit += profit; } else gross_loss += -profit; } class="type">class="kw">double win_rate = (class="type">class="kw">double)wins / (class="type">class="kw">double)total; class="type">class="kw">double pf = gross_loss > class="num">0 ? gross_profit / gross_loss : class="num">0; ret = win_rate * pf; class=class="str">"cmt">// 复合自定义标准 class="kw">return ret; }
在 MT5 里自己定义优化判据
MT5 策略测试器自带利润、夏普、回撤等固定优化标准,但内置项覆盖不到所有交易逻辑。开发者可以借助 OnTester() 回调注入自定义评价函数,把任意统计指标变成寻优目标。 这套机制让 EA 参数搜索从“平台给什么用什么”变成“自己定规则”。复杂判据如多周期形态吻合度、简单判据如净盈利除以成交笔数,都能直接写进测试流程。 实操上,你打开 MT5 的 EA 源码,找到或新建 OnTester() 函数,返回 double 类型的评分即可参与遗传或穷举优化。外汇与贵金属杠杆高、滑点跳空频繁,自定义标准回测结果仅代表历史样本,实盘仍可能偏离。
「下场跑测试前先补齐的这些底层文档」
MT5 的策略测试器不是点一下开始就出结果的黑箱,它背后有一套明确的数据生成与事件模拟逻辑。想让回测有点参考价值,得先搞清开盘价模式、M1 柱重建、指标在测试期的计算时机,以及多货币测试时环境变量的处理方式。 官方说明文档里「MetaTrader 5 中的测试原理」一节把上面这些技术细节拆得很透,包括标准事件怎么被派发、测试环境如何近似真实账户。另一篇「利用 MQL5 测试与优化 EA 交易指南」则聚焦输入参数的遍历与拟合陷阱——过拟合的曲线看着漂亮,实盘大概率吃瘪。 还有一块容易被忽略:用 TesterWithdrawal() 可以在回测里建模定期出金,这会直接改算法对净值回撤的统计。外汇与贵金属杠杆高、滑点跳空频发,回测不模拟出金和亏损序列,资金曲线容易虚胖。 随客户端自带的说明文档是总入口,上面几篇深入专题建议先扫一遍再动手写 EA,不然测试报告里的数字你可能读错一半。
◍ 遗传算法下的优化标准怎么挑
MT5 策略测试器的优化标准,本质是一个用于排序参数组合的质量因数:数值越高,代表那组入参在遗传算法跑完后的评价越好。但要注意,它只在遗传算法优化模式下生效;如果你勾的是「全部组合遍历」,测试器不会用任何因数自动挑最优,只能自己把结果导出后再筛。 内置清单里能看到这几类:Balance max 取余额峰值;Balance + max Profit Factor 取余额乘获利系数;Balance + min Drawdown 用 (100% - 亏损水平) × 余额 来折抵回撤;还有接夏普比率、回收系数的变体。外汇与贵金属品种波动剧烈,单纯追余额最大值很容易选出过拟合的极端参数,实盘大概率回吐。 真正留给我们发挥空间的是列表末尾的 Custom max。它不看预设指标,而是读取 EA 里 OnTester() 函数的返回值为优化依据,意味着你能把任意逻辑——比如带惩罚项的综合评分——塞进遗传算法去寻优。
class="type">class="kw">double OnTester() { class="type">class="kw">double score = class="num">0; class=class="str">"cmt">// 取余额与最大回撤 class="type">class="kw">double balance = TesterStatistics(STAT_PROFIT); class="type">class="kw">double dd = TesterStatistics(STAT_EQUITYDD_PERCENT); class=class="str">"cmt">// 回撤越小、净利越高,评分越大 score = balance * (class="num">100 - dd) / class="num">100; class="kw">return score; }
class="type">class="kw">double OnTester() { class="type">class="kw">double score = class="num">0; class=class="str">"cmt">// 取余额与最大回撤 class="type">class="kw">double balance = TesterStatistics(STAT_PROFIT); class="type">class="kw">double dd = TesterStatistics(STAT_EQUITYDD_PERCENT); class=class="str">"cmt">// 回撤越小、净利越高,评分越大 score = balance * (class="num">100 - dd) / class="num">100; class="kw">return score; }
把优化标准捏成自己想要的样子
策略测试器默认只给几种固定搭配,但 EA 跑完每趟后其实能自己算任意参数组合。比如 Balance max + min Drawdown + Trades Number 这套,交易次数越多,统计意义越扎实;或者换 Balance max + min Drawdown + max Profit Factor,更看重盈利质量而非频次。 这类直接堆参数的玩法可叫“简单优化标准”,但单看它们仍难给交易系统下可靠判断。若站在“最低风险换收益”的角度,更该追一条最平滑的权益曲线——每笔成交偏离理想直线越小越好,这算“按平衡曲线优化”。 另一块是安全系数(CSTS),它刻画系统与市场的契合度,优化时顺手把它也收进来。上述标准还能自由拼接,组合空间远大于测试器下拉框里那几项。外汇与贵金属杠杆高,回测顺滑不等于实盘能复现,拼接前先想清每项的样本意义。