Volume Oscillator Indicator: Formula, Settings and How to Read It
Volume Oscillator, also known as the Percentage Volume Oscillator, measures the gap between a short and a long moving average of volume as a percentage of the long average. Positive readings mean recent participation is running above its longer-run norm; negative readings mean it is drying up.
Senzoukria · Indicators · Updated September 2026
Volume Oscillator ships with the Senzoukria desktop app, in the Volume group of the indicator catalogue. It is drawn in its own panel below the chart.
What Volume Oscillator measures
Dividing the difference between the two averages by the long average makes the output a percentage, and therefore comparable across instruments and timeframes in a way a raw difference in contracts is not. Comparing two averages rather than one bar against an average is what separates it from Relative Volume: the current bar's noise is already absorbed into the short average, so a single outlier moves the line far less. Nothing is plotted until both averages have a full window behind them, and a long window whose average volume is zero returns nothing rather than a percentage, since there is no reference to divide by.
The formula, as implemented
This is not a description of how the indicator is usually defined elsewhere — it is what the shipped code computes, documented next to the implementation:
Volume Oscillator (PVO) : osc = (SMA_short(volume) − SMA_long(volume)) / SMA_long(volume) × 100 POURQUOI : mesure l'EXPANSION ou la contraction de la participation, en % et donc comparable d'un instrument et d'un timeframe à l'autre. > 0 = le volume court terme dépasse sa norme (impulsion, breakout qui participe) ; < 0 = assèchement (fin de mouvement, range). C'est un complément de `relative-volume` (volume.ts), qui compare UNE barre à sa moyenne — ici on compare deux MOYENNES, ce qui élimine le bruit de la barre courante. Défauts 5 et 20 : une semaine contre un mois de séances, le couple usuel. Warm-up (< long barres) → null. SMA_long = 0 (fenêtre entièrement à volume nul) → null : x/0 n'est pas « 0 % de variation », c'est une absence de référence — aucun cumul en jeu, l'exception des accumulateurs ne s'applique pas. Les deux SMA de `helpers.smaSeries` rendent null avant fenêtre pleine.
How to read it
- The zero line is the reference: above it the short-term volume average has overtaken the long-term one, below it participation is contracting.
- Readings rising through a directional move describe participation joining it; readings falling through the same move describe it being carried by fewer participants.
- Persistent negative readings inside a range are the ordinary picture of a quiet market, not a warning on their own.
- The line has no direction of its own — a large positive reading accompanies heavy selling as readily as heavy buying.
- Both inputs are moving averages, so turns arrive after the volume that caused them. A cross is not a timely event.
Parameters and defaults
The short average defaults to 5 and the long to 20, roughly a week against a month of daily sessions and the conventional pairing. Narrowing the gap between the two periods flattens the line toward zero and produces frequent crosses that mean little; widening it produces larger swings that turn later. The short period accepts 1 to 200 and the long 1 to 500. Setting the short period longer than the long one is allowed and simply reverses what the sign means, since the comparison is then the other way round.
| Parameter | Type | Default | Range |
|---|---|---|---|
| Short SMA | number | 5 | 1 – 200 |
| Long SMA | number | 20 | 1 – 500 |
What it does not show
Both inputs lag, so the oscillator confirms a change in participation rather than announcing it. On intraday futures it tracks the daily volume curve, printing predictable positive readings around the open and the cash close that say nothing about the current move. It carries no direction, no information about who initiated the trades, and none about where inside the bar the volume occurred. Session boundaries, contract rolls and holiday sessions distort the long average for its full window, and the series is blank during warm-up.
Using it in Senzoukria
Add it from the Indicators panel of any footprint chart or candle chart. It runs on futures data from Rithmic or Databento and on crypto pairs from Binance and Bybit, on the same engine — the calculation does not change with the venue, only the data feeding it does. Market data subscriptions are billed by the provider, separately from the app.
Related indicators
- Volume ROC % — Volume
- Relative Volume — Volume
- Trade Count — Volume
- Level Count — Volume
- Volume per Level — Volume
- POC Position % — Volume
See the full indicator library, or start with the order flow guide if you are new to reading aggression, delta and absorption.
Frequently asked questions
- What is a volume oscillator used for?
- To see whether participation is expanding or contracting against its recent norm, expressed as a percentage. It is used to check whether a price move is accompanied by growing or fading volume. It measures participation only and carries no directional information of its own.
- What is the difference between a volume oscillator and relative volume?
- Relative volume compares one bar with the average of the bars before it, so a single outlier produces a large reading. The volume oscillator compares two averages of volume with each other, which absorbs individual bars and describes the trend in participation rather than the size of one bar.
- What settings are standard for the volume oscillator?
- Short 5 and long 20 are the conventional pair, approximating a week against a month of daily sessions. A narrow gap between the periods makes the line hug zero and cross often; a wide gap makes it swing further but turn later. No setting removes the lag inherent in using moving averages.