5.8 KiB
ZLDEMA: Zero-Lag Double Exponential Moving Average
ZLDEMA combines the speed of zero-lag prediction with the smoothness of double exponential averaging. You get faster response than ZLEMA, with better trend-following than DEMA.
| Property | Value |
|---|---|
| Category | Trend (IIR MA) |
| Inputs | Source (close) |
| Parameters | period |
| Outputs | Single series (Zldema) |
| Output range | Tracks input |
| Warmup | Math.Max(lag + 1, EstimateWarmupPeriod(beta)) bars |
| PineScript | zldema.pine |
| Signature | zldema_signature |
- ZLDEMA takes a standard DEMA and feeds it a zero-lag signal: current price minus a lagged price.
- Similar: ZLEMA, DEMA | Complementary: Signal line crossovers | Trading note: Zero-Lag DEMA; combines zero-lag with double-exponential.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
DEMA with lag compensation via a zero-lag signal
ZLDEMA takes a standard DEMA and feeds it a zero-lag signal: current price minus a lagged price. This produces a smoother that responds faster than DEMA without going fully raw. The dual EMA cascade provides additional noise rejection while the zero-lag preprocessing maintains responsiveness.
Historical Context
ZLDEMA extends the zero-lag concept from ZLEMA to double exponential moving averages. Where ZLEMA applies lag compensation to a single EMA, ZLDEMA applies it to a two-stage EMA cascade using the DEMA formula (2*EMA1 - EMA2). This combination targets the middle ground between ZLEMA's speed and TEMA's smoothness.
Architecture & Physics
Pipeline
- Lag estimate
\text{lag} = \max(1, \text{round}((N-1)/2))
- Zero-lag signal
s_t = 2 \cdot x_t - x_{t-\text{lag}}
- First EMA stage
\text{EMA1}_t = \text{EMA}(s_t, \alpha)
- Second EMA stage
\text{EMA2}_t = \text{EMA}(\text{EMA1}_t, \alpha)
- DEMA output
\text{ZLDEMA}_t = 2 \cdot \text{EMA1}_t - \text{EMA2}_t
Warmup compensation
ZLDEMA uses EMA bias compensation during warmup on both EMA stages:
y_t^{*} = \frac{y_t}{1 - (1 - \alpha)^t}
This avoids the early-stage bias toward zero and makes the first values usable.
Math Foundation
EMA update:
y_t = y_{t-1} + \alpha (s_t - y_{t-1})
Zero-lag signal:
s_t = 2 \cdot x_t - x_{t-\text{lag}}
DEMA formula:
\text{DEMA}_t = 2 \cdot \text{EMA1}_t - \text{EMA2}_t
Alpha from period:
\alpha = \frac{2}{N + 1}
Performance Profile
Operation Count (Streaming Mode, Scalar)
Hot path (after warmup, compensation complete):
| Operation | Count | Cost (cycles) | Subtotal |
|---|---|---|---|
| FMA | 4 | 4 | 16 |
| MUL | 2 | 3 | 6 |
| Total | 6 | ~22 cycles |
The hot path consists of:
- Zero-lag signal:
FMA(2.0, val, -lagged)- 1 FMA - EMA1 core:
FMA(ema1Raw, beta, alpha * signal)- 1 FMA + 1 MUL - EMA2 core:
FMA(ema2Raw, beta, alpha * ema1)- 1 FMA + 1 MUL - DEMA output:
FMA(2.0, ema1, -ema2)- 1 FMA
Warmup path (with bias compensation):
| Operation | Count | Cost (cycles) | Subtotal |
|---|---|---|---|
| FMA | 4 | 4 | 16 |
| MUL | 4 | 3 | 12 |
| DIV | 1 | 15 | 15 |
| CMP | 2 | 1 | 2 |
| Total | 11 | ~45 cycles |
Additional warmup operations:
- Decay tracking:
e *= beta- 1 MUL - Compensator calc:
1 / (1 - e)- 1 DIV - Bias compensation:
ema1Raw * compensator,ema2Raw * compensator- 2 MUL - Hot/compensated checks - 2 CMP
Batch Mode (SIMD Analysis)
ZLDEMA is an IIR filter with lag buffer dependency - not directly vectorizable across bars. However, within-bar operations use FMA intrinsics.
| Optimization | Benefit |
|---|---|
| FMA instructions | ~22 cycles vs ~28 scalar |
| stackalloc buffer | Zero heap allocation for lag ≤256 |
Quality Metrics
| Metric | Score | Notes |
|---|---|---|
| Accuracy | 8/10 | Matches PineScript reference |
| Timeliness | 9/10 | Faster response than DEMA, comparable to ZLEMA |
| Overshoot | 5/10 | Predictive signal plus DEMA amplification causes overshoot |
| Smoothness | 7/10 | Smoother than ZLEMA due to dual EMA cascade |
Validation
ZLDEMA is validated against a PineScript reference implementation.
| Library | Status | Tolerance | Notes |
|---|---|---|---|
| TA-Lib | N/A | - | No ZLDEMA in TA-Lib |
| Skender | N/A | - | No ZLDEMA in Skender |
| Tulip | N/A | - | No ZLDEMA in Tulip |
| Ooples | N/A | - | No ZLDEMA in Ooples |
| PineScript | ✓ Passed | 1e-10 | Matches lib/trends_IIR/zldema/zldema.pine |
Common Pitfalls
-
Increased overshoot on turns
The zero-lag signal is a forward estimate, and the DEMA formula (2*EMA1 - EMA2) further amplifies deviations. Expect more overshoot than ZLEMA when price reverses sharply.
-
Period semantics
ZLDEMA uses EMA alpha; the lag term is derived from period but not equivalent to a window length. Do not compare ZLDEMA period directly to SMA window length.
-
Warmup discipline
Use
IsHot/WarmupPeriodbefore acting on signals. Early values are bias-corrected but still unstable. The dual EMA cascade requires longer warmup than single-stage ZLEMA. -
Non-finite data
NaN or Infinity is replaced with the last valid value. Before the first valid sample, output is
NaN. -
DEMA vs ZLDEMA
ZLDEMA is not simply DEMA with a different alpha. The zero-lag preprocessing fundamentally changes the input signal, making ZLDEMA more responsive but also more prone to overshoot than standard DEMA.