ZLEMA Indicator: Formula, Settings and How to Read It

ZLEMA (zero-lag exponential moving average) is a price overlay that smooths an adjusted close series rather than the close itself. Each adjusted value adds the change measured between the current close and a close taken roughly half a period earlier, and an exponential average of length N is then run over that series.

Senzoukria · Indicators · Updated September 2026


ZLEMA ships with the Senzoukria desktop app, in the Averages & volatility group of the indicator catalogue. It is drawn on the price chart.

What ZLEMA measures

The line is an exponential average of an adjusted series, not of price. The adjustment is adj[i] = 2 × close[i] − close[i − lag], with lag = floor((N − 1) / 2), which is 9 bars at the default period of 20. Written the other way round, adj[i] = close[i] + (close[i] − close[i − lag]): the move of the last lag bars is added once more on top of the current close. When price is flat over that span the two closes are equal and the adjusted value collapses back to the close; when price is rising the adjusted value sits above it, and below it when price is falling. Because the smoothing runs over this inflated series, the plotted line can sit outside the current bar's range during a fast directional move. The adjusted series does not exist before bar index lag, and the exponential average is seeded with a simple average over N values, so the first plotted point is at index lag + N − 1 — index 28 with the default period. Earlier bars carry null, not zero.

The formula, as implemented

This is not a description of how the indicator is usually defined elsewhere — it is what the shipped code computes, documented next to the implementation:

ZLEMA — Zero-Lag EMA (Ehlers & Way, 2010) : lag = floor((N−1)/2) (convention usuelle « zero-lag ») adj[i] = 2·close[i] − close[i−lag] (dé-laggage par extrapolation) ZLEMA = EMA_N(adj) adj indéfini avant l'indice `lag`, EMA graine SMA ensuite → premier point à lag + N − 1, null avant. Défaut N=20 (lag = 9).

How to read it

  • Read direction first: the line rises when recent adjusted values sit above the average's previous level, and because the adjusted series already carries the last lag bars of movement, that turn arrives earlier than in an exponential average of the close over the same N.
  • Treat a close crossing the line as a change of state in the smoothed series, not as an entry. On a chart with orderflow context, check what the crossing bar actually traded — volume at price, which side was the aggressor — before acting on the cross.
  • When price and the line stay wrapped around each other, the two closes feeding the adjustment are close to equal, so the de-lagging term contributes almost nothing and the line behaves like an ordinary average of price.
  • A wide, persistent gap between price and the line marks the size of the recent move, not a target. It closes either by price retracing or by price going sideways while the average catches up.
  • One line gives you direction and distance and nothing else. If you want a relationship to read, plot a second period alongside it and compare the two horizons instead of interpreting a single line's slope in isolation.

Parameters and defaults

Period (default 20, integer, 1 to 500) sets both the smoothing length and the lookback of the adjustment, since lag is derived from it as floor((N − 1) / 2) — 9 bars at the default. Short periods shrink both terms at once: the average smooths less and the extrapolation reaches back over fewer bars, so the line stays close to price and changes direction often. Long periods smooth more, but they also extrapolate over a longer stretch, which makes the overshoot larger when a move reverses. At N = 1 the lag is 0 and the adjustment cancels out, leaving the close itself. Color (default #26c6da) is cosmetic and only affects how the overlay reads against your chart theme.

ZLEMA — parameters exposed in the app, with the values it ships with.
ParameterTypeDefaultRange
Periodnumber201 – 500

What it does not show

ZLEMA reduces lag, it does not remove it, and the only input it removes lag from is the close — it sees nothing of the bid × ask split, the aggressor side, or the resting liquidity shown by the footprint and the heatmap. The extrapolation term is also its main weakness: after a sustained move reverses, close[i] − close[i − lag] keeps pointing the old way for up to lag bars, so the same term that makes the line responsive in a trend pushes it past price at the turn. Nothing is plotted for the first lag + N − 1 bars, which is 28 bars at the default period, so a freshly loaded or thinly populated chart can legitimately show no line at all. On illiquid symbols or sparse sessions, where a single print moves the close, doubling that close amplifies the print instead of filtering it. Market data comes from your provider and is billed by them, separately from the subscription; the indicator can only smooth the bars that data produces.

Using it in Senzoukria

Add it from the Indicators panel of any footprint chart or candle chart. It runs on futures data from Rithmic or Databento and on crypto pairs from Binance and Bybit, on the same engine — the calculation does not change with the venue, only the data feeding it does. Market data subscriptions are billed by the provider, separately from the app.

  • SMAAverages & volatility
  • EMAAverages & volatility
  • WMAAverages & volatility
  • Hull MAAverages & volatility
  • ATR (Wilder)Averages & volatility
  • BollingerAverages & volatility

See the full indicator library, or start with the order flow guide if you are new to reading aggression, delta and absorption.

Frequently asked questions

How does ZLEMA differ from a normal EMA?
A normal EMA smooths the close directly, so it always trails it. ZLEMA smooths adj[i] = 2 × close[i] − close[i − lag] instead, with lag = floor((N − 1) / 2), which means the input already leans in the direction of the last lag bars before any smoothing is applied. For the same period, the line therefore reacts to a move sooner, and overshoots further once that move reverses.
How many bars does ZLEMA need before it plots anything?
The adjusted series only exists from bar index lag onward, where lag = floor((N − 1) / 2), and the exponential average is seeded with a simple average over N values. The first plotted point is at index lag + N − 1 — index 28 with the default period of 20, since lag is 9 there. Every bar before that returns null, which the chart leaves empty rather than drawing at zero.
Which period should I set?
The setting takes whole numbers from 1 to 500 and defaults to 20, which pairs a 20-bar average with a 9-bar lookback for the adjustment. Raising it delays the first plotted point and widens the overshoot after reversals; lowering it brings the line onto price and increases how often it changes direction. Choose it from the timeframe and the instrument you actually trade, and check what the line does on a reversal at that setting before relying on it.

Keep reading