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 Soren Huang · Published · updated · Editorial policy
Contents
- How is the relative volume indicator calculated?
- How high is high: what RVOL value counts as unusual?
- How many days should the RVOL average use?
- Can relative volume be an entry filter for a breakout?
- What does a futures backtest of a volume-free rule show for comparison?
- Why does volume show activity, not direction, and what do rolls do to it?
- Frequently asked questions
- 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.
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 band | Reading | Typical cause | Effect of using it as a minimum |
|---|---|---|---|
| Below 1.0 | Quiet | Lunch lull, holiday session | Keeps almost all trades; filters nothing |
| 1.0 to 1.5 | Normal | Ordinary session | Keeps most trades |
| 1.5 to 2.0 | Elevated | Scheduled data release, cash open | Removes a large share of trades |
| 2.0 to 3.0 | Unusual | Surprise news, large order | Keeps a small share of trades |
| Above 3.0 | Extreme | Major event, roll week on one contract | Keeps very few trades |
The way to set your own line is to read the distribution of RVOL on your own data before you write any rule:
- Compute RVOL for every bar of the slot you trade over the full history, with the same baseline length you plan to use live.
- 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.
- 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.
- 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.
| Property | Short baseline (5 to 10 sessions) | Long baseline (20 to 50 sessions) |
|---|---|---|
| Speed | Reacts fast | Steady |
| Weakness | Distorted by one spike day | Slow to adapt to a lasting change |
| Suited to | Intraday rules on liquid contracts | Swing rules and daily bars |
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.
- Run the base rule alone. Record the trade count, the average trade after commission and slippage, and the maximum drawdown.
- Add the RVOL gate with the threshold and baseline you wrote down in advance. Change nothing else.
- 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.
- Repeat with the neighbouring thresholds from the same batch and count how many of them agree.
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.
| Number | Result |
|---|---|
| Net profit (closed trades) | $75,415 |
| Max drawdown | $52,502.5 |
| Trades | 63 |
| Win rate | 50.79% |
| Profit factor | 1.563 |
| Average trade | $1,197.06 |
| Time in market | 92.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.

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.
Three ways to handle it, from most to least work:
- 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.
- 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.
- 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.

