- Price Volume Trend refines the OBV concept by weighting volume according to the percentage price change rather than using an all-or-nothing approach.
- No configurable parameters; computation is stateless per bar.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
Price Volume Trend refines the OBV concept by weighting volume according to the percentage price change rather than using an all-or-nothing approach. Where OBV assigns the entire bar's volume to either buyers or sellers, PVT scales the volume contribution by the relative price movement—a 1% move adds only 1% of volume to the running total.
This proportional weighting makes PVT more sensitive to the magnitude of price changes, not just their direction. A large price move with moderate volume registers more strongly than a tiny price move with massive volume—aligning the indicator more closely with price momentum.
## Historical Context
Price Volume Trend emerged as an evolution of On Balance Volume (OBV), addressing what some analysts considered a weakness in Granville's original formulation. The criticism: OBV treats a 0.01% price increase the same as a 10% surge, assigning full volume to either case.
The modification is straightforward: instead of using sign(price change) × volume, use (percentage price change) × volume. This creates a cumulative indicator that:
- Still measures buying/selling pressure via volume
- Weights contributions by the significance of price moves
- Reduces sensitivity to noise (small price changes)
- Amplifies response to significant moves
PVT gained popularity among traders who found OBV too reactive to minor price fluctuations. By incorporating price magnitude, PVT provides a smoother view of volume-weighted momentum while maintaining the cumulative structure that makes divergence analysis effective.
The indicator appears in most major technical analysis platforms under names including "Price Volume Trend," "Volume Price Trend," or simply "PVT."
## Architecture & Physics
PVT operates as a weighted accumulator where each bar's contribution depends on both volume and the percentage change in price. The formula scales volume by the relative price movement, creating a more nuanced measure of buying/selling pressure.
### Component Breakdown
1.**Price Change**: Calculate difference from previous close
2.**Price Change Ratio**: Normalize by previous price (percentage)
3.**Volume Adjustment**: Scale volume by the ratio
4.**Cumulative Total**: Running sum of adjusted volumes
### State Requirements
| Component | Type | Purpose |
| :--- | :--- | :--- |
| PvtValue | double | Current cumulative PVT |
| PrevClose | double | Previous bar's close for ratio calculation |
| LastValidClose | double | Fallback for NaN/Infinity handling |
| LastValidVolume | double | Fallback for NaN/Infinity handling |
| **Skender** | ✅ | `Pvt` indicator, exact match |
| **Tulip** | N/A | Not implemented |
| **Ooples** | ✅ | `Pvt` indicator, exact match |
| **PineScript** | ✅ | Custom implementation, exact match |
QuanTAlib implementation validated against Skender and Ooples with tight tolerances (1e-9). PVT is less universally implemented than OBV, but available in major .NET libraries.
## Common Pitfalls
1.**Absolute Value Meaningless**: Like OBV, PVT's numeric value has no intrinsic meaning—only direction and divergences matter. Don't compare PVT values across different securities.
2.**Not Bounded**: PVT can reach any value, positive or negative. There are no overbought/oversold levels.
3.**Scale Depends on Price Level**: While percentage-based, PVT values are still influenced by the absolute price level during calculation. Use relative analysis (slopes, divergences) rather than absolute comparisons.
4.**Division by Zero**: If previous close is zero (rare but possible with some data feeds), the formula produces no contribution. QuanTAlib handles this gracefully.
5.**Small Price Changes Damped**: Unlike OBV, a 0.1% move with huge volume barely registers in PVT. This is a feature for noise reduction but may miss significant volume events with small price impact.
6.**Volume Data Quality**: PVT is only as reliable as volume data. Extended hours, different exchange feeds, or estimated volume can produce misleading signals.
7.**TValue Limitations**: The `Update(TValue)` method cannot compute PVT without volume data. Use `Update(TBar)` for proper calculation.
8.**isNew Parameter**: When correcting bars (isNew=false), the implementation properly restores previous state. Incorrect handling causes cumulative drift.