Forex Volatility Heatmap: ATR Across 28+ Pairs
The Forex Volatility Heatmap ranks 28+ currency pairs by Average True Range (ATR). It computes a 14-period Wilder-smoothed ATR per pair, converts it to pips, then normalizes every pair to a 0–100 relative score: score = round((pairATR − minATR) ÷ (maxATR − minATR) × 100). A z-score flags unusual readings.
- Default ATR period is 14 bars, switchable to 5, 20, or 50; calculation uses Wilder's smoothing (first ATR = simple average of the first N true ranges, then ATR = (prevATR × (N−1) + TR) ÷ N).
- The 0–100 volatility score is relative, not absolute: it ranks each pair against the highest and lowest ATR (in pips) in the currently displayed set, so the calmest pair scores near 0 and the wildest near 100.
- Color bands map score to risk: 0–15 Low (teal), 15–35 Below Avg, 35–55 Average, 55–75 Above Avg, 75–90 High, 90–100 Extreme (dark red).
- A z-score compares the current ATR to its own recent history; z > 2.0 flags a pair as 'Unusually Volatile' and z < −1.0 flags it as 'Calming Down'.
- Data auto-refreshes every 5 minutes; the built-in position-sizing table assumes 1% account risk, a stop of 1.5× ATR, and a $10 pip value per standard lot.
—
Position Sizing (1% risk, 1.5× ATR stop)
Pair Comparison
What is a forex volatility heatmap?
A forex volatility heatmap is a grid that shows, at a glance, which currency pairs are moving the most right now. Each cell represents one pair, colored by how volatile it is relative to the others on screen. This tool measures volatility with Average True Range (ATR) — the average size of each day's price range — across 28+ majors, minors, and exotics.
Volatility is not direction. A high score means a pair has a wide daily range, not that it is going up or down. Traders use the heatmap to match instruments to strategy: breakout and trend traders favor high-ATR pairs, while range and scalping strategies often prefer calmer ones. The map also exposes pairs that are unusually active versus their own recent norm, which is where the z-score column matters.
The grid is sortable by filter (All, Majors, Minors, Exotics) and can display three values per cell: ATR in pips, ATR as a percentage of price, or the volatility z-score.
How do you use the volatility heatmap?
- Pick a pair group. Use the Filter buttons — All, Majors, Minors, or Exotics — to set which pairs appear. Scores are recomputed for whatever set is shown.
- Choose an ATR period. The default is 14. Shorter periods (5) react faster to recent moves; longer periods (20, 50) smooth out noise.
- Choose a display mode. 'Pips' shows raw ATR in pips, '% Price' shows ATR ÷ price as a percentage, and 'Z-Score' shows how far the current ATR sits from its recent average.
- Read the color and score. Each cell shows the value, a 0–100 score, and a band label (Low through Extreme).
- Click a pair to open the detail panel: ATR in pips, daily range, % of price, z-score, a volatility trend chart, and a position-sizing table.
The four side panels surface the Top 10 most volatile, Bottom 10 least volatile, any pairs flagged Unusually Volatile (z > 2.0), and pairs Calming Down (z < −1.0). Data refreshes automatically every 5 minutes, and a manual refresh button is available.
How is the volatility score calculated?
The engine runs four steps for every pair.
- True Range. Because the data source provides daily closes, the tool estimates each bar's high and low by extending the open–close range by 1.8× the average day-to-day price change. True Range is then the standard max of (high − low), |high − prevClose|, and |low − prevClose|.
- ATR with Wilder smoothing. The first ATR is the simple average of the first N true ranges (N = the selected period, default 14). Each subsequent bar updates it:
ATR = (prevATR × (N − 1) + TR) ÷ N. ATR is then converted to pips using the pair's pip size. - Relative score. Across the displayed pairs, the tool finds the highest and lowest ATR in pips and scales each pair linearly:
score = round((pairATR − minATR) ÷ (maxATR − minATR) × 100). The calmest pair scores 0, the wildest scores 100. - Z-score. The current ATR is compared to its own ATR history using a population standard deviation:
z = (currentATR − mean) ÷ stdDev. This is what flags 'Unusually Volatile' (z > 2.0) and 'Calming Down' (z < −1.0).
Because the high/low values are reconstructed from closing prices, ATR readings are estimates intended for relative comparison, not exact intraday ranges from a tick feed.
What do the color bands and z-score mean?
The 0–100 score maps to six color bands. Score is relative — it ranks a pair against the others currently shown, so the same pair can change band when you switch filters or ATR period.
| Score | Band | Color |
|---|---|---|
| 0–15 | Low | Teal |
| 15–35 | Below Avg | Green |
| 35–55 | Average | Yellow |
| 55–75 | Above Avg | Orange |
| 75–90 | High | Red |
| 90–100 | Extreme | Dark red |
The z-score is independent of the band color. It answers a different question: is this pair more or less volatile than its own recent self? A reading of +2.5σ means today's ATR is two and a half standard deviations above its average — a volatility spike, even if the pair is normally calm. A reading of −1.2σ means volatility is contracting.
How does the built-in position sizing work?
Open any pair's detail panel to see a position-sizing table titled '1% risk, 1.5× ATR stop'. It assumes you risk 1% of the account and place your stop at 1.5 times the pair's ATR (in pips). It uses a fixed pip value of $10 per standard lot.
The lot size for each account row is: lots = (account × 0.01) ÷ (ATRpips × 1.5 × 10). The table runs five account sizes: $1,000, $5,000, $10,000, $25,000, and $50,000. Because a wider ATR means a wider stop, more volatile pairs return smaller lot sizes for the same dollar risk — which is the point: it keeps risk constant as volatility changes.
Worked example: scoring and sizing EUR/USD
Suppose the displayed set produces a 14-period ATR of 70 pips for EUR/USD. The calmest pair in the set has an ATR of 30 pips and the wildest has 130 pips.
Score: score = round((70 − 30) ÷ (130 − 30) × 100) = round(40 ÷ 100 × 100) = 40. A score of 40 falls in the 35–55 band, so EUR/USD shows as Average (yellow).
Position sizing at 1% risk with a 1.5× ATR stop. Stop = 70 × 1.5 = 105 pips. Pip value = $10 per standard lot.
| Account | 1% Risk | Lots (1.5× ATR stop) |
|---|---|---|
| $1,000 | $10 | 10 ÷ (105 × 10) = 0.010 |
| $5,000 | $50 | 50 ÷ 1,050 = 0.048 |
| $10,000 | $100 | 100 ÷ 1,050 = 0.095 |
| $25,000 | $250 | 250 ÷ 1,050 = 0.238 |
| $50,000 | $500 | 500 ÷ 1,050 = 0.476 |
If EUR/USD's ATR rose to 100 pips, the stop would widen to 150 pips and the $10,000 lot size would shrink to 100 ÷ 1,500 = 0.067 lots — smaller position, same 1% risk.
Volatility is not direction
Volatility measures how much a pair moves, not which way it moves. A pair can post a wide daily range while going nowhere (large swings, no net progress) or grind steadily in one direction on small daily ranges. This heatmap scores movement magnitude only — a high score never tells you whether to buy or sell.
That distinction matters when choosing tools. To answer 'how much?' use this volatility heatmap; to answer 'which way?' pair it with a directional tool such as a currency strength meter or a trend indicator. A price/currency heatmap colors cells green or red by price change (direction), whereas this map colors them by ATR (magnitude) — the same pair can read calm here while showing a strong directional move elsewhere.
Why volatility changes how you size a position
A fixed pip stop means very different things on different pairs. Put a 50-pip stop on a pair whose ATR is about 60 pips and your stop sits less than one ATR from entry — well inside the pair's normal daily noise, so routine fluctuation can hit it. Put that same 50-pip stop on a pair whose ATR is around 150 pips and it is only about a third of one ATR — far too tight for how that pair actually moves.
Sizing your stop as a multiple of ATR (the tool's table uses 1.5x) fixes this: the stop scales with each pair's real behavior, and the lot size adjusts so the dollar risk stays the same.
- Higher-volatility pairs need wider stops, which produces a smaller position for the same risk.
- Lower-volatility pairs allow tighter stops and a larger position for the same risk.
- The result is consistent risk per trade regardless of which pair you trade.
Reading the volatility cycle
Volatility tends to cycle between compression (quiet, narrow ranges) and expansion (active, wide ranges), and the two phases trade places over time — a quiet pair will not stay quiet forever, and a violently active one usually settles back down.
The z-score column is what locates a pair within its own cycle, because it compares the current ATR to that pair's recent ATR history rather than to other pairs. A high positive z-score (the tool flags z > 2.0 as 'Unusually Volatile') marks an unusually active reading that often eases back toward the pair's average. A low z-score (the tool flags z < -1.0 as 'Calming Down') marks compression — quiet conditions that frequently precede a larger move once the range expands again. Note these are tendencies in how ranges behave, not signals that guarantee a breakout or a reversion.
Matching pairs to a trading style
Different strategies need different amounts of movement. Because this tool's score is relative to whatever set is on screen, treat the groupings below as typical tendencies rather than fixed labels — confirm against the live readings before you act.
| Style | Volatility profile | Pairs that often fit |
|---|---|---|
| Breakout / scalping | Higher ATR — needs room to reach targets quickly, but demands wider stops and tight risk control | GBP/JPY, GBP/NZD, EUR/NZD |
| Trend following / swing | Moderate ATR — trends cleanly without excessive noise | EUR/USD, AUD/USD, USD/CAD |
| Range trading / learning | Lower ATR — tends to respect support and resistance with fewer false breaks | EUR/CHF, EUR/GBP, AUD/NZD |
Exotic pairs (for example USD/TRY or USD/ZAR) usually sit at the top of the range because they carry lower liquidity, wider spreads, and stronger sensitivity to local economic and political news — more opportunity, but more risk and slippage.
Volatility around news events
Scheduled releases — non-farm payrolls, central bank rate decisions, CPI and GDP prints — can compress a large move into a few minutes, and the resulting intraday range often dwarfs the pair's normal daily ATR. Spreads widen, fills slip, and price can whipsaw in both directions before settling.
Because ATR here is a daily, smoothed measure, a fresh spike shows up gradually rather than instantly; the z-score and the 'Unusually Volatile' panel are the faster signals that a pair is running hot versus its own recent norm. Around major releases, treat extreme readings as a caution flag for execution quality, not just an opportunity.
Realized volatility vs implied volatility
This heatmap measures realized volatility — what price actually did, derived from historical ranges. Implied volatility is different: it is the market's expectation of future movement, read from options pricing, and it is not shown here.
The two together tell a story. When implied volatility sits well above realized, the market is pricing in an anticipated event or shock that has not yet happened. When realized runs above implied, the move that occurred was larger than the market had expected. Comparing them is a way to gauge whether a quiet or wild reading is likely to persist — though that comparison requires an options-derived implied figure from another source.
Frequently Asked Questions
-
The default ATR period is 14 bars. You can switch it to 5, 20, or 50 using the ATR Period buttons. The calculation uses Wilder's smoothing: the first ATR is the simple average of the first N true ranges, then each new bar updates it as (previous ATR × (N − 1) + true range) ÷ N.
-
It is relative. The 0–100 score ranks each pair only against the highest and lowest ATR (in pips) among the pairs currently displayed: score = round((pairATR − minATR) ÷ (maxATR − minATR) × 100). The calmest pair scores near 0 and the wildest near 100, so the same pair's score can shift when you change the filter or ATR period.
-
The z-score compares a pair's current ATR to its own recent ATR history using a population standard deviation: z = (current ATR − mean) ÷ standard deviation. It measures how unusual today's volatility is for that specific pair. Readings above +2.0σ flag it as 'Unusually Volatile' and readings below −1.0σ flag it as 'Calming Down'.
-
The tool estimates each bar's high and low from daily closes by extending the open-to-close range by 1.8 times the average daily price change, then computes True Range and ATR from that. The result is a consistent estimate designed for ranking pairs against each other, not an exact intraday range from a tick-level feed.
-
It assumes 1% account risk, a stop at 1.5× the pair's ATR in pips, and a $10 pip value per standard lot. Lot size = (account × 0.01) ÷ (ATR pips × 1.5 × 10). More volatile pairs produce a wider stop and therefore a smaller lot for the same dollar risk, keeping risk constant across pairs.
-
The heatmap refreshes automatically every 5 minutes, shown by the countdown timer that starts at 5:00. You can also force an immediate update with the refresh button. Changing the ATR period or display mode recomputes instantly from already-loaded data without a new fetch.

