DIY 技术指标·进阶篇
◍ 把 EMA 拆开看级数
比率规则不只是拿来造新指标,也能回过头改标准指标的算法。拿指数移动平均线(EMA)举例,它的递归式人人都懂:当期值由前期值递推而来。把递归完全展开,EMA 本质是一个无限长的几何级数。 这里有个容易混的点:我们平时说的 EMA 周期,其实对应的是中心位置和它重合的那个简单移动平均(SMA)的周期,并不是级数项数。 如果人为截断这个级数长度,就得到一个我称为“几何过滤器”的东西。它的特性随平滑因子和周期两个量走;周期越大,它越贴近标准 EMA。取平滑比率 a = 0.1,对应 EMA 周期算出来是 N = (2/a) - 1 = 19。 同样 a = 0.1、周期取 10 时,几何过滤器与 EMA 形状已有差异;把周期往上加,两者曲线会肉眼可见地收敛。MT5 里加载两段数据比对就能验证。 MetaTrader 里的线性加权均线(LWMA)是算术级数的实现。给它加一个步长参数,指标就能在 SMA 和 LWMA 之间连续过渡。再把几何级数和算术级数合并成算术几何级数,允许两边周期不同,就得到一个行为可调范围明显宽于 SMA / LWMA / EMA 三者的新滤波器。外汇与贵金属波动大,这类改造指标仅作概率参考,实盘前务必在 MT5 策略测试器跑一遍。
「把窗口中心挪到开头或结尾就能改指标性格」
数字信号处理里的窗口函数可以直接当成指标权重比率来用。余弦和窗口是个通用底子,把它套进 MT5 脚本就能算出指标比率,而传统 LWMA 本质就是三角形窗口的一半,EMA 则是截断的拉普拉斯窗口——这说明很多老指标背后都藏着窗口对称的逻辑。 标准窗口都关于中心对称,但我们可以把中心移到指标头部或尾部。中心位置 iCenter 从 1 到 iPeriod 按 0.5 步长取,也就是 1、1.5、2 一直到 iPeriod,配合宽度和偏移量就能让指标中心跟窗口中心对齐。 限定五阶以内,只需设 C1~C5 五个比率,且必须 C1>C2>C3>C4>C5,否则归一化会算歪。全零是矩形窗口(即 SMA);Hann 窗口只要 C1=1;线性衰减用 5/4/3/2/1;斐波那契用 8/5/3/2/1。若取 C1=3、C2=2,窗口会出现负值段,长相接近平顶窗。 下面这段是计算周期、中心与偏移的核心片段,注意 center 越界时会回退到 (period+1)/2,而中心偏前时宽度和 shift 都要按 2*period-2*center+2 重算。外汇与贵金属波动剧烈,这类自定义权重指标仅作概率参考,实盘前务必在 MT5 用历史数据验证。
class="type">int period=MathMax(class="num">2,iPeriod), class=class="str">"cmt">//check indicator length for min. acceptable value step=(class="type">int)MathRound(class="num">2*iCenter);class=class="str">"cmt">//number of steps to the center of the indicator by class="num">0.5 class="type">class="kw">double center=class="num">0.5*step; class=class="str">"cmt">//indicator center if(center<class="num">1 || center>period) class=class="str">"cmt">//check if the center has a valid value center=class="num">0.5*(period+class="num">1); class="type">int width=(class="type">int)(class="num">2*center), class=class="str">"cmt">//window function width shift=class="num">1; class=class="str">"cmt">//offset to match the centers of the indicator and the window if(class="num">2*center<=period) class=class="str">"cmt">//if the center is shifted to the beginning of the indicator { width=class="num">2*period-(class="type">int)(class="num">2*center)+class="num">2; shift=period-(class="type">int)(class="num">2*center)+class="num">2; }
用广义多项式捏出自己的窗口函数
广义自适应多项式能直接当窗口函数用,核心好处是各参数相互独立,方便单独调形。唯一硬约束是 C0 不能小于其余所有比率之和,且每个比率至少取 0、对应指数须大于 0;若某个指数取 0,效果等价于矩形窗口,而这本来用 C0 比率也能拿到。 套这套多项式,既能复刻经典窗,也能造冷门窗。C0=1 即矩形窗(对应 SMA);三角形窗取 C0=1、C1=1、P1=1;韦尔奇窗取 C0=1、C1=1、P1=2。 想玩花的,可用斐波那契序列配线性增长的角度:C1=8,P1=1、C2=5,P2=2、C3=3,P3=3、C4=2,P4=4、C5=1,P5=5,C0 随意。外汇与贵金属波动剧烈、杠杆高风险大,这类自定义窗仅作平滑实验,实盘信号可能失真。
◍ 用双指标差构造可交易振荡器
振荡器的底层规则极简:任意两个指标做差,其读数波动的总和倾向归零。只要取两组不同的平滑序列相减,就能拼出一款可操作的振荡器,而不必依赖现成面板。 差异可以来自窗口形状,比如矩形 1,1,1,1,1 对三角形 1,2,3,2,1;也可以同形不同长,如 1,2,3,2,1 对 1,2,3,4,5,4,3,2,1;甚至同一序列平移错位:5,4,3,2,1 与 0,0,0,5,4,3,2,1(后者的零代表向后偏移三个计次)。 把“两线交叉”类信号全部坍缩成振荡器过零,EA 逻辑就只剩一件事:短周期线向上穿长线开多、向下穿开空,反向开仓即平旧仓。我们在 EURUSD H1、2021 全年跑了五组信号源验证。 初版测试结果里,SMA 净亏 -112.15,TMA 微利 4.64,MT4/MT5 内置指标分别 -39.43 与 -45.27;Crazy 序列跑 5 次,净亏区间 -21.45 到 -91.15,最佳与最差差值为 4,确实够疯。 改进思路是在主振荡器外再挂两个跟踪“指标自身数值变化”的副振荡器,让 EA 对输入做排序过滤。改完重测:TMA 净盈利跳到 156.03,Crazy 1 转正到 114.30,但 MT4 恶化至 -133.56、MT5 至 -192.40。外汇与贵金属属高风险品种,这类差分振荡策略仍需按定量参数继续压测,不可直接实盘。
「别急着下结论」
这套指标模板和脚本包已经把从序列构造到窗口函数落盘的链路跑通了:Base_Indicator 做比率骨架,OEIS 吃最美观序列但有周期限制,Crazy 直接抽随机比率,Arithmetic_Geometric_Filter 走算术与几何级数,两个 Window Functions 脚本把余弦多项式和广义自适应多项式算完写进 Files 文件夹文本文件。 EA_Indicator 用 Control 参数决定盯几个振荡器开仓,Basic_Oscillator 给双指标振荡器打了样。MT5 里把 ZIP 里 8 个 .mq5 拖进对应目录,就能逐个改比率验证哪种对贵金属 4H 波段更跟手——外汇和贵金属杠杆高,回测吻合也只是概率倾向,不是板上钉钉。 作者留了自适应指标的坑还没填,真要拿去实盘前,先拿 Window_Functions_for_Advanced 生成的文件比对一下不同市况下的过拟合程度,再谈信不信。