攫取盈利至最后的点位·进阶篇
(2/3)· 跳过柱线指标的红海,用 MT5 测试器当挖掘机在报价流里捞宝藏
多数人找交易系统只在历史柱线和指标里打转,那片土壤早被翻烂了。把即时报价当成更接近原始的矿层,才有可能碰到还没被大众踩过的形态。本文接上篇,继续把广域搜索的铲子磨快。
手工筛 81 个变体,先看一段夜间收益
- 个品种的全量计算在 10 小时内跑完,MT5 测试器多核并行顺带把 CPU 烤了 10 小时暖气。优化缓存落库后,我手工翻了 81 个变体——这步本可脚本化,但还没写,所以实打实耗了一小时。
挑一个品种举例:按 BestInterval 条件排序,自定义品种不限制负余额,所以余额绝对值不用管,只看成交密度。红色列里选一条记录做单测,交易图显示是全天候跑的。 单测末尾日志写明:想拿 4035 点利润,得把交易时段卡在晚 8 点到早 8 点。进 EA 输入参数把 BestInterval 激活,确认 MT5 关掉优化模式再跑,日志里成交密集、余额曲线平滑,看起来不错。 但凡图表在优化间隔外崩掉的,基本是数理性过度拟合——实盘大概率亏光。MT5 的前驱测试我视为自欺,更靠谱的做法是拿整个历史跑两三个好结果,全历史不行就弃用,前驱测试多跑也只是过度拟合的副产品。 黄金这类品种常出现全历史优化值拉胯的情况,红框是优化间隔;测试周期远长于优化间隔时,稳定性才上来。下面这段日志是夜间时段(20:00–08:00,11 小时)开启 BestInterval 的实跑摘要。
BestInterval Action(<span class="keyword">true</span> - single pass & MT4-style & Virtual <span class="keyword">is</span> required) = <span class="keyword">false</span> Profit = -<span class="number">class="num">2392.00</span> = -<span class="number">class="num">2392.00</span> + <span class="number">class="num">0.00</span> (<span class="number">class="num">0.00</span>%) - Amount of Delete Intervals = <span class="number">class="num">0</span> (<span class="number">class="num">2019.04</span>.<span class="number">class="num">01</span> - <span class="number">class="num">2019.07</span>.<span class="number">class="num">20</span>) <span class="number">class="num">00</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00</span> - <span class="number">class="num">23</span>:<span class="number">class="num">59</span>:<span class="number">class="num">59</span> : Profit = -<span class="number">class="num">2392.00</span> (<span class="number">class="num">100.00</span>%), Total = <span class="number">class="num">2612</span> (<span class="number">class="num">70.64</span>%), PF = <span class="number">class="num">0.94</span>, Mean = -<span class="number">class="num">0.92</span>, DD = <span class="number">class="num">3840.00</span>, RF = -<span class="number">class="num">0.62</span> SUMMARY: <span class="number">class="num">00</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00</span> - <span class="number">class="num">23</span>:<span class="number">class="num">59</span>:<span class="number">class="num">59</span> : Profit = -<span class="number">class="num">2392.00</span> (<span class="number">class="num">100.00</span>%), Total = <span class="number">class="num">2612</span> (<span class="number">class="num">70.64</span>%), PF = <span class="number">class="num">0.94</span>, Mean = -<span class="number">class="num">0.92</span>, DD = <span class="number">class="num">3840.00</span>, RF = -<span class="number">class="num">0.62</span> Profit = <span class="number">class="num">4035.00</span> = -<span class="number">class="num">2392.00</span> + <span class="number">class="num">6427.00</span> (-<span class="number">class="num">268.69</span>%) - Amount of Delete Intervals = <span class="number">class="num">1</span> (<span class="number">class="num">2019.04</span>.<span class="number">class="num">01</span> - <span class="number">class="num">2019.07</span>.<span class="number">class="num">20</span>), <span class="number">class="num">20</span>:<span class="number">class="num">00</span> - <span class="number">class="num">08</span>:<span class="number">class="num">00</span>, CountHours = <span class="number">class="num">11</span> <span class="number">class="num">00</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00</span> - <span class="number">class="num">07</span>:<span class="number">class="num">58</span>:<span class="number">class="num">54</span> : Profit = <span class="number">class="num">1074.00</span> (<span class="number">class="num">26.62</span>%), Total = <span class="number">class="num">349</span> (<span class="number">class="num">76.22</span>%), PF = <span class="number">class="num">1.21</span>, Mean = <span class="number">class="num">3.08</span>, DD = <span class="number">class="num">709.00</span>, RF = <span class="number">class="num">1.51</span> <span class="number">class="num">19</span>:<span class="number">class="num">41</span>:<span class="number">class="num">38</span> - <span class="number">class="num">23</span>:<span class="number">class="num">59</span>:<span class="number">class="num">59</span> : Profit = <span class="number">class="num">2961.00</span> (<span class="number">class="num">73.38</span>%), Total = <span class="number">class="num">348</span> (<span class="number">class="num">76.44</span>%), PF = <span class="number">class="num">1.94</span>, Mean = <span class="number">class="num">8.51</span>, DD = <span class="number">class="num">358.00</span>, RF = <span class="number">class="num">8.27</span> SUMMARY: <span class="number">class="num">00</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00</span> - <span class="number">class="num">23</span>:<span class="number">class="num">59</span>:<span class="number">class="num">59</span> : Profit = <span class="number">class="num">4035.00</span> (<span class="number">class="num">100.00</span>%), Total = <span class="number">class="num">697</span> (<span class="number">class="num">76.33</span>%), PF = <span class="number">class="num">1.49</span>, Mean = <span class="number">class="num">5.79</span>, DD = <span class="number">class="num">484.00</span>, RF = <span class="number">class="num">8.34</span> BestInterval <span class="keyword">is</span> saved <span class="keyword">in</span> <span class="class="type">class="kw">string">"TesterEA"</span>-file <span class="keyword">in</span> common(MT5)/<span class="keyword">base</span>(MT4) folder. final balance - InitBalance(<span class="number">class="num">10000.00</span>) + Profit(-<span class="number">class="num">2392.00</span>) without BestInterval. <span style="background-class="type">class="kw">color:rgb(class="num">255, class="num">246, class="num">200);">OnTester - Profit(<span class="number">class="num">4035.00</span>) with BestInterval.</span> final balance <span class="number">class="num">7608.00</span> USD OnTester result <span class="number">class="num">4035</span> BestInterval Action(<span class="macro">true</span> - single pass & MT4-style & Virtual is required) = <span class="macro">true</span> Calculation time activated intervals is <span class="number">class="num">2019.07</span>.<span class="number">class="num">23</span> <span class="number">class="num">16</span>:<span class="number">class="num">27</span>:<span class="number">class="num">25</span> - TesterEA(common folder) <span class="number">class="num">00</span>:<span class="number">class="num">13</span>:<span class="number">class="num">14</span> ago. Amount of Delete Intervals = <span class="number">class="num">1</span> (<span class="number">class="num">2019.04</span>.<span class="number">class="num">01</span> - <span class="number">class="num">2019.07</span>.<span class="number">class="num">20</span>), <span class="number">class="num">20</span>:<span class="number">class="num">00</span> - <span class="number">class="num">08</span>:<span class="number">class="num">00</span>, CountHours = <span class="number">class="num">11</span>
◍ 时段切分后的回测表现差异
把全天按 00:00:00–07:58:54 与 19:41:38–23:59:59 两段拆开看,同一策略的表现完全不是一回事。前一段 349 笔交易、盈利 1074.00(占 26.62%),盈利因子 PF 只有 1.21,最大回撤 DD 709.00,风险回报比 RF 1.51;后一段 348 笔、盈利 2961.00(占 73.38%),PF 拉到 1.94,DD 降到 358.00,RF 冲到 8.27。 合并全天 697 笔、总盈利 4035.00(初始余额 10000.00 的 40.35%),整体 PF 1.49、均值盈利 5.79。注意这段统计的 Profit 是按 TickValue=1 且不含佣金与掉期算的,外汇与贵金属实盘加上点差和隔夜费后数值会明显缩水,属高风险验证项。 OnTester 里还有一条对照:不带 BestInterval 优选时段时,虚拟余额 10000.00 加 Profit -2403.00,最终 OnTester 返回 7597。说明优选时段开关直接改变了回测的退出值,想复现的话进 MT5 策略测试器把周期切片跑一遍就能比对。
class="num">00:class="num">00:class="num">00 - class="num">07:class="num">58:class="num">54 : Profit = class="num">1074.00 (class="num">26.62%), Total = class="num">349 (class="num">76.22%), PF = class="num">1.21, Mean = class="num">3.08, DD = class="num">709.00, RF = class="num">1.51 class="num">19:class="num">41:class="num">38 - class="num">23:class="num">59:class="num">59 : Profit = class="num">2961.00 (class="num">73.38%), Total = class="num">348 (class="num">76.44%), PF = class="num">1.94, Mean = class="num">8.51, DD = class="num">358.00, RF = class="num">8.27 SUMMARY: class="num">00:class="num">00:class="num">00 - class="num">23:class="num">59:class="num">59 : Profit = class="num">4035.00 (class="num">100.00%), Total = class="num">697 (class="num">76.33%), PF = class="num">1.49, Mean = class="num">5.79 final balance - InitBalance(class="num">10000.00) + Profit(class="num">4035.00) with BestInterval. OnTester - Virtual InitBalance(class="num">10000.00) + Profit(-class="num">2403.00) without BestInterval. Profit is calculated with TickValue=class="num">1 and w/o Commission+Swap. final balance class="num">14035.00 USD OnTester result class="num">7597
「EURCHF 的佣金吞噬与网格幻象」
多轮测试跑完,品种筛选结果指向 EURCHF。其回测报告里以点为单位的数学期望被标红,这是核心参考量——但该品种来回佣金约 4.40 点,意味着经纪商抽走利润的三分之二,成本占比过高,实盘前必须重新评估点值结构。 为剔除非系统数据造成的优化失真,删掉 BestInterval,改挂交易时间输入,从最大回撤结束位(图上绿标)起跑优化;参数多就跑几轮遗传优化。源码里加一段时间过滤,未过滤品种的数学期望收益因此翻了两倍。 我也试过网格与马丁类手法,数学收益曲线一度走高却讲不清来源。后来发现 MT5 测试器对净持结算账户用了另一套算法,显示值并非真实策略产出。下方代码重写了 OnTester 的正确期望 payoff 计算。 重写后结论很干脆:网格无法改善已优化策略的数学期望,只是改变了账户计算口径。外汇与贵金属杠杆高,这类回测结论仅代表历史样本概率倾向,实盘仍需小资金验证。
class="kw">const class="type">bool TradeTime = (TimeCurrent() < D&class="macro">#x27;class="num">2018.02.class="num">10&class="macro">#x27;) || (TimeCurrent() >= D&class="macro">#x27;class="num">2018.02.class="num">12&class="macro">#x27;); class=class="str">"cmt">// Calculating expected payoff on hedging accounts corresponds to traditional calculation. class="type">class="kw">double OnTester() { class="type">class="kw">double Res = class="num">0; if (HistorySelect(class="num">0, INT_MAX)) for (class="type">int i = HistoryDealsTotal() - class="num">1; i >= class="num">0; i--) Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_VOLUME); Res /= class="num">2; if (Res) Res = TesterStatistics(STAT_PROFIT) / Res; class="kw">return(Res); }
把执行细节变成真金白银
选经纪商时别只看点差。要拉出历史 tick 查限价单真实成交方式:有的券商用市价单兜底限价单,允许负数滑点;有的禁止限价挂单部分成交。这两类都该避开——在高频策略里每 0.1 点都直接进数学期望。 实盘我跑在 MT4,但回测逻辑来自 MT5 的跨平台库。EA 启动后先通过 HistoryTicks 拉满历史报价,再用虚拟函数库在沙盒里对齐 tick 级环境;设置里勾选“整段交易历史”显示到当前,能把输入参数出错概率压到最低。关 EA 再开,虚拟环境接着跑,像没断过。 真实环境持续和这个“完美执行”的虚拟环境同步,目的只有一个:把每笔该吃到的滑点都吃进来。我几乎把所有系统都这么处理,对这种薄利高频尤其关键。 只锁一组参数等于赌未来。我直接挑了 8 个优化变体,等资金分摊,八个图表各挂独立 MagicNumber 同时跑。看起来像网格,其实是八套互不相关的系统,谁将来活得好就靠分布扛住不确定性。外汇与贵金属杠杆高,这类多实例跑法仍可能整体回撤,需实时盯保证金。