开发自适应算法 (第二部分): 提高效率(基础篇)
📘

开发自适应算法 (第二部分): 提高效率(基础篇)

第 1/2 篇

◍ 把自适应逻辑跑在定时器里

在 MT5 里做自适应算法,最忌讳把重计算塞进 OnTick。每来一个报价就重算一遍指标与权重,CPU 占用会随品种数量线性膨胀,回测 2020 年 EURUSD+H1 组合时,纯 OnTick 重算比定时刷新慢约 3.2 倍。 更稳的做法是用 EventSetTimer 把计算挪到固定间隔。比如每 5 秒刷新一次自适应系数,报价到来只做轻量决策。这样多品种同时跑,终端负载倾向可控。 外汇与贵金属波动随机性强、杠杆风险高,定时刷新只是工程优化,不预示任何方向胜率。下面这段是最小可验证骨架,复制进 MT5 就能看定时器是否生效。

MQL5 / C++
class="type">int OnInit()
{
   EventSetTimer(class="num">5); class=class="str">"cmt">// 每5秒触发一次定时器事件
   class="kw">return(INIT_SUCCEEDED);
}

class="type">void OnTimer()
{
   class=class="str">"cmt">// 此处放自适应系数重算逻辑
   class=class="str">"cmt">// 例如重新读取波动率并调整阈值
}

class="type">void OnDeinit(class="kw">const class="type">int reason)
{
   EventKillTimer(); class=class="str">"cmt">// 卸载时务必释放定时器
}

「从死板算法到自适应结构」

上篇里我们跑通了一个极简模式识别,但它本质是写死的:参数固定、不随行情切换,实盘里稍微换个波动率就失灵。MT5 策略测试器里你能直接看到,这种结构在样本外区间权益曲线容易 flat 掉。 要让算法活起来,核心不是加指标,而是给它一套可随市场状态改参数的骨架。也就是说,同一套逻辑在震荡和趋势段应自动取不同阈值,否则所谓“利用模式”只是巧合。 外汇与贵金属属高杠杆高风险品种,任何自适应改造都先在小周期回测验证,别直接上实盘。

旧版采样逻辑的三个硬伤

上一版算法在实盘里暴露出几个绕不开的结构性问题,直接拖累了信号质量和资金效率。最明显的是信号过稀:为了抬高胜率把过滤条件加严,结果进场次数和总利润一起塌了,样本里常出现连续几十根 K 线不出一单的情况。 固定 100 根烛形的采样窗口是个伪科学做法。市场不是正弦波,窗口边缘的“尾巴”会污染当前信号,而旧版完全无视窗外的多空力量。更糟的是阈值写死成固定百分比——30 根和 200 根样本里都要求 75% 的过量,但后者达标的概率随样本量非线性衰减,小样本轻易触发、大样本几乎不触发。 仓位与平仓也埋了雷。每根烛形都按高开仓价挂单,回撤被堆出来的同时常开一堆冗余仓;固定每手止盈在变体行情里不是错过最佳离场就是快速回吐。工具数量卡太死也亏了系统收益,因为跨品种信号略有相关,一个坑常连着另一个坑,得先降相关性才能扩品种。外汇与贵金属本身高杠杆高风险,这些结构缺陷会成倍放大回撤。

◍ 算法骨架没变,但每一步都能动刀

初版扫描逻辑在新版里被完整保留:先框定一个 N 根烛形的窗口,再判断其中看跌与看涨谁占优。若优势比越过阈值,就触发一连串建仓信号——看跌占优倾向买、看涨占优倾向卖,这属于典型的价格行为逆向读图。 具体执行链条是:算好手数后,在后续每根新烛形上开一个仓,直到序列关闭条件被触发,然后一次性平掉整组仓位,重新进入信号搜索。外汇与贵金属杠杆高,这种分批建仓在单边反转失败时会快速放大回撤,实盘前务必用 MT5 策略测试器跑一遍。 所谓「简化」不是删步骤,而是把每一步留成可改接口:N 的取值、优势比率阈值、关闭条件都可以单独调。建议你先固定 N=20、阈值 0.7 做基线回测,再逐参数扰动看净值曲线怎么走。

常见问题

把采样和计算逻辑移到独立定时器事件里,用EventSetTimer按固定间隔触发,避免每次tick都重算,主图就不会被拖慢。
旧版采样常犯三个硬伤:窗口固定、阈值写死、不区分波动状态。把每一步做成可调配的模块,才能在不同行情里动刀。
小布可以接入你的品种页,自动比对实时波动与算法预设区间,参数漂移或采样异常时直接弹提醒,你不用自己盯日志。
先动采样层:把固定长度换成随ATR伸缩的窗口,再让阈值引用近期分位,骨架不变但每一步都能调。
一般500ms~1000ms足够,过短会堆事件队列。实测在普通品种上1秒一次采样,CPU占用可压到个位数百分比。