Intraday relative volume is nearly always computed the same way — this bar's volume against the average of the last twenty bars — and that method is wrong for a reason that has nothing to do with markets. Volume follows a fixed daily shape. Measuring a bar against its immediate neighbours mostly measures what time it is, not whether anything happened.

Here is the same candle, on the same chart, being read two ways at once:

SPX 1-minute chart, 3 September 2026, showing a 10:59 sweep candle labelled 138% of a normal 10:59 while the indicator panel reads 0.9x Quiet
SPX · 1-minute · 3 Sep 2026. The 10:59 bar carries the session's largest volume print. One reading calls it 138% of a normal 10:59; the panel's trailing-bar reading calls it 0.9× Quiet. Ninety seconds later the index ran ~50 points.

Both numbers are arithmetically correct. They disagree because they answer different questions — and only one of them is the question you meant to ask.


Volume has a shape, and the trailing average is standing inside it

We pulled SPY 1-minute regular-session bars for 500 sessions — 3 September 2024 to 31 August 2026, 195,000 bars — and took the median volume of every clock minute.

Chart of median SPY volume by minute of day across 500 sessions, with the naive 20-bar relative volume reading swinging from 0.76 to 2.18 while a time-of-day baseline stays near 1.00
Median volume per clock minute across 500 SPY sessions, and what each relative-volume method reads on a perfectly ordinary bar at that time.
6.9× the median minute
Busiest minute (15:55)
0.71×
Quietest minute (13:50)
9.8×
Busiest ÷ quietest
195,000
Bars in the study

The consequence is the lower panel. On an ordinary bar — nothing happening, a median-volume minute for that time of day — the trailing-20 method reads:

Time of day Naive reading on a normal bar Time-of-day reading
Mid-session (12:00–14:00) 0.76 – 0.82× 0.98 – 1.00×
Into the close (15:55) 2.18× 0.99×
Across the whole session swings 0.76 → 2.18 holds 0.96 – 1.00

A correct baseline has to read about 1.0 on a typical bar at every time of day. The time-of-day version does. The trailing-average version calls a completely unremarkable 15:55 bar "more than double normal", and calls a genuinely unusual midday bar ordinary.

🚨 DANGER
**This is not a rounding error — it changes the verdict.** At a 1.3× "this is a volume spike" threshold, the two methods disagree on **22.8% of all bars**. Most of that disagreement is one-directional: **17.1%** of bars are unusual for their clock minute while the trailing average shrugs, versus **5.6%** the other way. Their rank correlation is 0.63 and their raw correlation is **0.05** — these are not two flavours of the same measurement.

How to compute intraday relative volume properly

Three steps, and the third one matters more than it looks.

flowchart TD A([This bar's volume]) --> B["1 · Take the SAME clock minute<br/>from previous sessions"] B --> C["2 · Use the MEDIAN, not the mean<br/>volume is right-skewed; one news bar poisons an average"] C --> D["3 · Use only PRIOR sessions<br/>a rolling 20-session window, never including today"] D --> E([RVOL = volume ÷ that median])

The third step is what separates a measurement from a backtest artefact. If your baseline includes the session you are measuring — or worse, the whole history including the future — you have built something that looks brilliant in review and cannot exist live. Every number in this article uses a trailing 20-session median of that clock minute, excluding the current day.

Try it against the real curve:


So does the corrected reading make the sweep entry work?

This is the part we care about, and it is where we have to be careful, because a better measurement is not automatically a better trade.

The setup being tested is the one that keeps showing up on charts like the SPX example above: price coils, then a bar sweeps the lows of the coil and closes back inside — on abnormal volume for that minute. We defined it mechanically and pre-declared it before running anything:

consolidation   20-bar range in the bottom 40% of normal for that clock minute
sweep           bar's low breaks the prior 20-bar low AND closes back above it
volume          RVOL (time-of-day) >= 1.3 on the sweep bar
entry           the sweep bar's close
stop            beyond the sweep bar's low
horizon         60 minutes, path-ordered, STOP CHECKED FIRST

Out of 168,000 candidate bars, consolidation occurred on 17.5%, a sweep on 5.4%, and both together on 1.0% — roughly one signal every two sessions before the volume filter.

The result

356
Signals
−0.109 R
Expectancy
−0.212 to −0.006
95% interval
44.7%
Win rate

The full setup returned −0.109 R per trade before costs, and the interval sits below zero. That is not a small edge. It is a small loss.

And the comparison that actually settles it — the identical setup with the volume condition inverted:

Setup n E(R) 95% interval Win
Consolidation + sweep, loud (≥1.3×) 356 −0.109 −0.212 … −0.006 44.7%
Consolidation + sweep, quiet (<1.0×) 978 −0.099 −0.161 … −0.037 44.9%
Consolidation + sweep, any volume 1,611 −0.104 −0.152 … −0.056 44.7%
Sweep alone, no consolidation filter 9,014 −0.075 −0.096 … −0.054 46.3%
Random entry, same minute, same stop 355 −0.142 −0.244 … −0.040 43.1%

Loud sweeps and quiet sweeps returned the same thing. If abnormal volume carried the information, that is the row where it would appear, and it does not.

⚠️ WARNING
Note the last row. A **random** entry at the same clock minute with the same stop distance returned −0.142 R. Every version of the setup lands inside or beside that interval. The whole family is indistinguishable from arriving at a random moment and risking the same amount.

Nor is the relationship hiding in the tails

If loud bars mattered, expectancy should improve as volume rises. It does not — and the loudest bucket is the worst of all:

RVOL (time-of-day) on the sweep bar n E(R) Reached ≥2R
under 0.8× 648 −0.071 16.2%
0.8 – 1.0× 330 −0.155 11.5%
1.0 – 1.3× 277 −0.114 13.0%
1.3 – 1.8× 182 −0.126 11.5%
1.8 – 3.0× 113 −0.062 8.8%
over 3× 61 −0.145 4.9%

The "break hard" outcome we were specifically looking for — a 2R run within the hour — happens less often after the loudest sweeps, not more.


Every variant we tried, including the ones that should have worked

We did not stop at the first null. Each of these was an attempt to rescue the idea by making the setup stricter in the way a discretionary trader actually would:

Variant n E(R) 95% interval
Base: consolidation + sweep + loud 356 −0.109 ±0.103
+ closed in the top 40% of the bar (a real wick) 207 −0.105 ±0.134
+ closed back above session VWAP 253 −0.062 ±0.122
+ real wick and above VWAP 143 −0.096 ±0.161
+ restricted to 10:00–11:30 63 −0.111 ±0.247

Then the exits, holding the entry fixed:

Exit on the same 356 signals E(R) Win
Target 1R, stop 1R −0.109 ±0.103 44.7%
Target 2R, stop 1R −0.112 ±0.141 30.1%
Trail 1R +0.036 ±0.145 36.2%
Hold 60 bars, stop only −0.370 ±0.261 11.2%

Explore any combination yourself — including the ones we did not run, which the tool will tell you it cannot answer:

💡 TIP
**The most useful line in that table is the exit.** Switching from a fixed 1R target to a 1R trail moved expectancy by **0.145 R** — more than every entry filter we tested, combined. The interval still contains zero, so this is not a discovered edge. But it does say something about where attention is worth spending: on a setup with no measurable entry edge, how you leave dominates what you waited for.

What this refutes, and what it does not

We authorised ourselves to publish whatever came back, so here is the honest boundary of the claim.

What this study DOES rule out

A mechanical entry on SPY 1-minute bars — coil, sweep the low, close back inside, on abnormally high volume for that clock minute — did not produce a positive expectancy over 500 sessions, at any of the four exits tested, at any of the five strictness variants tested, in any of six volume buckets. With n = 356 and a per-trade standard deviation near 1R, the sample excludes effects larger than roughly ±0.1R. The version of this setup that gets taught — "wait for the trap, confirm with the volume spike, take the reversal" — is not supported at the size it is usually claimed. Costs are not even included; adding the spread moves every cell further left.

What this study does NOT rule out

It cannot rule out a small real effect hiding inside the intervals. It tests one instrument on one timeframe with one mechanical definition — and mechanical definitions are always a caricature of what a discretionary trader does. Our SPX example carried context this code never sees: the sweep happened beneath the slow cloud, price reclaimed session VWAP within minutes, and the day went on to trend. Those conditions are real and were not tested here. It also says nothing about other instruments, other timeframes, or a sweep used as an exit rather than an entry.


So what is relative volume actually for?

The measurement is genuinely worth fixing even though the entry did not survive — because a corrected reading is honest description, and description is what it was always good at.

Use it for thisNot for this
Readingwas this test of a level crowded or ignored?
Contextis the session participating today, or drifting?
Sizinga level tested on 3× volume deserves a wider stop
Post-mortemwas I in a real move or an empty one?
Trigger"volume spiked, therefore enter"
Confirmationadding it to a setup that has no edge
Rankingcomparing a 15:55 reading to a 12:30 one on the naive method
Predictionexpecting a big bar to be followed by a big move

That maps onto the same division of labour we use everywhere else: context tells you direction, location tells you where, structure tells you whether, and the candle tells you when — a sequence we work through in the scalp entry checklist, where volume sits in the confirmation layer rather than the trigger layer. If you want the decision to rest on something measurable, the boundary itself is a better anchor than the bar that touched it — see why price reverses at key levels.


The takeaway

  1. Fix the measurement. Compare a bar to the same clock minute from prior sessions, using a median, excluding today. Anything else is partly a clock.
  2. Expect the two readings to disagree — they did on 22.8% of bars, and the raw correlation between them was 0.05.
  3. Do not promote it to a trigger. Across 500 sessions the loud version of a coil-and-sweep entry returned −0.109 R and the quiet version returned −0.099 R. The volume condition did not separate them.
  4. Spend the attention on the exit instead. It moved the number more than every entry filter tested combined.
  5. Keep using it to read. Knowing a bar was 138% of a normal 10:59 is real information about who showed up. It just is not a reason to click.
The one line to keep
Measured against the last twenty bars, relative volume mostly tells you what time it is. Measured against the same minute of previous sessions it tells you who showed up — which is worth knowing, and is still not an entry.
ℹ️ INFO
**Method and data.** SPY 1-minute regular-hours bars, 3 Sep 2024 – 31 Aug 2026, 500 sessions, 195,000 bars, via AlphaVantage. Baselines are trailing 20-session medians per clock minute, excluding the current session. Outcomes are path-ordered over a 60-bar horizon with the stop checked before the target on every bar, so no result benefits from an ambiguous same-bar sequence. Every expectancy figure carries its sample size and a 95% confidence interval. Costs are excluded throughout, which flatters every cell.