创建 EA 交易优化的自定义标准·综合运用
(3/3)·内置标准总在极端行情失灵?两套自定义类把优化从盲搜拉回可控
◍ 用平衡曲线斜率做自定义优化标准
自定义优化标准的核心,是让 EA 在测试中的余额曲线尽可能贴近一条直线。做法基于回归分析:先由策略测试的交易结果算出一条线性回归线,再用交易结果相对该直线的标准方差来度量“弯曲程度”,方差越小越接近直线。 为过滤掉负余额的畸形曲线,标准里强制加了两条闸门——总获利必须高于设定阈值,且总交易次数必须低于设定上限。最终优化评分与“获利达标且交易数受限下的标准方差”成反比,方差越低分越高。 实现上直接改前面的 TBalanceSlope 类:换用带参构造函数方便传值,并补上线性回归的标准方差计算,完整代码见文附 BalanceSlope.mqh。EA 接入方式和之前一致,下面这行就是注册该标准的调用: 在 EURUSD、H4 周期、2010.01.01–2011.01.01 上跑优化后,取两个获利相近的前排参数集做样本外检验(测试延到 2011.06.14)。居中的那组样本外盈利能力从 1.60 微降到 1.56,曲线形态未恶化;而排最前的那组样本外直接从 2.17 跌到 1.75 且区间外无获利。 这说明平衡曲线平直度与参数鲁棒性之间可能存在相关,但外汇/贵金属高杠杆下样本外失效仍常见,不能排除某些 EA 根本找不到达标解,此时得换统计参数集重做分析。
criterion_Ptr.Add(new TBalanceSlopeCriterion(Symbol( ), class="num">10000.0));
「用 CSTS 给 EA 优化加一道安全滤网」
交易系统的安全系数 CSTS 由公式 CSTS = Avg.Win / Avg.Loss × ((110% - %Win) / (%Win - 10%) + 1) 给出,其中 Avg.Win 为获利交易均值、Avg.Loss 为亏损交易均值、%Win 为获利交易占比。CSTS 低于 1 意味着系统落入高风险或不盈利区,数值越大代表系统对市场适配度越高、盈利倾向越强。外汇与贵金属杠杆品种波动剧烈,CSTS 仅作概率层面的稳健性参考,不等于未来收益保证。 MT5 策略测试器在每轮回测后都会算出上述统计值,我们只需从 TCustomCriterion 派生 TTSSFCriterion 类并重写 GetCriterion()。下方代码直接返回 CSTS 实测值,可挂进自定义优化标准里跑。 代码逐行拆解:
- 第1行:定义 TTSSFCriterion::GetCriterion() 返回 double 类型的优化评分数。
- 第2行:用 STAT_GROSS_PROFIT 除以 STAT_PROFIT_TRADES 得到平均盈利 avg_win。
- 第3行:用负的 STAT_GROSS_LOSS 除以 STAT_LOSS_TRADES 得到平均亏损绝对值 avg_loss。
- 第4行:获利交易数除以总交易数乘 100 得到胜率 win_perc。
- 第5–6行:注释说明,按当前胜率算理论安全比 teor = (110 - 胜率)/(胜率 - 10) + 1。
- 第7–8行:注释说明,real 为真实盈亏比 avg_win / avg_loss。
- 第9–11行:tssf = real / teor 即 CSTS,函数返回该值。
较短优化区间往往更贴合该标准,但过度拟合风险随之上升。实操中建议取优化结果排序里处于中间位置的参数组,而非极端最高分。附带的 FanExpertTSSF.mq5 可直接在 MT5 里加载验证这套标准。
class="type">class="kw">double TTSSFCriterion::GetCriterion() { class="type">class="kw">double avg_win = TesterStatistics(STAT_GROSS_PROFIT) / TesterStatistics(STAT_PROFIT_TRADES); class="type">class="kw">double avg_loss = -TesterStatistics(STAT_GROSS_LOSS) / TesterStatistics(STAT_LOSS_TRADES); class="type">class="kw">double win_perc = class="num">100.0 * TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES); class=class="str">"cmt">// Calculated safe ratio for this percentage of profitable deals: class="type">class="kw">double teor = (class="num">110.0 - win_perc) / (win_perc - class="num">10.0) + class="num">1.0; class=class="str">"cmt">// Calculate real ratio: class="type">class="kw">double real = avg_win / avg_loss; class=class="str">"cmt">// CSTS: class="type">class="kw">double tssf = real / teor; class="kw">return(tssf); }
把自定义优化标准接进策略测试器
单一积分率思路把自定义优化门槛压到了很低:在 MT5 里重写 OnTester 就能让遗传优化按你定的数学标准挑参数,而不是只看最终余额。云优化把历史数据跑量限制也拆掉了,多币种组合测试不再卡在本地算力上。 下面这段把凯利标准直接做成优化目标,读者可粘进 EA 的 OnTester 验证。它先算胜率 w,再算盈亏比 r,最后返回 Kelly=w-(1-w)/r;任一分母为 0 时返回 0,避免除零崩测。 别把正态当圣经 统计类标准(凯利、斜率、回撤)都只是过滤器的一种。评论区有人用‘最大平衡+<20%回撤’筛多货币对 EA,说明实盘前还要人工叠加风控告警,外汇与贵金属杠杆品种尤须警惕爆仓可能。 代码能跑通不代表策略能活。把自定义标准接进测试器只是把‘靠谱系统’的初筛自动化,后续仍要在多周期、多品种上重复优化并观察曲线平直度,概率上提升鲁棒性而非保证。
class="type">class="kw">double OnTester(class="type">void) { class=class="str">"cmt">//https://www.investopedia.com/articles/trading/class="num">04/class="num">091504.asp class="type">class="kw">double w=((TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES))>class="num">0)?TesterStatistics(STAT_PROFIT_TRADES)/(TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES)):class="num">0; class=class="str">"cmt">// 获胜概率 class="type">class="kw">double r=((TesterStatistics(STAT_GROSS_LOSS)!=class="num">0)&&(TesterStatistics(STAT_LOSS_TRADES)!=class="num">0)&&(TesterStatistics(STAT_PROFIT_TRADES)!=class="num">0))?(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES))/(-TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES)):class="num">0; class=class="str">"cmt">// 胜/负比率; class="type">class="kw">double Kelly=(r!=class="num">0)?w-((class="num">1-w)/r):class="num">0; class=class="str">"cmt">// 凯利标准 class="kw">return(Kelly); }