What is the Choppiness Index (CI)?
The Choppiness Index (CI) is a technical indicator developed by Bill Williams, though often attributed to E.W. Dreiss. It measures whether a market is trending or ranging (choppy). The CI is designed to quantify the "choppiness" or "trendiness" of price action, based on fractal geometry. It oscillates between 0 and 100. High CI values indicate a choppy, non-trending market (sideways consolidation), while low CI values indicate a strong, trending market (directional movement).
In Pine Script, CI is a valuable tool for traders to decide which type of trading strategy to employ: trend-following strategies during low CI periods, and range-bound or breakout strategies during high CI periods. It essentially helps determine the market environment.
Components and Calculation
The calculation of the Choppiness Index is based on the summation of True Ranges and the highest high and lowest low over a specified period. The formula involves logarithmic functions to normalize the output between 0 and 100.
- True Range (TR): `max(high - low, abs(high - close[1]), abs(low - close[1]))`
- Sum of True Ranges (ATR): Sum of TR over `length` periods. `sum(tr, length)`
- Highest High (HH): Highest price over `length` periods. `ta.highest(high, length)`
- Lowest Low (LL): Lowest price over `length` periods. `ta.lowest(low, length)`
- Choppiness Index Formula:
`CI = 100 * log10(sum(tr, length) / (ta.highest(high, length) - ta.lowest(low, length))) / log10(length)`
(There are slight variations in how CI is calculated, but this is the common form. Pine Script's built-in function handles the specifics.)
A common `length` for the Choppiness Index is 14 periods. The indicator is generally interpreted with thresholds around 61.8 (upper bound for choppiness) and 38.2 (lower bound for trending).
Basic Choppiness Index (CI) Implementation in Pine Script
Pine Script v5 provides a convenient built-in function `ta.ci()` for calculating the Choppiness Index.
//@version=5
indicator("My Choppiness Index", overlay=false, format=format.percent) // overlay=false to plot in a separate pane
// Input for CI length
length = input.int(14, title="CI Length", minval=1)
// Calculate Choppiness Index using the built-in function
ciValue = ta.ci(length)
// Plot the CI line
plot(ciValue, title="Choppiness Index", color=color.new(color.blue, 0), linewidth=2)
// Plot standard reference levels
hline(61.8, "Choppy Zone (61.8)", color=color.new(color.red, 0), linestyle=hline.style_dashed)
hline(38.2, "Trending Zone (38.2)", color=color.new(color.green, 0), linestyle=hline.style_dashed)
// Highlight background zones for visual clarity
bgcolor(ciValue > 61.8 ? color.new(color.red, 90) : na, title="Highly Choppy")
bgcolor(ciValue < 38.2 ? color.new(color.green, 90) : na, title="Highly Trending")
Practical CI Trading Strategies
1. Identifying Market Environment (Primary Use)
The fundamental use of the Choppiness Index is to determine whether the market is currently trending or ranging, which helps dictate the appropriate trading strategy.
- High CI (above 61.8): The market is choppy, consolidating, or trading sideways. Trend-following strategies are likely to fail. Consider range-bound strategies (buy low, sell high within a range) or avoid trading directional moves.
- Low CI (below 38.2): The market is trending strongly. Trend-following strategies (e.g., breakout strategies, moving average crossovers) are likely to be effective.
//@version=5
strategy("CI Market Environment Strategy", overlay=true)
length = input.int(14, title="CI Length", minval=1)
choppyThreshold = input.float(61.8, title="Choppy Threshold")
trendingThreshold = input.float(38.2, title="Trending Threshold")
ciValue = ta.ci(length)
plot(ciValue, "CI", color.blue, display=display.pane_only)
hline(choppyThreshold, "Choppy Line", color.red, linestyle=hline.style_dashed, display=display.pane_only)
hline(trendingThreshold, "Trending Line", color.green, linestyle=hline.style_dashed, display=display.pane_only)
// Define market states based on CI
isChoppy = ciValue > choppyThreshold
isTrending = ciValue < trendingThreshold
isTransitioning = not isChoppy and not isTrending
// Example strategy based on market environment
// You would combine this with actual entry/exit logic suitable for each environment.
// For illustration, we'll just show entry signals.
// If trending, attempt a simple MA crossover strategy
maLength = input.int(20, title="MA Length for Trend", minval=1)
maValue = ta.sma(close, maLength)
if (isTrending)
if (close > maValue and close[1] <= maValue[1]) // Simple bullish MA crossover during trending
strategy.entry("TrendLong", strategy.long)
if (close < maValue and close[1] >= maValue[1]) // Simple bearish MA crossover during trending
strategy.entry("TrendShort", strategy.short)
// If choppy, maybe look for range-bound entries (e.g., at support/resistance levels)
// This part is conceptual as it requires defining support/resistance.
if (isChoppy)
// strategy.entry("RangeBuy", strategy.long, when=isAtSupportAndRanging)
// strategy.entry("RangeSell", strategy.short, when=isAtResistanceAndRanging)
// For now, let's just close trending trades if market becomes choppy
strategy.close("TrendLong", when=isChoppy)
strategy.close("TrendShort", when=isChoppy)
2. Anticipating Trend Initiation (from high CI)
A significant drop in CI from high levels (e.g., above 61.8) to low levels (below 38.2) can signal the initiation of a new trend, or the end of a long consolidation phase.
- Breakout Signal: CI moves from a prolonged period above 61.8 (choppy) and then crosses below 38.2 (trending). This suggests a strong directional move is starting.
//@version=5
strategy("CI Trend Initiation Strategy", overlay=true)
length = input.int(14, title="CI Length", minval=1)
choppyThreshold = input.float(61.8, title="Choppy Threshold")
trendingThreshold = input.float(38.2, title="Trending Threshold")
ciValue = ta.ci(length)
plot(ciValue, "CI", color.blue, display=display.pane_only)
hline(choppyThreshold, "Choppy Line", color.red, linestyle=hline.style_dashed, display=display.pane_only)
hline(trendingThreshold, "Trending Line", color.new(color.green, 0), linestyle=hline.style_dashed, display=display.pane_only)
// Detect transition from choppy to trending
fromChoppyToTrending = ciValue < trendingThreshold and ciValue[1] > choppyThreshold
plotshape(fromChoppyToTrending, title="Trend Initiating", location=location.belowbar, color=color.new(color.purple, 0), style=shape.diamond, size=size.small)
alertcondition(fromChoppyToTrending, "CI Trend Initiation", "Choppiness Index indicating start of a new trend.")
// Example: Enter long if market starts trending up after being choppy
// Needs a directional filter on price
if (fromChoppyToTrending)
if (close > open) // Simple bullish candle confirmation
strategy.entry("BreakoutLong", strategy.long)
else if (close < open) // Simple bearish candle confirmation
strategy.entry("BreakoutShort", strategy.short)
Optimizing Choppiness Index Performance
To get the most from the Choppiness Index in Pine Script:
- Parameter Tuning: The default `length` of 14 is widely used. Shorter lengths will make the CI more sensitive to short-term fluctuations, potentially leading to more frequent shifts between "choppy" and "trending" states. Longer lengths will smooth the indicator, making it slower to react but providing a more reliable long-term view of market environment.
- Adjust Thresholds: The 61.8 and 38.2 levels are based on Fibonacci ratios, but you can adjust them (e.g., 60/40 or 70/30) based on the specific asset's behavior and your trading style. Some assets are inherently choppier than others.
- Combine with Directional Indicators: The CI tells you *if* the market is trending, but not *which way*. Always combine it with a directional indicator (e.g., moving averages, MACD, ADX) to determine the trend's direction.
- Confirm with Price Action: Use CI to confirm the market environment. If CI drops significantly, look for price action confirming a strong directional move (e.g., strong breakout candles, consistent higher highs/lower lows).
- Volume Analysis: Strong trends (low CI) are often accompanied by sustained high volume. Consolidation (high CI) might see declining or erratic volume. Integrating volume analysis can provide additional conviction.
Common Choppiness Index Pitfalls
- Lag: Like many indicators, CI has some inherent lag due to its calculation over a period. It will not identify the exact start or end of a trend instantly.
- False Signals: Even though it's designed to filter, CI can still give false signals, especially in complex market environments or if thresholds are not well-tuned.
- Interpretation in Transition Zones: When CI is between the "choppy" and "trending" thresholds, the market is in a transition phase, and signals might be ambiguous.
- Not a Directional Indicator: The most common mistake is to interpret CI as a directional signal. It strictly quantifies choppiness, not bullishness or bearishness.
- Over-Optimization: Excessive tuning of the `length` or thresholds can lead to overfitting and poor performance in live trading.
Conclusion
The Choppiness Index (CI) is a valuable and often underutilized technical indicator in Pine Script for TradingView. Its primary strength lies in its ability to quantify the degree of trending versus ranging behavior in the market, allowing traders to adapt their strategies to the prevailing market environment. By understanding its calculation, thoughtfully tuning its parameters and thresholds, and integrating it strategically with directional indicators and price action analysis, you can leverage the CI to make more informed decisions about when to pursue trend-following opportunities and when to exercise caution or switch to range-bound approaches. It acts as an excellent "market filter" for a robust trading system.
Enhance Your Trading
Get a high-performance Pine Script analysis tool for actionable market insights, designed for traders on the move.
This strategy runs in live mode on TradingView, helping you identify potential opportunities.
Subscribe now @ $99/month