◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Indicators / Chandelier Exit
Volatility indicator

Chandelier Exit

An ATR-based trailing stop that hangs a fixed volatility distance below the highest high (or above the lowest low) and only ever ratchets in the trade's favor.

Illustrative diagram — not live market data.

What it is

The Chandelier Exit is a volatility-based trailing-stop method attributed to Chuck LeBeau and popularized in Alexander Elder's writing. The name describes the mechanism: the stop 'hangs' from the ceiling of the recent price range — for a long position, a multiple of the Average True Range (typically 3 × ATR) subtracted from the highest high of the lookback window (typically 22 bars); for a short position, the mirror image above the lowest low. The critical detail most explanations omit is the ratchet: the stop is only allowed to move in the trade's favor. Without that condition, a volatility spike or a new range would let the stop retreat, which defeats the purpose of trailing. It is important to be clear about what this tool is: a method for placing and moving an exit level, not an entry signal and not a source of edge. A stop method can control how a loss is taken; it cannot guarantee a profit or improve the odds of any individual trade. This is educational material only, not financial advice, and all trading carries risk of loss.

How it works

Three ingredients drive the calculation. First, ATR over the lookback (default 22 bars) measures recent typical bar-to-bar range, including gaps. Second, the extreme of the window: ta.highest(high, 22) for the long-side stop, ta.lowest(low, 22) for the short side. Third, the multiplier (default 3.0) sets how many ATRs of adverse movement are tolerated. The raw long stop each bar is highest-high minus 3 × ATR. The ratchet then compares this to the stop's own previous value: if the prior close was above the previous stop (the long context is intact), the stop becomes the maximum of the raw value and the previous stop — so it can rise or hold, never fall. If price closes below the stop, the ratchet resets and the short-side logic (lowest low + 3 × ATR, ratcheting downward) takes over. Because ATR adapts to volatility, the stop trails loosely in volatile conditions and tightens in quiet ones — by design, it gives a position more room exactly when bars are wider. Note what the level is not: it is derived purely from past highs, lows, and ranges. It knows nothing about where price will go, and a gap can trade straight through it, so the plotted line is a decision level, not a guaranteed fill price.

How traders read it

Common settings

The classic parameters are a 22-bar lookback (about one trading month on daily charts) for both the ATR and the highest-high/lowest-low window, with a multiplier of 3.0. Smaller multipliers (1.5-2.5) trail tighter, exiting sooner on both noise and genuine reversals; larger ones (3.5-4+) tolerate deeper pullbacks in exchange for giving back more when a move ends. Some implementations use close instead of high/low for the extreme, which produces a tighter line. There is no correct setting — the trade-off between exiting on noise and giving back open gains is unavoidable, only shiftable.

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("Chandelier Exit Example", overlay = true)

len  = input.int(22, "ATR / Lookback Length", minval = 1)
mult = input.float(3.0, "ATR Multiplier", minval = 0.1, step = 0.1)

atrDist = mult * ta.atr(len)

// Long stop: hangs below the highest high, ratchets up only
longStop = ta.highest(high, len) - atrDist
longStop := close[1] > nz(longStop[1], longStop) ? math.max(longStop, nz(longStop[1], longStop)) : longStop

// Short stop: hangs above the lowest low, ratchets down only
shortStop = ta.lowest(low, len) + atrDist
shortStop := close[1] < nz(shortStop[1], shortStop) ? math.min(shortStop, nz(shortStop[1], shortStop)) : shortStop

plot(longStop,  "Chandelier Long Stop",  color = color.teal)
plot(shortStop, "Chandelier Short Stop", color = color.maroon)

stopHitLong = ta.crossunder(close, longStop) and barstate.isconfirmed
plotshape(stopHitLong, "Long stop crossed", style = shape.xcross, location = location.belowbar, color = color.orange, size = size.tiny)

Pro tip: When auditing a Chandelier Exit script, watch the long-stop line through a volatility spike inside an uptrend: a correct implementation holds or rises (the ratchet), while a broken one dips as ATR expands. That single visual check catches the most common porting error. And treat the line as a pre-planned decision level, not a promise of execution — gaps trade through stops. Educational only, not financial advice; no exit method guarantees outcomes, and all trading involves risk of loss.

Built an indicator from this? Run it through the Validator to catch look-ahead bias and repainting, or convert a strategy to Pine Script.

Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro