Scored by math — not marketing Live dashboard Instagram X
TrailingStop Loss
Home / Education / Volume Z-Score Readout: Free TradingView Indicator

Volume Z-Score Readout: Free TradingView Indicator

volume z score

Volume z-score is one of those concepts that's mathematically simple but maddeningly hard to find in a usable TradingView indicator. The premise: how unusual is the current bar's volume, expressed as a standard-deviation count against a meaningful baseline? Most "z-score volume" scripts on TradingView solve this by computing z against a rolling 50-bar window, which sounds reasonable until you realize a rolling window doesn't know that 9:30 AM is always busier than noon. A 3× spike against the last 50 bars is meaningless if those 50 bars span the lunch lull. A 0.5× reading at the open isn't quiet — that's just the open.

Volume Z-Score Readout solves this by comparing the current bar's volume against the same time of day across the trailing 21 sessions (default). The "9:45 AM bar" gets compared to all the other 9:45 AM bars from the past month. A z-score of -3.0 at noon is genuinely meaningful — it's saying the market is unusually quiet for noon, not just quiet relative to a random rolling window. The output is one small box on the chart, in plain English: z=-3.0 · unusually quiet.

The indicator is built around three trader-friendly presets that turn the technical settings into plain-English choices. Pick "Swing trader" for the baseline length, "Auto-detect (24h)" for the market type, "Balanced" for the alert sensitivity — those are the defaults — and you're done. No timeframe lookup tables, no σ-band guessing.

Try it free

Volume Z-Score Readout is published as open-source Pine Script v6 on TradingView. Free forever, no signup, no paid tier. Source code visible on the script page.

View on TradingView →

What you see on the chart

One small overlay box, sitting in a corner of your choice. The text and color shift through four bands based on how unusual the current bar is:

z=-0.5 · normal for this time
z=+1.4 · busier than usual
z=+2.6 · unusual for this time
z=+3.8 · extreme for this time
z=-3.0 · unusually quiet

The verdict is direction-aware. Positive z-scores read "busier"; negative read "quieter." A z of -2.1 isn't ambiguous — it specifically means the current bar is unusually quiet for this minute of the day. That distinction matters because volume silence is often as meaningful as a spike: distribution days often start with eerily-quiet bars; major reversals frequently begin with conviction drying up rather than aggressive selling.

How the math works

The calculation is intentionally simple. For each bar, the script collects the volume at the same time-of-day from the trailing N sessions (where N is set by your Trader style preset), then computes:

z = (current_volume − mean) / standard_deviation

That's it. A z of 0 means perfectly average for this minute. A z of +1 means one standard deviation above. A z of +3 means three standard deviations above — extreme by any reasonable statistical measure (roughly the 99.7th percentile in a normal distribution).

The reason this is more useful than a rolling-window z-score: intraday volume isn't normally distributed when measured against a rolling window. It's heteroscedastic — the variance changes systematically throughout the session. The opening 30 minutes have huge variance; the lunch lull has tiny variance. A z computed against rolling history blends those incompatible distributions and produces noise. Comparing 9:45 AM bars to other 9:45 AM bars keeps the math clean.

The three presets that handle most setup

Rather than make you pick numeric thresholds and consult a bars-per-session lookup table, the indicator exposes three preset dropdowns that translate the math into plain-English choices. The defaults work out of the box for a 15m NQ chart — most users won't change anything.

1. Trader style — controls baseline responsiveness

How many past sessions feed the time-of-day mean and standard deviation.

Day trader (responsive)
14 sessions. Adapts fast after volatility regime shifts. More noise and more alerts. Best for tight intraday work where you want the baseline to track recent conditions closely.
Swing trader (balanced)
21 sessions, roughly one calendar month of trading. Best statistical balance for most users on 15m charts. Stable enough that band crossings carry weight; responsive enough to adapt within a quarter.
Position trader (very stable)
42 sessions, about two months. Very stable, very slow to adapt. Best when you want band crossings to be rare and meaningful — false signals get filtered out at the cost of slower adaptation to vol regime changes.
Custom
Falls through to the numeric "Sessions to average" input below the preset. Use this if you want to dial in a specific value between 5 and 60.

2. Market preset — auto-computes bars-per-session

Picks the right "bars per session" stride for the math based on your market type and current chart timeframe. No more manual lookup tables.

Auto-detect (24h)
Assumes a 24-hour session. Correct for crypto, forex (24/5 is close enough), and most always-on markets. Use this as the default if you're unsure.
Futures (~23h)
Tuned for the futures session length (NQ, ES, MNQ, MES, CL, MCL, GC, MGC, YM, RTY all use this). Slightly more accurate than Auto-detect because the futures session has the daily 1-hour close.
US stocks RTH (6.5h)
For stocks trading during regular hours only (9:30 AM to 4:00 PM ET). Use this for AAPL, MSFT, SPY, and any equity where pre-market and post-market sessions should be ignored.
Custom
Falls through to the numeric "Bars per session" input below the preset. For exotic markets, half-day Fridays, or any case where you want to override the math directly.

3. Sensitivity — controls how often the alert fires

Sets the |z| threshold that triggers the "Unusual volume" alert. Doesn't affect the readout display itself — only the alert.

Conservative
Fires at |z| ≥ 2.5. On a 15m chart, roughly one alert per week per symbol. Use this for low-noise monitoring of multiple symbols.
Balanced
Fires at |z| ≥ 2.0. Catches notable → unusual transitions — the most actionable threshold for 15m intraday work. The default for a reason.
Sensitive
Fires at |z| ≥ 1.5. Many more alerts; turns the indicator into a busier-than-usual monitor. Use only if you actively want notification on the more frequent threshold.
Custom
Falls through to the numeric "Alert threshold" input below the preset.

About the "Custom" escape hatches: Pine Script can't truly hide inputs based on other input values. So the "Sessions to average," "Bars per session," and "Alert threshold" numeric inputs always appear in the settings panel — they just have "(only if Custom)" appended to their labels. The script ignores them unless the related preset is set to Custom. Leave them alone for the default case.

Default behavior: 15m NQ with zero configuration

Drop the indicator on a 15m NQ chart with the default settings and it works immediately. Here's what the defaults give you:

SettingDefaultEffect
Trader styleSwing trader21-session baseline (~one month)
Market presetAuto-detect (24h)Auto-computes 96 bars/session at 15m
SensitivityBalancedAlert fires at |z| ≥ 2.0
Readout positionTop rightSits above price action in the corner
Text sizeNormalReadable without zoom
Show label cellOffCompact single pill, no "Time-of-day" prefix

The auto-detect 24h preset is slightly conservative for NQ (the real futures session is ~23h, not 24h), but the difference is only one bar per session — close enough that the math works fine. If you want it perfect, switch to the "Futures (~23h)" preset; the change is small but exact.

The four sigma bands explained

The verdict text and color map directly to standard-deviation thresholds. Understanding these helps calibrate your expectations for how often each band should fire.

BandColorVerdict (positive z)Verdict (negative z)Approx. frequency
|z| < 1GreyNormal for this timeNormal for this time~68% of bars
1 ≤ |z| < 2BlueBusier than usualQuieter than usual~27% of bars
2 ≤ |z| < 3OrangeUnusual for this timeUnusually quiet~4% of bars
|z| ≥ 3RedExtreme for this timeExtreme silence<1% of bars

The frequencies above assume a normal distribution, which volume only approximately follows. In practice, intraday volume has a fat right tail (more extreme positive z-scores than a normal distribution would predict) and a compressed left tail (fewer extreme negatives because volume can't go below zero). Red-band readings will appear slightly more often than the 1% theoretical baseline, especially around the open and on news bars.

Above 1h timeframes, the readout becomes unreliable. A 4h chart only contains ~6 four-hour bars per futures session, which means the time-of-day mean and SD are averaging six samples — too coarse to be statistically meaningful. The indicator will still render at 4h+ but treat the verdict skeptically. This is fundamentally a 1m-to-1h tool.

Why overlay instead of its own pane

This indicator overlays on the price chart by design. Most users running a z-score readout are already running a separate volume display — TradingView's native volume bars, Session Volume Pulse, a Volume Profile, or similar. Adding another full pane just for a single status box would waste vertical chart space.

The overlay sits in a corner of the price chart, leaving the volume pane untouched for whatever's already there. Pick top-right (the default), top-left, or one of the seven other position options depending on where your price action lives.

Companion to Session Volume Pulse

This indicator shares its mathematical foundation with Session Volume Pulse, which includes a built-in z-score toggle (off by default). If you want the full volume kit — bars colored by spike state, time-of-day baseline line, spike multiplier labels, AND the z-score readout — install Session Volume Pulse instead. This standalone is for users who already have a volume display they're happy with.

One important difference if you run both: Session Volume Pulse defaults to 14 sessions for its baseline (tuned for spike-detection responsiveness). This standalone defaults to "Swing trader" = 21 sessions (tuned for statistical stability of band crossings). Both choices are intentional — but if you run both indicators on the same chart and notice the SVP baseline curving differently than the z-score readout suggests, that's why. To match them: set SVP's "Baseline sessions to average" to 21, or set this standalone's Trader style to Custom with 14 sessions.

How to install

  1. Open the script page on TradingView.
  2. Click the star icon to add to your favorite indicators.
  3. Open any chart. Click Indicators in the top toolbar.
  4. Click Favorites. Click "Volume Z-Score Readout [TSL]" to load it.
  5. For default 15m futures use: no configuration needed. For other markets or styles, click the gear icon and pick the appropriate presets.

Honest limitations

It doesn't predict price direction. A z=+3.0 with a green candle close is bullish confirmation; the same z=+3.0 with a red close is often capitulation or distribution. The indicator surfaces statistical extremes; reading what that means for direction is on you.

It doesn't work on symbols without real volume. Most spot forex pairs on retail platforms report tick count, not actual volume. The indicator will produce numbers but they're measuring tick activity, not capital flow. For genuine forex volume analysis, switch to the equivalent futures contract (6E, 6J, 6B) and you'll get real volume data. More context on forex volume issues in our forex prop firm content.

It needs history. On a freshly-listed symbol with fewer than N sessions of historical data (where N is set by your Trader style preset), the SD calculation may be unstable for the first few sessions. The verdict will read "insufficient history" until enough samples accumulate.

DST and holiday-shortened sessions distort the baseline. When the DST transition happens or you have a half-day Friday in your lookback window, the time-of-day stride gets offset by a bar or two. The math self-corrects within a few weeks as those abnormal sessions roll out of the lookback window, but expect minor wonkiness around those transitions.

Frequently asked questions

Why a z-score instead of just a volume multiplier?

A multiplier (like "current volume is 2.5× the recent average") is threshold-aware in one direction only — it tells you the bar is bigger than average, but not by how many standard deviations. A z-score is threshold-aware in standard-deviation units, which means the same threshold (say, z=2) means the same statistical thing across every market and every timeframe. You don't have to retune the threshold per instrument. A 2.5× multiplier on NQ at the open is unremarkable; a 2.5× multiplier at noon is huge. The z-score handles this automatically because the SD scales with the time-of-day variance.

Why does the Trader style preset default to 21 sessions instead of 14 or 50?

21 is roughly one calendar month of trading (5 days × 4.2 weeks ≈ 21). That's enough samples to compute a stable mean and SD without being so long that volume regime changes get smeared. Below 14 sessions the SD is too noisy; above 50 sessions the math is too slow to adapt to vol regime shifts (FOMC cycles, earnings seasons). 21 is the local optimum for 15m futures based on testing across NQ, ES, and CL over the past three quarters. If your style needs different responsiveness, use the Day trader (14 sessions) or Position trader (42 sessions) presets — or pick Custom and set your own.

What's the difference between Auto-detect and Futures market presets?

Auto-detect assumes a 24-hour trading session, which is correct for crypto and approximately correct for futures. Futures presets assume ~23 hours, accounting for the daily 1-hour close. The difference works out to one bar per session at most timeframes — usually too small to matter visibly. Use Futures for slight accuracy improvement if you trade NQ/ES/CL/GC. Use Auto-detect for everything else. Use US stocks RTH for any symbol trading regular-hours-only.

Will this indicator give me a trading edge?

No indicator gives anyone an edge by itself. Tools surface information; edges come from a tested strategy, disciplined risk management, and consistent execution. The z-score readout exists to make a specific information faster to read — "is this volume statistically unusual for this minute?" is faster to answer with a labeled pill than by squinting at a raw volume pane. That's a workflow improvement, not a strategy.

Can I use it on lower timeframes than 15m?

Yes, down to 1m. The Market preset handles the math automatically — pick the right preset (Auto-detect for crypto, Futures for futures, US stocks RTH for equities) and the indicator computes the correct bars-per-session for whatever timeframe you're on. On 1m you'll see far more "normal" (grey) readings because every individual minute carries less information; the band-crossing events are still meaningful when they happen.

Why does the verdict say "extreme silence" instead of just "extreme"?

Direction matters. A z=+3.5 means today's bar is dramatically busier than this minute usually is; a z=-3.5 means it's dramatically quieter. Just saying "extreme" would be ambiguous. The asymmetric phrasing ("extreme for this time" for positive, "extreme silence" for negative) makes the direction obvious at a glance. Some trading setups specifically care about silence — distribution before reversals, low-volume bull traps, drying-up demand — so the negative side of the distribution deserves its own clear language.

Is this affiliated with TradingView, a prop firm, or any broker?

No. This is an independent open-source project published on TradingView's public script library. No commercial relationship with TradingView, with any prop firm referenced in our prop firm directories, or with any broker. Partnership disclosures, if any are made in the future, will appear on this page and on the script's TradingView listing.

Install Volume Z-Score Readout

Open source, free forever, Pine Script v6. Sits as an overlay on any TradingView chart. Three presets, zero math required for default use.

View on TradingView →

Published by NicksNotNaked. Source code visible on the TradingView script page.

Volume Z-Score Readout is open-source Pine Script v6 published on TradingView under permissive license. The indicator is an analytical tool that displays publicly available volume data with a statistical time-of-day overlay. It does not predict price direction or guarantee any trading outcome. Volume z-score readings can precede continuation, reversal, or no follow-through. Trading futures and equities involves substantial risk of loss. This page is for educational purposes only and does not constitute investment, financial, trading, or tax advice.

Tagged: