PositiveVolumeIndex
PositiveVolumeIndex in ProBuilder updates only on rising volume, tracking price moves driven by crowd activity. Syntax, formula, examples, interpretation.
Syntax
PositiveVolumeIndex(price)Parameters
| Name | Type | Default | Description |
|---|---|---|---|
price | price source | close | The series whose percentage change is accumulated on rising-volume bars. Typically close. |
Formula
if volume > volume[1]:
PVI = PVI[1] + ((price - price[1]) / price[1]) * PVI[1]
if volume <= volume[1]:
PVI = PVI[1]Only bars with higher volume than the previous bar change the index. On all other bars the value is carried forward unchanged.
How it works
The Positive Volume Index splits market activity by volume regime. When today's volume exceeds yesterday's, the index moves by the same percentage as price. When volume is flat or falling, the index freezes. The result is a price track built exclusively from high-participation bars.
The classic reasoning is that rising-volume days are dominated by the general public, while quieter days reflect better-informed positioning. Under that reading, PVI shows what the crowd is doing. Its counterpart, the Negative Volume Index, applies the same logic to falling-volume days. The two are often used together, comparing each index with its own long moving average, commonly around one year of bars, to classify the market regime.
Because the index compounds percentage changes from an arbitrary starting value, its absolute level carries no meaning. Analysis compares the line to its own history, usually via a long moving average or its previous readings.
Examples
Example 1, PVI-based target zones (Indicator)
// If PVI is not falling, project a level below recent lows, otherwise above recent highs
i1 = PositiveVolumeIndex(close)
IF(i1 > i1[1] OR i1 = i1[1]) THEN
result = lowest[5](low) - range
ELSE
result = highest[5](high) + range
ENDIF
RETURN resultReads a non-decreasing PVI as crowd participation holding up, and projects a reference level below the 5-bar low, offset by the bar range. A falling PVI flips the projection above the 5-bar high.
Example 2, PVI versus its long average (Indicator)
// Classic regime read: PVI above its long-run average
pvi = PositiveVolumeIndex(close)
pviavg = Average[255](pvi)
RETURN pvi AS "PVI", pviavg AS "PVI average"Plots the index against a 255-bar average, roughly one trading year on daily data. The traditional reading treats PVI above this average as a bullish regime.
Example 3, Bullish PVI regime screener (ProScreener)
// Instruments whose PVI just crossed above its long average
pvi = PositiveVolumeIndex(close)
pviavg = Average[255](pvi)
signal = pvi CROSSES OVER pviavg
SCREENER[signal]((pvi - pviavg) AS "PVI spread")Returns instruments where the index has just moved above its one-year average, the standard bullish regime change in PVI analysis.
Interpretation
| Pattern | Reading |
|---|---|
| PVI above its long moving average | Historically associated with bull-market conditions. |
| PVI below its long moving average | Weaker crowd participation, more cautious regime. |
| PVI flat for many bars | Volume has not expanded, no new information from this index. |
| PVI rising while price falls | High-volume bars are being bought, potential accumulation. |
PVI is a slow regime tool rather than an entry trigger. It is commonly paired with the Negative Volume Index, with agreement between the two, both above their averages, read as the strongest bullish configuration.
Common errors and gotchas
- Absolute level is meaningless. The index compounds from an arbitrary seed at the start of the loaded history. Compare it only with its own average or past values, never across instruments or against fixed numbers.
- Long flat stretches are normal. The index only moves when volume increases bar over bar. In declining-volume phases it can stay perfectly flat for extended periods, which breaks logic that assumes continuous change.
- Volume data required. Without genuine volume the rising-volume test is unreliable, so results on synthetic or estimated volume feeds should be treated with caution.
- History length changes the line. Since the accumulation starts at the first loaded bar, backtests with different
DEFPARAMpreload settings or chart histories produce shifted PVI lines. Signals based on crossings of its own average tolerate this, fixed-level signals do not.
Related instructions
Volume, the per-bar volume driving the update condition.OBV, cumulative signed volume, an alternative volume-flow measure.PVT, price and volume trend, percentage-weighted cumulative flow.MoneyFlow, bounded buying and selling pressure gauge.MoneyFlowIndex, volume-weighted RSI on a 0 to 100 scale.AccumDistr, accumulation and distribution line.EaseOfMovement, relates price change to the volume required to produce it.VolumeROC, rate of change of volume itself.
