📈
William Blau 指标系统:动量、TSI、Ergodic 与 MQL5 实现
William BlauTSIErgodic
William Blau 指标系统的背景
William Blau 提出用“双重指数平滑(double smoothing)”处理价格的变化量,而非直接平滑价格本身,从而得到对动量更敏感、噪声更低的指标。其中最有名的是 TSI(True Strength Index,真实强弱指数),以及 Ergodic 系列(把双平滑思路套用到 Tick Volume、RSI、MACD 等)。核心思想一致:先取价格变化 d,再对 d 做两次 EMA 平滑,滤掉短期噪声、保留趋势方向。
TSI 的计算步骤与公式
标准 TSI 分四步,设第一次平滑周期为 r(典型 25),第二次为 s(典型 13):
- 1) 价格变化 d[i] = close[i] − close[i−1]。
- 2) 对 d 做第一次 EMA 平滑:ema1 = EMA(d, r)。
- 3) 对 ema1 做第二次 EMA 平滑:ema2 = EMA(ema1, s)。
- 4) 对 |d| 同样做两次 EMA 平滑得分母 den = EMA(EMA(|d|, r), s)。
- 5) TSI = ema2 / den × 100。
MQL5 实现:双平滑函数
可用 iMA 句柄取 EMA,但更干净的是写一个 double-smoothing 函数,内部用 EMA 递推(只需前一值),避免多次 CopyBuffer:
// 双平滑:先对序列做 EMA(r),再对结果做 EMA(s)
double DoubleSmooth(double value, double &state1[], double &state2[], int r, int s, int bar)
{
// state1 存第一次平滑结果,state2 存第二次
double a1 = 2.0/(r+1);
state1[bar] = a1*value + (1-a1)*state1[bar-1];
double a2 = 2.0/(s+1);
state2[bar] = a2*state1[bar] + (1-a2)*state2[bar-1];
return state2[bar];
}
// OnCalculate 中
double d = close[bar] - close[bar-1];
double num = DoubleSmooth(d, s1, s2, R, S, bar);
double den = DoubleSmooth(MathAbs(d), s1a, s2a, R, S, bar);
TSI[bar] = (den!=0) ? num/den*100 : 0;
Ergodic 系列与信号解读
Ergodic 指标(如 Ergodic Tick Volume Index、Ergodic RSI)只是把“双平滑”套到不同输入上:对 TVI 输入用 tick volume 的变化,对 Ergodic RSI 输入用 RSI 的变化,算法骨架完全一样。TSI 本身的信号:上穿 0 线看多、下穿 0 线看空;与一条信号线(TSI 再做一次短 EMA,如 7 或 25)交叉产生买卖点;TSI 与价格出现背离预示趋势衰竭。
参数与优缺点
✦ 怎么用最稳
典型参数 r=25、s=13、信号线 7~25。优点:双平滑把随机噪声压得很低,TSI 在 0 附近震荡、穿越干净,比单平滑 RSI 更平滑、更少假信号;能同时反映动量与方向。缺点:本质是滞后指标,双平滑让它比价格慢两拍,拐点处会慢半拍;参数(尤其两次平滑周期)需针对品种/周期优化,过长则过于迟钝。
常见问题
RSI 直接对价格变化做平滑后算相对强弱;TSI 先取价格变化 d,再对 d 做两次 EMA 平滑再相除。双平滑让 TSI 噪声更低、在 0 轴附近震荡更对称,穿越信号比 RSI 更干净,但代价是更滞后。
因为 TSI 衡量的是“动量相对于动量自身波动的强度”。分母用 |d| 的双平滑,相当于把动量标准化:当市场波动大时分母也大,TSI 不会被大波动撑爆;波动小时分母小,小动量也能灵敏反映。这样 TSI 在不同波动环境下都落在可比的 −100~+100 区间。
短信号线(如 7)对转折更敏感但假信号多,长信号线(如 25)更稳但更慢。常见做法是用 7 做短线、25 做波段确认。实战建议先用 25/13/7 这组经典参数回测,再按你的交易周期微调第二次平滑 s 与信号线。