DEMA 指标:公式、参数与读法
DEMA(双指数移动平均,Double Exponential Moving Average,Patrick Mulloy,1994 年)是一条平滑的价格线,由两条指数均线组合而成,用来抵消单条 EMA 的部分滞后。计算方式为:收盘价 EMA 的两倍,减去对第一条 EMA 再做一次 EMA 的结果;绘制在价格图上。
Senzoukria · 指标 · Updated September 2026
DEMA — 均线与波动率, 叠加在价格图上.
DEMA 测量的是什么
两个阶段都采用目录中的 EMA:以前 N 个样本的简单平均作为初值,之后按平滑系数 2 / (N + 1) 更新。第二阶段只在第一阶段已有定义的部分上运行,因此第一条 EMA 仍在预热时不会凭空生成任何数值。周期为 N 时,结果从 K 线索引 2 x (N - 1) 开始才有值,是普通 EMA 预热期的两倍。如果上游阶段在自身起点之后出现缺口,实现会拒绝插值,直接不返回任何结果,而不是基于损坏的输入画出一条线。
公式:代码中的实现
这不是别处常见的定义,而是所发布代码实际计算的内容,记录在实现旁边:
EMA_N appliquée au SUFFIXE défini d'une série à préfixe null (sortie d'un étage EMA/lissage précédent — suffixe contigu par construction). Permet EMA(EMA(x)) sans inventer de valeur pendant le warm-up de l'étage amont. Défensif : un null APRÈS le début du suffixe (étage amont incohérent) → tout null, on ne trace rien de faux. */ function emaOverSuffix( values: ReadonlyArray<number | null>, period: number, ): Array<number | null> { const out: Array<number | null> = new Array(values.length).fill(null); let start = 0; while (start < values.length && values[start] === null) start++; if (start >= values.length) return out; const defined: number[] = []; for (let i = start; i < values.length; i++) { const v = values[i]; if (v === null) return out; // suffixe non contigu → dégradation totale defined.push(v); } const e = emaSeries(defined, period); for (let j = 0; j < e.length; j++) out[start + j] = e[j]; return out; } /** Moindres carrés y = a + b·t sur la fenêtre de n valeurs se terminant à l'indice i (t = 0 pour la plus ancienne, t = n−1 pour la courante). Sommes fermées : Σt = n(n−1)/2, Σt² = n(n−1)(2n−1)/6. n = 1 → b = 0. */ function linFit( values: readonly number[], i: number, n: number, ): { a: number; b: number } { const sumT = (n * (n - 1)) / 2; const sumT2 = (n * (n - 1) * (2 * n - 1)) / 6; let sumY = 0; let sumTY = 0; for (let t = 0; t < n; t++) { const y = values[i - n + 1 + t]; sumY += y; sumTY += t * y; } const denom = n * sumT2 - sumT * sumT; // > 0 dès n ≥ 2 const b = denom > 0 ? (n * sumTY - sumT * sumY) / denom : 0; const a = (sumY - b * sumT) / n; return { a, b }; } function periodOf( params: Record<string, unknown>, key: string, fallback: number, floor = 1, ): number { return Math.max(floor, Math.floor(numParam(params, key, fallback))); } // ── Défs ──────────────────────────────────────────────────────────────────── /** DEMA (Patrick Mulloy, 1994) : DEMA_N = 2·EMA_N(close) − EMA_N(EMA_N(close)) EMA du catalogue : graine = SMA des N premiers échantillons, α = 2/(N+1) (parité TradingView/ATAS). Le double étage compense le lag de l'EMA simple. Défini à partir de l'indice 2(N−1) — null avant. Défaut N=20.
如何解读
- 与同周期的 EMA 相比,这条线会更早拐头;价格急速反转时,它的冲过头幅度也更大。
- 用原值减去一份“平滑后的平滑值”,会让这条线短暂跑出近期收盘价的范围;这是构造方式本身的特性,不是异常。
- 这里真正有用的是斜率变化。价格穿越一条本身已在外推的线,噪音反而更大。
- 把同周期的 DEMA 和 EMA 并排显示:两者间距随当前行情的力度扩大,在平静阶段收窄。
- 周期较短时,双重结构会放大最新数据,线条会频繁改变方向。
参数与默认值
周期默认 20,与目录中 EMA 的默认值相同,取值范围 1 到 500。周期短,滞后补偿更激进,线条更跳;周期长,稳定性恢复,但会失去这种构造本来追求的灵敏度。提高周期还会让第一个绘制点向右推移,推移距离是单条 EMA 的两倍。
| 参数 | 类型 | 默认值 | 取值范围 |
|---|---|---|---|
| Period | number | 20 | 1 – 500 |
它无法显示的内容
滞后的减少是以冲过头为代价的:一段快速行情停下后,DEMA 可能在产生它的收盘价之外,再沿旧方向延续一两根 K 线。它唯一的输入是收盘价,成交量中买价、卖价两侧的任何信息都不会进入计算。它还需要一段较长且不间断的历史才会开始输出,这在刚加载的图表上,或该合约可用历史深度受数据提供商限制时,影响尤为明显。
相关指标
其他语言版本
Frequently asked questions
- DEMA 和双重平滑移动平均有什么区别?
- 对价格做两次 EMA 只会让线更慢,而不是更快。DEMA 取第一条 EMA 的两倍再减去第二条,双重平滑在这里是修正项,而不是额外的过滤。结果是它比同周期的单条 EMA 反应更早。
- 为什么图表开头的 DEMA 是空白的?
- 每个指数阶段都需要各自的预热,第二阶段只能从第一阶段有定义的位置开始。默认周期为 20 时,第一个绘制值落在 K 线索引 38,在此之前不做任何估算。
- DEMA 会高于近期最高收盘价吗?
- 会,这是预期中的行为。由于是从第一条 EMA 的两倍中减去第二条 EMA,结果是一种外推,而不是窗口内的加权平均,因此不受参与计算的收盘价范围约束。