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

Choppiness Index

A 0-100 gauge of whether a market has been trending or chopping sideways — it describes the character of price movement, not its direction.

Illustrative diagram — not live market data.

What it is

The Choppiness Index (CHOP) is an indicator developed in the early 1990s by Australian commodities trader E.W. Dreiss (often referred to as Bill Dreiss). It is bounded between 0 and 100 and is designed to describe how a market has been moving rather than where it is heading. Higher readings are typically read as a sideways, "choppy" or consolidating market, while lower readings are read as a more directional, trending market. Importantly, the Choppiness Index is non-directional: it says nothing about whether price is going up or down, only about the character of the movement. It is a descriptive, lagging measure based on past prices and is not predictive. Nothing it shows is a signal to act on, and trading always carries a risk of loss.

How it works

CHOP compares how much ground price has actually covered over a lookback window against the net range of that window. The formula is: 100 × log10( Sum of one-bar true ranges over n bars / (Highest High over n − Lowest Low over n) ) / log10(n). The numerator inside the log — the running sum of one-bar true ranges — captures the total path length the price travelled bar by bar. The denominator — the highest high minus the lowest low — captures the net range of the window. When price travels a long, winding path but ends up inside a narrow range, the ratio is large and CHOP reads high (choppy). When price travels in a straighter, more efficient line, the path length is closer to the net range, the ratio is smaller and CHOP reads low (trending). The log10(n) term normalises the result so it stays on a roughly 0-100 scale regardless of the chosen period. The default period is 14.

How traders read it

Common settings

Default period is 14. Some traders use shorter periods (e.g. 8-10) for faster, noisier readings or longer periods (e.g. 20-28) for smoother, slower ones. The 38.2 and 61.8 reference lines are the standard Fibonacci-based levels; a few traders simplify to 40 and 60. These are conventions, not settings that make the tool more "correct".

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("Choppiness Index", overlay = false)

length = input.int(14, "Length", minval = 2)

// Sum of one-bar true ranges over the window (the path length)
atrSum = math.sum(ta.tr(true), length)

// Net range of the window
rangeHL = ta.highest(high, length) - ta.lowest(low, length)

// Guard against a zero range (perfectly flat window)
chop = rangeHL > 0 ? 100 * math.log(atrSum / rangeHL) / math.log(length) : na

plot(chop, "CHOP", color = color.new(color.teal, 0))
hline(61.8, "Choppy (>61.8)", color = color.gray, linestyle = hline.style_dashed)
hline(38.2, "Trending (<38.2)", color = color.gray, linestyle = hline.style_dashed)

Pro tip: Because the Choppiness Index is deliberately non-directional, traders tend to treat it as a context filter rather than a standalone tool: it is often paired with a separate directional indicator so that one component describes how cleanly price has been moving and the other describes which way. Remember the index only summarises past bars — it does not forecast, and nothing here is advice to buy or sell.

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