← All ideas
#040ExitPosition

Chandelier: a trailing stop from the trade's extreme at a distance in ATR

A long's stop sits several ATR below the highest high since entry and follows price up. In high volatility it moves away, in low volatility it tightens. Richard Brennan exits trends this way; we set the parameters.

The Algorithmic Advantage · Richard Brennan · Watch video

Markets

Futures, Indices, Forex, Commodities, Bonds, Stocks

Timeframe

D1

Data

OHLC

Rules

Partly formalised

Difficulty

Easy

Status

Untested

Some rules were added by us and are marked in the text.

TradingView ports directly
EasyLanguage ports directly
MetaTrader 5 has pitfalls

Idea in brief

The chandelier exit is a trailing stop that hangs below the trade's high, like a chandelier from a ceiling. The distance is set not in points or percent, but in ATR. For a long, the stop equals the highest price since entry minus several ATR. When price makes a new high, the stop rises. When volatility grows, the stop moves away and gives price more room. When volatility falls, the stop tightens toward price.

Richard Brennan, a systematic trend follower and co-host of the channel, calls the chandelier their trailing technique. Brennan has about ten systems with different entries, and each cuts losses in its own way. The common idea: a small initial stop and a trail that lets profit run while the trend is alive and decides by itself when the trend is over.

Brennan names neither the ATR multiplier nor the window length. Brennan describes how to find them: on the whole portfolio of markets at once, at the boundary between market noise and the tails of the distribution. The name and the classic form of this exit are usually attributed to Chuck LeBeau, who is not mentioned in the video. Below is an exit block that plugs into any strategy, and an example on the turtle card.

Why it might work

Brennan starts from the shape of the return distribution. Most of the time the market fluctuates around equilibrium, and such moves resemble coin flips. Occasionally there are long directional moves; these are the fat tails. A trend follower makes money only on the tails. So the stop should sit where the noise ends: closer, and it will knock you out of future trends; farther, and it will give back too much on reversals.

A distance in ATR tracks this boundary automatically. In a nervous market the noise is wider, and the stop moves away. In a calm market the noise is narrower, and the stop tightens. The same multiplier works on different markets and in different years, so it can be chosen on a portfolio of dozens of instruments rather than on a single chart.

The author shows what to expect from such an exit. About 90% of trades end in small losses or small profits, and 5-10% produce big wins that pay for everything else. This is the author's description of their systems in general; there are no separate statistics for the exit.

Rules

Exit block (author's type, Finetiq parameters)

// calculated at the close of each bar, the new level applies from the next bar
ATRn = ATR(22)                                   // Finetiq: length 22, starting value
k    = 3                                          // Finetiq: multiplier, starting value

// on the entry bar
LongStop = EntryPrice - k * ATRn                 // author: initial volatility-based stop, this is 1R
R        = EntryPrice - LongStop

// on every following bar while the position is open
HighSince = highest High from the entry bar to the current bar     // Finetiq: anchored to the trade's high
Chand     = HighSince - k * ATRn
LongStop  = MAX(LongStop[1], Chand)             // reading 1: the stop only moves up

SELL STOP at LongStop                            // Finetiq: exit on touch

// reading 2: LongStop = Chand without MAX
// the author says the trail "breathes" in high volatility. Literally this means
// that the stop can move down when ATR rises. Test both readings

// short is mirrored
ShortStop = MIN(ShortStop[1], LowSince + k * ATRn)
BUY STOP at ShortStop

Execution variants

// close-based exit variant (Finetiq): the author does not specify touch or close
IF Close < LongStop THEN EXIT AT NEXT BAR OPEN

// anchor variant (Finetiq): from the high of the last 22 bars instead of the trade's high
Chand = Highest(High, 22) - k * ATRn

Calibration by the author's method

Brennan looks for the noise boundary on a large sample but does not name the metric for that boundary. Below is our formalization through MAE, the maximum adverse excursion.

// Finetiq: on the whole portfolio of markets at once, without tuning to an individual market
FOR each trade of the base strategy without trailing (time exit or signal exit)
    MAE_ATR = (EntryPrice - lowest Low during the trade) / ATRn at entry
// look at the MAE_ATR distribution for trades that eventually made more than 5R
k = the value that 90% of such trades stay within        // Finetiq: starting rule
// then test the neighborhood of k on the whole portfolio and choose a plateau, not a peak

Example: turtles with a chandelier exit

The turtle-4w-2w card: entry on a breakout of the 20-bar high, exit on a breakout of the 10-bar low. We change only the exit.

Entry20 = highest High of the last 20 closed bars     // from the turtle card

IF position = FLAT
    BUY STOP at Entry20
IF position = LONG
    SELL STOP at LongStop           // instead of SELL STOP at Exit10

// position size as in the turtle card: the same risk in money,
// distance to the stop = EntryPrice - (EntryPrice - k * ATRn) = k * ATRn
Contracts = floor(RiskMoney / (k * ATRn * PointValue))

Parameters

Parameter Value Source
Exit type trail from the extreme, adjusted for volatility author
Initial stop volatility-based, defines 1R author
Calibration on the whole portfolio, 70-100 markets author
ATR length 22 bars Finetiq
Multiplier k 3 Finetiq
Anchor highest price since entry Finetiq
Stop movement only in the direction of the trade Finetiq
Execution stop order on touch Finetiq
Timeframe D1 Finetiq
MAE calibration threshold 90% of trades above 5R Finetiq

What to test

  1. Parameter neighborhood on many markets. k = 2, 2.5, 3, 4, 5 and ATR 10, 22, 50 on 20-30 markets at once. Look at the median across markets and at the shape of the surface. The author chooses stops on a portfolio, not on a single chart, and this is the main protection against overfitting.
  2. Ratchet versus breathing. Reading 1 (the stop only tightens) versus reading 2 (the stop moves away when ATR rises). Compare the average loss on reversals and the number of trades knocked out before the trend continued.
  3. From the trade's high or from a window. Anchoring to the highest price since entry versus the high of the last 22 bars. On long trends the difference is small, on short trades it is noticeable.
  4. Touch versus close. A stop order versus an exit at the open after a close beyond the level. A close-based exit gets knocked out less often on noisy bars, but does worse on gaps.
  5. Versus a channel exit. Turtles with Exit10 versus turtles with the chandelier on the same portfolio. Compare not only the total, but also the share of trades above 10R and the contribution of the best 5% of trades. This is exactly how the author's positive skew thesis is tested.
  6. Compression before a spike. Select trades closed on the first wide bar after a period of low volatility. If there are many, the stop tightens too much in the calm phase, and a minimum distance is needed.
  7. Gaps. Count losses larger than 1R caused by gaps through the stop. On stocks with earnings reports and on CFDs after weekends they happen more often than on futures.

Platform notes

TradingView (Pine Script)

  • ta.atr uses Wilder smoothing. In EasyLanguage and MQL5 the built-in ATR is a simple average of TR, so stop levels will differ between the three platforms. Choose one formula and calculate it the same way everywhere.
  • Set the stop as a price: strategy.exit("CH", "L", stop = longStop), recalculating the level on every bar. The trail_points and trail_offset parameters are set in ticks and keep a fixed distance; they do not account for ATR.
  • The highest price since entry is easier to accumulate yourself: a var float hh variable that equals high on the entry bar and math.max(hh, high) afterwards. Entry bar: strategy.opentrades.entry_bar_index(0).
  • The ratchet is also manual: longStop := math.max(nz(longStop[1]), hh - k * atr), reset when the position closes.

MultiCharts and TradeStation (EasyLanguage)

  • AvgTrueRange(22) is a simple average. For Wilder smoothing: ATRw = ATRw[1] + (TrueRange - ATRw[1]) / 22.
  • Exit as a price: Sell next bar at LongStop stop. The order lives one bar and is sent on every bar while the position is open.
  • Highest price since entry: Highest(High, BarsSinceEntry + 1). On the entry bar BarsSinceEntry = 0, so the window is one bar.
  • SetDollarTrailing measures the distance in money from the maximum open profit. That is a different exit, and it does not account for ATR.

MetaTrader 5 (MQL5)

  • iATR is also a simple average of TR. To match Pine, calculate the Wilder version yourself.
  • The trail is done by modifying the position's SL on a new bar (CTrade::PositionModify). Take the level from the closed bar (index 1), otherwise the stop will move within the bar, both in the tester and live.
  • Bars are built on Bid. A long's SL triggers on Bid, a short's SL on Ask. At the broker's day rollover the spread widens, and a short gets stopped out by the spread even though the chart price never touched the stop.
  • Daily bars follow server time. Short Sunday bars understate ATR and pull the stop closer than on exchange data.

Where the idea can break

  • The author gave no parameters and no separate statistics for the exit. The author's figures (90% noise, big wins of about 100R) refer to an ensemble of ten systems on 70-100 markets. On a single market the positive skew may not show up.
  • "The boundary between the normal distribution and the tails" is not a formula. Our MAE calibration is only one way to approximate it.
  • In a sideways market an ATR trail produces many small losses in a row. For a trend system this is normal, but the streak can be long.
  • A stop order does not protect against a gap: the loss at an open beyond the stop can be several times larger than 1R.
  • In a calm phase the stop tightens toward price right before a volatility spike. The first wide bar can close the trade just before the move.
  • The author trades CFDs with long holding periods, from months to years. Swaps and overnight financing charges noticeably change the result and are not visible in a test on clean prices.

Sources

Author's claims

These figures and statements are the author's. We have not verified them.

  • The author has about 10 trend systems with different entries. All of them cut losses and let profits run, but each does it in its own way.
  • In the author's trade distribution, about 90% are small losses and noise, and 5-10% are big wins. Individual trends in the author's tests last two to three years and bring about 100R against a typical loss of 1R.
  • The author chooses where to place stops and the trail on the whole portfolio at once, 70-100 markets, to get a large sample of trades.

Related ideas

Updated: 2026-09-10