自适应指标·进阶篇
📘

自适应指标·进阶篇

第 2/2 篇

把权重搬进价格域

普鲁特科夫那句‘月亮比太阳有用’放到交易里是个引子:别人都盯着时域平滑,我们偏要把窗口函数挪到价格域里玩。做法不复杂——先挑一个价格值当中心,它权重最大;其他价格按离中心的距离衰减权重,离得越远权重越小。 这套逻辑在 MT5 里跑出来的指标,外观上随行情起伏调整权重比率,但严格说它还算不上自适应,只是‘随当前市况调整’的第一步。外汇与贵金属波动剧烈,这类实验性指标仅作参考,实盘高风险。 下面这段 MQL5 是核心计算。逐行看:value 取中心价格,max 初始化为 _Point;第一个 for 循环算每个价格与中心的绝对偏差,并刷新最大偏差。width 把最大偏差按周期修正,避免两端权重掉到零。第二个 for 循环按 Linear / Quadratic / Exponential 三种模式算权重,再累加加权和与权重分母,最后 buffer[i]=sum/denom 出值。 开 MT5 把 Smoothing 切到 Exponential,对比 Linear 权重曲线,能直观看到远端价格衰减更快,对跳空反应可能更钝。

MQL5 / C++
class="type">class="kw">double value=price[i+center],class=class="str">"cmt">//Price value at the center
       max=_Point;       class=class="str">"cmt">//Maximum deviation
for(class="type">int j=class="num">0; j<period; j++)class=class="str">"cmt">//Calculate price deviations from the central one and the max deviation
  {
   weight[j]=MathAbs(value-price[i+j]);
   max=MathMax(max,weight[j]);
  }
class="type">class="kw">double width=(period+class="num">1)*max/period,class=class="str">"cmt">//correct the maximum deviation from the center so that there are no zeros at the ends
       sum=class="num">0,
       denom=class="num">0;
for(class="type">int j=class="num">0; j<period; j++)class=class="str">"cmt">//calculate weight ratios for each price
  {
   if(Smoothing==Linear)class=class="str">"cmt">//linear smoothing
     weight[j]=class="num">1-weight[j]/width;
   if(Smoothing==Quadratic)class=class="str">"cmt">//quadratic smoothing
     weight[j]=class="num">1-MathPow(weight[j]/width,class="num">2);
   if(Smoothing==Exponential)class=class="str">"cmt">//exponential smoothing
     weight[j]=MathExp(-weight[j]/width);
   sum=sum+weight[j]*price[i+j];
   denom=denom+weight[j];
  }
buffer[i]=sum/denom;class=class="str">"cmt">//indicator value

「给矩形窗口加可变比率」

把矩形窗口函数当底子,但放开首尾两段的比率限制,让 C1、C2 变成可自适应调节的参数。指标公式写成以 N 为周期、C1/C2 为自适应比率的加权形式,新价格进来时指标误差会随之跳动。 为了压低误差,引入校正因子 R 对每个比率做修正,目标是把误差逼向零,同时要求 R 本身尽量小,这样比率会围绕某个最优值波动而不是乱窜。 用最小二乘求 R:先算收敛因子 M,再令 R = 价格 × 误差 × M,最后按更新公式回写 C1、C2。这样得到的曲线和简单移动平均线(红线)摆在一起,能看出自适应段对拐点的跟随更紧。外汇与贵金属波动剧烈,这类自适应参数在高波动段可能过拟合,上 MT5 跑前先用历史数据核对 M 的收敛表现。

◍ 让比率自己追价格的 P 参数

前面两节已经算出两组静态比率,但市场状态会变,死比率迟早失真。能不能让每一步的比率都跟着数据走?可以,做法和之前几乎一样,唯一改动在收敛因子的算式里引入 P 参数。 P 必须 ≥1。P 小的时候比率冲向最优值很快,但容易过头、来回乱跳;P 大则比率挪得慢,P 越大线越平滑。实测把同一个自适应指标分别跑 P=1 和 P=1000,前者抖动剧烈、后者几乎成直线——两者视觉差异极大。 常规用法:先把 P 设成和指标周期相等,再往大或往小慢慢拧,直到图形符合你的过滤需求。注意自适应指标有个坑——它的比率之和不恒等于 1,会随输入数据漂,这和传统 EMA 不同。 以 EMA 为例,普通写法是 α 固定;自适应版变成 C1、C2 互不依赖,更新时除了价格还要吃指标自身的上一期值,再反推新的 C1、C2。这套机制也能套到 LWMA 上:以周期 5 为例,先算权重累计,再用归一化公式调 C,短周期里 P 的影响明显,长周期几乎看不出差别。 基于这套自适应,能直接拼出 CCI 自适应版等振荡器,用来抓背离比原版更跟手。外汇与贵金属波动剧烈,自适应不代表信号更准,开 MT5 把 P 从周期值往两头调一遍就知道边界在哪。

把自适应指标改成线性预测

做自适应指标和求解线性预测在本质上是同一件事。只要把指标输出与未来价格(相对指标本身而言)的偏差当成误差项,自适应指标就自然变成了预测指标。 以开盘价为例,指标方程与误差定义可写为:指标值拟合开盘价序列,误差 = 未来第 -1 根柱线的开盘价 - 当前指标值。其余计算仍走我们已熟悉的那套递推方程。 唯一要补的一步是算平均预测误差。加上它之后,指标会在索引为 -1 的柱线上给出开盘价的预测值——也就是下一根尚未形成的开盘价。 外汇与贵金属市场高杠杆、高波动,这类预测值只反映历史数据的线性外推倾向,实战中务必用 MT5 多周期回测验证其滞后与失效边界。

「用差商把价格加速度塞进预测式」

物理里做一步预测很直白:知道位置、速度、加速度,下一刻坐标就能算。价格序列没连续导数,只能拿离散差商顶替一阶、二阶变化率。 取帕斯卡三角形对应行再交替变号,速度离散模拟是 1*open[0] -1*open[1],加速度离散模拟是 1*open[0] -2*open[1] +1*open[2]。把这两项叠到当前价格上,就得到不含自适应系数的朴素预测骨架。 引入可调比率 c1、c2 后,等式变为 open[-1] = open[0] + c1*(open[0] – open[1]) + c2*(open[0] – 2*open[1] + open[2]),展开归并得 open[-1] = (1 + c1 + c2)*open[0] + (-c1 – 2*c2)*open[1] + c2*open[2]。 稳定指标要求各比率落在 -1 到 +1 之间,解这组不等式会给出三组可行系数区间。在 MT5 里把 c1、c2 限在这范围内取值,指标外形才不会出现发散跳变。 提高差商阶数能多出几组可选比率,对外汇与贵金属这类高波动品种,阶数越高越要警惕过拟合——历史拟合好不代表下一根 K 线概率倾向相同。

◍ 自适应指标的边界与余地

把自适应逻辑塞进经典指标,确实让均线、CCI 这类老工具具备了随市况重设参数的能力。附件里 Adaptive_EMA.mq5 仅 2.41 KB,Adaptive_CCI.mq5 也不过 3.67 KB,说明这类改写并不需要庞杂框架,开 MT5 直接编译就能跑。 代价是控制参数变多,比如自适应窗口长度、平滑系数都要手动定,外汇和贵金属这种高杠杆、高波动品种上,调参没跑透就实盘,回撤可能远超静态指标。 这些 mq5 源码给了从 EMA、LWMA 到线性概率预测十来个范本,自己照着改一段周期判定,比纯读结论更有用。市场不会按模型走,工具只是把「当前形态」翻译得更跟手一点。

常见问题

把窗口内价格极差与均值之比作为比率输入,极差占比低于阈值时自动收窄窗口,避免平滑过度;实操可在回测里把阈值设在0.3~0.5之间观察曲线形变。
外汇贵金属高风险,P过大易在急拉急跌中过拟合噪声;建议P取2~3并配合差商加速度项做交叉验证,再上实盘。
小布可加载品种页内置的AIGC诊断,自动扫不同窗口与P参数下的曲线稳定性,把重复劳动交给小布,你专注决策。
差商依赖前两期收盘,存在固有滞后;可在MT4把计算迁移到含当前tick的缓冲区,或接受半根K代价换更稳的斜率。
在边界留5%~10%余量强制回到普通EMA,遇到跳空先不预测;这是原文给的容错余地,别把自适应当全能。