创建 EA 交易优化的自定义标准(基础篇)
📘

创建 EA 交易优化的自定义标准(基础篇)

第 1/3 篇

◍ 给 EA 优化装上你自己的评分尺

MT5 自带的优化目标只有净利润、夏普之类固定几项,真要按自己的交易逻辑挑参数,得自己写自定义标准。 自定义标准本质是写一个 double 类型的 OnTester() 函数,回测每跑完一组参数,终端就调用它一次,把返回值当成该组参数的拟合分。 下面这段是最小骨架:在函数里读权益曲线,算一个“盈利交易占比 × 平均盈利因子”的复合值返回,比单看净利润更抗过拟合。 外汇与贵金属回测的高风险在于:历史拟合优不代表未来实盘同分布,自定义标准只是筛参工具,不预示收益。

MQL5 / C++
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() 函数的返回值为优化依据,意味着你能把任意逻辑——比如带惩罚项的综合评分——塞进遗传算法去寻优。

MQL5 / C++
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;
  }
上面这段是 Custom max 的最小骨架:STAT_PROFIT 拿到净利润,STAT_EQUITYDD_PERCENT 拿到权益回撤百分比,两者折成 0~1 区间的加权分返回。把它编译进 EA,测试器设置里选 Custom max,遗传算法就会朝这个分数最大化方向搜参数。

MQL5 / C++
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),它刻画系统与市场的契合度,优化时顺手把它也收进来。上述标准还能自由拼接,组合空间远大于测试器下拉框里那几项。外汇与贵金属杠杆高,回测顺滑不等于实盘能复现,拼接前先想清每项的样本意义。

常见问题

在优化设置里把评价准则从默认改为自定义公式,用 OnTester 返回你想最小化的回撤指标即可。
会。只要在 OnTester 里返回数值,遗传算法就按这个值筛选,值越优的种群越容易保留。
可以。把你的偏好(如回撤上限、胜率门槛)告诉小布,它能给出可粘贴的自定义判据代码框架。
可能标准过拟合了噪声。建议加入样本外分段验证,并限制参数组合复杂度。
在 OnTester 里用加权公式,例如返回 Profit * 0.7 + Deals * 0.3,再据此排序选参。