The Average Daily Range (ADR) is a powerful technical indicator used to measure market volatility by analyzing the average difference between an asset’s highest and lowest prices over a defined period. Traders and analysts use ADR to identify periods of heightened price movement, spot potential entry and exit points, and compare volatility across different assets. In this comprehensive guide, we’ll explore how ADR works, how to calculate it manually and programmatically in Python, its limitations, and how to enhance it for broader analytical use.
Understanding the Average Daily Range (ADR)
At its core, the ADR reflects the average intraday price range — the difference between the daily high and low — over a specified number of trading periods. Like a moving average, it smooths out short-term fluctuations to reveal underlying volatility trends.
ADR is particularly useful in:
- Identifying unusually volatile trading days
- Screening high-momentum stocks or cryptocurrencies
- Setting realistic profit targets and stop-loss levels
- Comparing current price action against historical norms
A common lookback period is 20 days, which incorporates the most recent 19 trading sessions plus the current day. However, traders can adjust this window based on their strategy and timeframe.
👉 Discover how volatility metrics like ADR can improve your trading decisions.
How to Calculate the Average Daily Range
The formula for ADR is straightforward:
ADR = (Sum of Daily Ranges) / Number of Periods
Where:
- Daily Range = High Price – Low Price for each period
- The number of periods defines the lookback window (e.g., 10, 20, or 30 days)
Step-by-Step Calculation
- Choose a lookback interval (e.g., 5 days)
- For each day, compute the daily range:
High – Low - Sum all daily ranges over the interval
- Divide the total by the number of periods
For example:
| Day | High | Low | Daily Range |
|---|---|---|---|
| 1 | 5 | 3 | 2 |
| 2 | 7 | 4 | 3 |
| 3 | 9 | 6 | 3 |
| 4 | 7 | 3 | 4 |
| 5 | 8 | 4 | 4 |
Total Daily Range = 2 + 3 + 3 + 4 + 4 = 16
ADR = 16 ÷ 5 = 3.2
This means, on average, the asset moved 3.2 units per day during this period.
Implementing ADR in Python
Modern traders rely on automation. Using Python with libraries like pandas and yfinance, we can efficiently calculate ADR from real market data.
Basic ADR Function
# Sample price data as list of dictionaries
prices = [
{"high": 5, "low": 3},
{"high": 7, "low": 4},
{"high": 9, "low": 6},
{"high": 7, "low": 3},
{"high": 8, "low": 4}
]
# One-liner ADR calculation
adr = sum(day["high"] - day["low"] for day in prices) / len(prices)
print(adr) # Output: 3.2Applying ADR to Real Financial Data
Let’s fetch Ethereum (ETH-USD) price data from Yahoo Finance and compute its ADR:
import yfinance as yf
import pandas as pd
# Fetch 6 months of daily ETH data
eth_data = yf.Ticker("ETH-USD").history(period="6mo")[["High", "Low"]]
# Step 1: Calculate daily range
eth_data['daily_range'] = eth_data['High'] - eth_data['Low']
# Step 2: Compute 20-day ADR using rolling average
eth_data['adr'] = eth_data['daily_range'].rolling(window=20).mean()
# View last few rows
print(eth_data.tail())After execution, you’ll see a new column adr showing the evolving average daily dollar movement. Note that the first 19 values will be NaN due to insufficient data for the rolling calculation.
Modified ADR: Normalizing for Price Differences
One major limitation of standard ADR is that it's not comparable across assets with different price levels. A $200 daily move in Ethereum doesn't mean the same thing as a $5 move in a $10 stock.
To solve this, we use a Modified ADR expressed as a percentage of daily price movement:
Modified ADR (%) = Average of [(High / Low) – 1] × 100
Why Use Percentage-Based ADR?
- Enables fair comparison between high-priced and low-priced assets
- Reveals relative volatility independent of absolute price
- Ideal for building stock screeners or portfolio-level analysis
Python Implementation
# Calculate percentage-based daily range
eth_data['dr_pct'] = 100 * (eth_data['High'] / eth_data['Low'] - 1)
# Compute modified ADR over 20-day window
eth_data['mod_adr'] = eth_data['dr_pct'].rolling(window=20).mean()
print(eth_data[['dr_pct', 'mod_adr']].tail())Now, if ETH shows a modified ADR of 5.48%, it means prices typically swing about 5.5% per day on average — a far more interpretable metric than raw dollar figures.
👉 See how advanced traders use normalized volatility indicators to find hidden opportunities.
ADR vs. Average True Range (ATR)
While both measure volatility, ADR and ATR differ significantly:
| Feature | Average Daily Range (ADR) | Average True Range (ATR) |
|---|---|---|
| Data Used | High – Low of current period | Considers gaps between sessions |
| Gap Sensitivity | ❌ Ignores overnight gaps | ✅ Includes previous close |
| Use Case | Intraday volatility analysis | Broader volatility assessment |
ATR accounts for:
- Today’s high vs. yesterday’s close
- Today’s low vs. yesterday’s close
- Today’s high vs. today’s low
This makes ATR more robust for swing trading and position sizing.
Practical Applications of ADR
Traders use ADR in several strategic ways:
- Setting Stop-Loss Levels: Place stops beyond typical daily noise to avoid premature exits.
- Profit Targeting: If average range is $10, aiming for $2 might be too conservative.
- Breakout Confirmation: Prices moving beyond 1.5x ADR may signal strong momentum.
- Volatility Contraction/Expansion: Declining ADR often precedes sharp moves.
Limitations of the ADR Indicator
Despite its usefulness, ADR has key drawbacks:
- Does not account for price gaps between sessions
- Can lag during sudden market shocks
- Raw dollar values aren’t comparable across assets without modification
- Best used alongside other indicators like RSI or MACD
Frequently Asked Questions (FAQ)
Q: Can I use ADR for crypto trading?
A: Absolutely. Cryptocurrencies often exhibit high intraday volatility, making ADR especially valuable for identifying breakout conditions and managing risk.
Q: What’s a good lookback period for ADR?
A: The 20-day period is standard, but short-term traders may prefer 10 days, while long-term investors might use 30 or more.
Q: How does ADR help in setting stop-loss orders?
A: By understanding average daily movement, you can place stops outside normal volatility zones — for example, setting a stop below the low minus the ADR value.
Q: Is a higher ADR always better?
A: Not necessarily. High ADR indicates volatility, which brings opportunity but also risk. Stable assets with moderate ADR may suit conservative strategies.
Q: Can I automate ADR alerts in my trading system?
A: Yes. Using Python or platforms like TradingView, you can set alerts when price exceeds a multiple of the ADR (e.g., >2x), signaling potential breakouts.
Q: Should I use standard or modified ADR?
A: Use modified ADR (%) when comparing multiple assets or building screeners. Use standard ADR ($) when analyzing absolute price movements for a single asset.
👉 Start applying ADR insights with real-time market data and advanced charting tools.
Final Thoughts
The Average Daily Range (ADR) is a simple yet effective tool for assessing market volatility. Whether you're scanning for breakout candidates, refining entry timing, or normalizing comparisons across diverse assets with modified ADR, this indicator adds valuable context to technical analysis.
When combined with complementary tools like Bollinger Bands, RSI, or MACD, ADR becomes part of a robust framework for informed decision-making. While it doesn’t predict direction, it quantifies the “temperature” of the market — helping traders stay aligned with prevailing momentum and avoid being whipsawed by normal price noise.
As financial markets grow increasingly data-driven, mastering indicators like ADR through programming and statistical analysis gives modern traders a distinct edge — turning raw price data into actionable intelligence.
Core Keywords: Average Daily Range, volatility indicator, technical analysis, Python trading, modified ADR, market volatility, trading strategy