VALYNOX
VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
ACADEMY / Indicators and signals

Relative volume indicator (RVOL): formula, thresholds, how to test it

RVOL divides the current bar's volume by the average volume of the same time-of-day bar over past sessions, so 2.0 means twice the usual activity for that slot. Set the threshold from the distribution on your own data, and test it as a gate in front of a breakout rule with and without the gate on identical costs.

By · Published · updated · Editorial policy

Contents
  1. How is the relative volume indicator calculated?
  2. How high is high: what RVOL value counts as unusual?
  3. How many days should the RVOL average use?
  4. Can relative volume be an entry filter for a breakout?
  5. What does a futures backtest of a volume-free rule show for comparison?
  6. Why does volume show activity, not direction, and what do rolls do to it?
  7. Frequently asked questions
  8. References

How is the relative volume indicator calculated?

The relative volume indicator (RVOL) divides the volume of the current bar by the average volume of the same time-of-day bar over a set number of past sessions. A reading of 2.0 means twice the usual activity for that slot. Used as a gate in front of a breakout rule, it is testable: run the rule with and without the gate on identical costs.

Relative volume is a ratio, not a count. The one formula worth knowing is:

RVOL = volume of this bar ÷ average volume of the same slot over the past N sessions

Here this bar is the bar that just closed, the same slot is the bar at the same clock time on each earlier session, and N is the number of past sessions in the average. Think of a restaurant owner judging a busy lunch: she compares today's lunch crowd with the usual lunch crowd, not with the average crowd across the whole day including the empty hour at three in the afternoon.

The common mistake is to use a plain all-day average as the denominator. Futures volume through a session has a U shape: heavy around the cash open, light in the middle of the day, heavy again toward the close. Against an all-day average, every open looks busy and every midday looks dead, so the indicator only repeats the clock. The same-slot average removes that shape and leaves what you want to see: activity compared with what is normal for this minute of the day. The guide to technical analysis tools and indicators you can test places RVOL among the volume tools and explains why most of them need a baseline before they mean anything.

Hypothetical example

The 5-minute bar that opens at 09:30 prints 800 contracts. Over the past 20 sessions, the 09:30 bar averaged 400 contracts. RVOL = 800 ÷ 400 = 2.0, twice the usual open. If the denominator were the all-day average of 200 contracts per bar, the same bar would read 4.0 and so would almost every other open in the history, which tells you nothing.

RVOL divides by the same time slot: a 09:30 bar of twelve thousand contracts against a 09:30 average of six thousand over past sessions gives RVOL 2.0, while the all-day average of three thousand is crossed out as the wrong denominator (example numbers) Divide by the same slot Volume in thousands, example numbers 09:30 This bar 12 Slot average 6 RVOL 2.0 All-day 3 wrong An all-day average measures the clock. So: use the same-slot average.
RVOL compares a bar with the same time slot on past sessions. The all-day average is the wrong denominator because it only reflects the shape of the session.

How high is high: what RVOL value counts as unusual?

There is no fixed line; the right threshold is the one that keeps enough trades to judge on your own data. Traders commonly treat readings below 1.0 as quiet, 1.5 to 2.0 as elevated and above 2.0 or 3.0 as unusual, and those bands are a reasonable starting vocabulary. They are not a setting. A chart template that ships with 2.0 was not tuned to your market, your bar size or your session, and the share of bars above 2.0 differs a lot between a liquid index future on 5-minute bars and a thin contract on 1-minute bars.

RVOL bandReadingTypical causeEffect of using it as a minimum
Below 1.0QuietLunch lull, holiday sessionKeeps almost all trades; filters nothing
1.0 to 1.5NormalOrdinary sessionKeeps most trades
1.5 to 2.0ElevatedScheduled data release, cash openRemoves a large share of trades
2.0 to 3.0UnusualSurprise news, large orderKeeps a small share of trades
Above 3.0ExtremeMajor event, roll week on one contractKeeps very few trades
Higher RVOL minimum keeps fewer trades: bands below 1.0 quiet, 1.0 to 1.5 normal, 1.5 to 2.0 elevated, 2.0 to 3.0 unusual and above 3.0 extreme, with a bar for each showing the share of trades kept when the band is used as a minimum, shrinking from almost all to very few (illustration) Higher minimum, fewer trades Bar = trades kept (illustration) < 1.0 Quiet 1.0–1.5 Normal 1.5–2.0 Elevated 2.0–3.0 Unusual > 3.0 Extreme A strict minimum leaves too few trades. So: check the share of bars that pass.
The common RVOL bands, what usually causes each, and what each does to the number of trades when it is used as a minimum.

The way to set your own line is to read the distribution of RVOL on your own data before you write any rule:

  1. Compute RVOL for every bar of the slot you trade over the full history, with the same baseline length you plan to use live.
  2. Sort the values and note what share of bars sits above 1.5, 2.0 and 3.0. A threshold that only one bar in two hundred passes will leave you with a handful of trades a year.
  3. Multiply that share by the number of signals your base rule produces. If the result is a few dozen trades over the whole history, the threshold is too strict to grade; the average trade of a sample that small moves a long way when two or three trades change.
  4. Write the threshold down before the backtest and keep the neighbours (for example 1.5 and 2.5 around 2.0) in the same run, so you see whether the result holds across a region or at one lucky value.

How many days should the RVOL average use?

Pick the baseline length by what you want the filter to ignore, then test neighbouring lengths together. A short baseline of about 5 to 10 sessions reacts fast to a lasting change in activity but is distorted by a single news day. A long baseline of 20 to 50 sessions is steady but slow to notice that the market has become busier or quieter for good.

The distortion from one spike day is mechanical. If a data release triples the volume of the 08:30 slot on one session, a 5-session average of that slot rises by about 40 percent for the next five sessions, so ordinary bars in that slot read below 1.0 for a week and the gate stays shut on normal days. The same spike moves a 20-session average by about 10 percent, which most thresholds absorb without notice. The price of that steadiness is that when activity really shifts, for example after a change in contract size or a new product launch, the 20-session baseline takes a month to catch up.

PropertyShort baseline (5 to 10 sessions)Long baseline (20 to 50 sessions)
SpeedReacts fastSteady
WeaknessDistorted by one spike daySlow to adapt to a lasting change
Suited toIntraday rules on liquid contractsSwing rules and daily bars
Short baselines overreact: after one news-day spike, a 5-session baseline jumps about 40 percent for the next five sessions, while a 20-session baseline rises only about 10 percent (example) Short baselines overreact Baseline after one news day, example News day 5 sessions +40% 20 sessions +10% A 5-day baseline stays high for a week. So: try a median, test several lengths.
One spike day inflates a short baseline for the sessions that follow and barely moves a long one. The two settings answer different questions.

Two practical choices reduce the problem. One is a median instead of a mean for the baseline, which a single spike day cannot pull far. The other is to treat the baseline length like any other parameter and look for a plateau: run 10, 15, 20, 30 and 40 sessions in one batch and ask whether the results sit on a flat region or a single peak, which is the same test described in parameter stability: plateau or lucky spike. A length that works only at exactly 20 sessions was fitted to the history, not chosen for the market.

Can relative volume be an entry filter for a breakout?

Yes, and a gate in front of another rule is the role where RVOL is easiest to test fairly. A gate is a condition that must be true for an entry to be allowed but that never creates an entry by itself. The base rule can be an opening-range breakout with its range length, entry and stop, a channel breakout, or an oversold reading from an oscillator such as the one in the article on the KD indicator formula and how to test it, the RSI 70/30 levels and how to test RSI rules, or the stochastic oscillator %K and %D settings. The idea behind the gate is simple: a breakout on heavy volume for that time of day has more participants behind it than a breakout in a quiet slot, so the gate is meant to remove the thin, drifting signals.

The fair test compares the same rule with and without the gate, on identical costs, sessions and execution settings, and reads two numbers: how many trades the gate removed and what happened to the average trade after costs.

  1. Run the base rule alone. Record the trade count, the average trade after commission and slippage, and the maximum drawdown.
  2. Add the RVOL gate with the threshold and baseline you wrote down in advance. Change nothing else.
  3. Compare. A useful gate removes a meaningful share of trades and raises the average trade by more than the trade count fell, with the gain spread across the history. A useless gate removes trades roughly at random, so the average trade barely changes. A harmful gate removes the winners, often because heavy volume at the entry bar means the move is already over.
  4. Repeat with the neighbouring thresholds from the same batch and count how many of them agree.
Only the gate differs: the gated run goes from breakout to an RVOL check of at least 2 to the order, while the base comparison run goes from breakout straight to the order with no gate, on identical costs and sessions Only the gate differs Two runs, identical costs and sessions Gated Base Breakout RVOL ≥ 2 Order Breakout none Order The gap between runs is the gate alone. So: compare trade count and avg trade.
The RVOL gate sits between the breakout condition and the order. The comparison run follows the same path without the gate, so the difference between the two is the gate alone.

Hypothetical example

Base rule alone: 400 trades, average trade $30 after costs, total $12,000. With an RVOL gate at 2.0: 160 trades, average trade $55 after costs, total $8,800. The gate removed 60 percent of the trades and nearly doubled the per-trade result, but the total fell because so few signals remain. Whether that trade is worth making depends on how many trades you need to grade the strategy and on how the drawdown changed, so both runs stay in the report side by side.

Each threshold and each baseline length you try is another variant, and the best of many variants on one history carries a selection bonus that will not repeat; Bailey, Borwein, López de Prado and Zhu (2014) show how quickly that bonus grows with the number of tries. Keep the gated and ungated versions in the same batch so they are graded on the same data, and write the pass condition before you look. In AlphaPrime (Valynox), the entry conditions, parameter ranges and search constraints you define in strategy generation decide which filters the search may place in front of a breakout rule, so the gated and ungated candidates are evaluated under one set of costs and sessions rather than in two separate projects.

What does a futures backtest of a volume-free rule show for comparison?

A gate needs a baseline to be measured against, and the run behind this article supplies one: a rule with no volume condition at all. The run tested ES (E-mini S&P 500) daily bars from 2019-01-02 to 2025-06-30, long and short, one contract, with $20 commission and $25 slippage charged on every trade. The rule is a Percent Rank rule as its only entry and exit, with no stop, no target and no filters. Percent Rank is the position of today's value inside the values of a lookback window, expressed from 0 to 100. This run tests a stand-in rule built from a standard indicator, not relative volume itself; its purpose is to show the shape of an ungated baseline on daily bars that an RVOL gate could be placed in front of.

Source: AlphaPrime product engine (CPU), run 2026-10-31. ES daily bars, 2019-01-02 to 2025-06-30, long and short, 1 contract, $20 commission and $25 slippage per trade.

NumberResult
Net profit (closed trades)$75,415
Max drawdown$52,502.5
Trades63
Win rate50.79%
Profit factor1.563
Average trade$1,197.06
Time in market92.42%

The shown candidate is the single keeper among 1,024 the search tried, picked for return relative to drawdown. Picking the kept candidate after the fact flatters it: the other candidates did worse, and the kept one benefits from having been compared with all of them on the same history. The figures are a measured past result on one contract, not a forecast, and they do not say that the Percent Rank rule earns that money or that a reader can expect it.

Look at how the equity line and the drawdown below it behave through the period, and where the out-of-sample stretch is marked. This is the ungated baseline whose trade count and drawdown a volume gate would be measured against.
Look at how the equity line and the drawdown below it behave through the period, and where the out-of-sample stretch is marked. This is the ungated baseline whose trade count and drawdown a volume gate would be measured against. ES · daily · 2019-01-02 to 2025-06-30 · CPU engine backtest

Two things in the box matter for an RVOL test. The trade count is 63 over six and a half years, so any gate placed on this rule removes trades from a sample that is already small, and the remaining count has to be checked before the average trade is read. And on daily bars there is no time-of-day slot: RVOL becomes today's volume divided by the average daily volume of the past N sessions, which is simpler but makes the roll problem in the next section even more visible, because a daily bar covers the whole session on both contracts.

Why does volume show activity, not direction, and what do rolls do to it?

High RVOL tells you that many contracts changed hands, not which way price will go. Every trade has a buyer and a seller, so volume is a count of agreements, not a vote. A scheduled data release, a large fund rebalancing, or a market maker hedging an options book can all triple the volume of a slot without any lasting push in either direction. That is why RVOL belongs in front of a rule that already states a direction, and why the comparison in the previous sections reads the average trade rather than the number of high-RVOL bars.

In futures there is a second source of false readings that has nothing to do with news: the quarterly roll. ES expires in March, June, September and December, and in the days before each expiry volume migrates from the expiring contract to the next one. A continuous series that follows the front month until a roll date sees the expiring contract's volume fall day by day and then jumps to the next contract, which already carries most of the activity. Read naively, RVOL on the old contract sinks below 0.5 while RVOL on the new one, measured against a baseline built from its own thin pre-roll days, jumps above 3.0. Neither reading says anything about the market.

Roll week fakes RVOL: over ten days before expiry the expiring contract's volume share falls from 100 to 10 while the next contract's rises from 5 to 95, total volume stays flat, and RVOL read on one contract alone shows above 3.0 for the next contract and below 0.5 for the expiring one (example percentages) Roll week fakes RVOL Volume share, 10 days to expiry (example) Total flat RVOL alone: Next > 3.0 Expiring < 0.5 Volume moves; activity stays flat. So: sum both contracts in roll week.
Around expiry, volume moves from the expiring contract to the next one while total activity stays about the same. RVOL read from one contract alone fires falsely in both directions.

Three ways to handle it, from most to least work:

  1. Sum the volume of the expiring and the next contract for each bar during roll week and build the baseline from the summed series. Total activity is then flat through the roll, as the figure shows.
  2. Read volume per contract and seed the new contract's baseline from the old contract's same-slot averages at the roll date, so the first days after the roll are not compared with the thin pre-roll days of the new contract.
  3. Exclude roll week from the baseline and from the gate, so no entry can be allowed by an RVOL reading taken during the migration. This loses a week of trading per quarter but needs no extra data.

Whichever you choose, the same handling has to be used in the backtest and in live trading, and it has to be consistent with how the price series itself was rolled; the article on futures backtesting done right: specs, rollover and tick value covers the price side of the same problem. Exchanges can change contract months and expiry rules, so confirm the current schedule on the exchange's contract page before you fix a roll calendar in your data. Across the whole process, the older studies of technical rules with and without data-snooping corrections by Sullivan, Timmermann and White (1999) and the survey by Park and Irwin (2007) point the same way: a filter that looks good on one history and one threshold is the normal outcome of searching, and only the comparison with the ungated rule on the same data, with costs in, tells you whether the gate added anything.

The next step is one afternoon of work: compute RVOL for the slot you trade on your own bar data with a 20-session baseline, note what share of bars passes 1.5, 2.0 and 3.0, pick the threshold that still leaves your base rule a few hundred trades, and run the rule with and without that gate on the same costs. The two trade counts and the two average trades will tell you more than any chart template.

Frequently asked questions

How do you calculate RVOL?

Divide the volume of the current bar by the average volume of the bar at the same clock time over a chosen number of past sessions, commonly 10 to 20. A value of 1.0 means normal activity for that time of day, 2.0 means twice normal. Using an all-day average as the denominator is the common mistake, because it makes every open look busy and every midday look dead.

What RVOL value is considered high?

Traders usually call 1.5 to 2.0 elevated and anything above 2.0 or 3.0 unusual, but the right line for a strategy depends on the market and bar size. Compute RVOL on your own history, see what share of bars passes each level, and choose the threshold that still leaves enough trades to judge. Test the neighbouring values in the same run so you know whether the result holds across a region.

How many days should the RVOL average use?

A short baseline of 5 to 10 sessions reacts quickly but one news day distorts it for the sessions that follow. A long baseline of 20 to 50 sessions is steadier but slow to notice a lasting change in activity. Choose by what you want the filter to ignore, consider a median instead of a mean, and test several lengths together to find a plateau rather than one lucky setting.

Can relative volume be used as an entry filter?

Yes, as a gate in front of a rule that already states a direction, such as a breakout or an oscillator reading. Run the base rule with and without the gate on identical costs and sessions and compare the trade count and the average trade after costs. A useful gate removes a meaningful share of trades and raises the average trade; a harmful one removes the winners.

Does RVOL work on daily bars?

On daily bars there is no time-of-day slot, so RVOL is today's volume divided by the average daily volume of the past N sessions. It still measures activity against a baseline, but the quarterly roll becomes more visible, because the whole day's volume moves from the expiring contract to the next one. Sum the volume of both contracts, seed the new baseline from the old one, or exclude roll week from the gate.

References

  • Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.
  • Sullivan, R., Timmermann, A., & White, H. (1999). Data-Snooping, Technical Trading Rule Performance, and the Bootstrap. The Journal of Finance, 54(5), 1647–1691.
  • Park, C.-H., & Irwin, S. H. (2007). What Do We Know About the Profitability of Technical Analysis? Journal of Economic Surveys, 21(4), 786–826.