Keltner Channels Explained
Keltner Channels are volatility envelopes drawn above and below an EMA using ATR (not standard deviation). The middle line is a 20-period EMA; the outer bands are set at 2× ATR(10). Because ATR smooths volatility more than standard deviation, Keltners are less twitchy than Bollinger Bands in choppy markets — making them better suited for trend-following setups.
How they're built
Middle = 20-period EMA of typical price
Upper = Middle + (2 × ATR(10))
Lower = Middle − (2 × ATR(10))
Compare to Bollinger Bands, which use 20-period SMA and 2× standard deviation. The key differences:
| Feature | Keltner | Bollinger |
|---|---|---|
| Middle line | EMA (reactive) | SMA (smoother) |
| Band width | ATR (smoother) | Std dev (reactive) |
| Best use | Trend-following | Mean reversion |
| Chop behavior | Stable | Volatile |
How to use Keltner Channels
Trend-following. When price closes outside the upper Keltner band, momentum is strong bullish. Closes outside the lower band signal strong bearish momentum. Unlike band touches on Bollinger (which often signal reversal), Keltner band breaks more often signal continuation.
Squeeze. When Bollinger Bands contract inside the Keltner Channels, volatility is compressed — a breakout is statistically likely. This is the John Carter "TTM Squeeze" setup. When BBs re-expand beyond Keltners, the squeeze releases in whichever direction price breaks.
Trailing stop. The opposite Keltner band (lower band for longs, upper for shorts) makes a solid trailing stop — it adapts to volatility via ATR.
Keltner Channels in Pine Script (v6)
//@version=6
indicator("Keltner Channels + Alerts", overlay=true)
length = input.int(20, "EMA Length")
atrLength = input.int(10, "ATR Length")
mult = input.float(2.0, "ATR Multiplier")
basis = ta.ema(close, length)
range = ta.atr(atrLength)
upper = basis + mult * range
lower = basis - mult * range
plot(basis, color=color.orange, linewidth=2, title="Basis EMA")
p1 = plot(upper, color=color.blue, title="Upper")
p2 = plot(lower, color=color.blue, title="Lower")
fill(p1, p2, color=color.new(color.blue, 95))
if ta.crossover(close, upper)
alert("Keltner bullish breakout on " + syminfo.ticker, alert.freq_once_per_bar_close)
if ta.crossunder(close, lower)
alert("Keltner bearish breakout on " + syminfo.ticker, alert.freq_once_per_bar_close)
Common mistakes
- Confusing Keltner with Bollinger setups. Fading Keltner breakouts is a trap — they're continuation signals, not reversal. Fade Bollinger tags; follow Keltner breaks.
- Over-tuning periods. The 20 EMA / 10 ATR / 2× default works. Avoid the temptation to optimize.
- Ignoring the squeeze. When BBs contract inside Keltners, volatility compression is real. Pay attention.
Frequently Asked Questions
Keltner Channels vs Bollinger Bands — which is better?
Neither is strictly better — they answer different questions. Keltner is smoother (ATR-based), better for trend-following and continuation signals. Bollinger is more reactive (standard-deviation-based), better for mean reversion and squeeze detection. Many traders use both layered.
What's a Keltner squeeze?
When Bollinger Bands contract inside the Keltner Channels, volatility is unusually compressed. Historically, such periods precede large directional moves in either direction. Wait for BBs to expand back outside the Keltners for a breakout signal.
Can I use Keltner Channels for exits?
Yes — the opposite Keltner band makes a solid trailing stop. For longs, trail the lower band. It adapts to volatility via ATR and widens in volatile conditions to avoid premature stop-outs.