A volatility-based envelope built around a moving average using the Average True Range.
Keltner Channels are a volatility-based indicator that draws three lines on a price chart: a center line (typically an Exponential Moving Average of price) and an upper and lower band placed a multiple of the Average True Range (ATR) above and below that center line. The bands widen when volatility rises and narrow when it falls, creating an envelope that adapts to current market conditions. The original concept dates to Chester Keltner in the 1960s, which used the high-low range around a moving average of typical price. The modern ATR-based version most charting platforms use today was popularized by Linda Bradford Raschke. This guide is educational only and is not buy or sell advice.
First, a moving average of price is calculated for the center line, commonly a 20-period EMA. Separately, the Average True Range measures how much price typically moves over a chosen lookback (often 10 or 20 periods); ATR is based on the true range, which includes gaps, so it reflects real volatility rather than just close-to-close changes. The upper band is the center line plus a multiplier (commonly 2) times ATR, and the lower band is the center line minus the same amount. Because the band distance is tied to ATR, the channel automatically expands during turbulent periods and contracts during quiet ones. No indicator predicts future prices; Keltner Channels simply describe where price sits relative to a volatility-scaled range.
A common default is a 20-period EMA for the center line with bands set 2 x ATR away. The ATR lookback is often 10 (as in Linda Raschke's version) or matched to the EMA at 20. Shorter lengths or smaller multipliers make the channel tighter and more reactive; longer lengths or larger multipliers make it smoother and wider. Settings are usually matched to a timeframe and reviewed rather than assumed, and no setting guarantees any particular result.
//@version=6
indicator("Keltner Channels", overlay = true)
emaLen = input.int(20, "EMA Length")
atrLen = input.int(10, "ATR Length")
mult = input.float(2.0, "ATR Multiplier")
basis = ta.ema(close, emaLen)
rng = ta.atr(atrLen)
upper = basis + mult * rng
lower = basis - mult * rng
plot(basis, "Basis", color.orange)
plot(upper, "Upper", color.teal)
plot(lower, "Lower", color.teal)Pro tip: Because Keltner uses ATR while Bollinger Bands use standard deviation, some traders overlay both: periods where the narrower Bollinger Bands sit entirely inside the Keltner Channel are often described as a volatility squeeze. Treat this as a volatility observation, not a trade signal, and confirm with other context — no indicator is predictive and all trading carries risk of loss.
Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.