Indicators/probuilder · probacktest · proorder · proscreener

PVT

PVT in ProBuilder returns the Price Volume Trend, a cumulative indicator combining percentage price change with volume to gauge money flow. Syntax, examples.

Syntax

probuilder
PVT(price)

Parameters

NameTypeDefaultDescription
priceprice sourcecloseThe price series used to compute the bar-to-bar percentage change. Usually close, also accepts open, high, low, typicalprice, or a custom variable.

Formula

code
percentChange = (price - price[1]) / price[1]
PVT = percentChange * volume + PVT[1]

Each bar contributes its relative price change weighted by that bar's volume, and the result accumulates on top of the previous PVT value. The absolute level is therefore arbitrary, only the direction and slope of the line carry information.

How it works

PVT belongs to the family of cumulative volume indicators, alongside On Balance Volume. Where OBV adds or subtracts the entire bar volume depending only on the sign of the price change, PVT scales the volume by the size of the percentage move. A 2 percent advance on heavy volume moves PVT far more than a 0.1 percent drift on the same volume, so PVT reacts proportionally to conviction rather than treating all up bars equally.

Because the series is cumulative, PVT has no fixed bounds and no meaningful zero line. Analysis focuses on three things: the slope of the line, its agreement or disagreement with price, and crosses of a smoothed signal line applied on top of it. When price makes a new high that PVT fails to confirm, the advance is happening on thin volume, a classic warning of a weakening trend.

PVT requires volume data. On instruments where the data feed provides no volume, the output is not meaningful.

Examples

Example 1, PVT with a signal line (Indicator)

probuilder
// Cumulative price-volume trend on the close
myPVT = PVT(close)
// 20-bar average acts as a signal line
signalLine = Average[20](myPVT)
RETURN myPVT AS "PVT", signalLine AS "Signal"

Plots the raw PVT line together with a 20-bar moving average. Crosses of the PVT through its own average are used the way MACD signal crosses are, as momentum shift markers.

Example 2, Volume-confirmed trend entry (ProOrder)

probuilder
DEFPARAM CumulateOrders = false

pvtLine = PVT(close)
pvtAvg  = Average[50](pvtLine)
trend   = Average[100](close)

// Long only when price is above trend and volume flow confirms
IF NOT LongOnMarket AND close > trend AND pvtLine CROSSES OVER pvtAvg THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

IF LongOnMarket AND pvtLine CROSSES UNDER pvtAvg THEN
  SELL AT MARKET
ENDIF

The 100-bar price average defines the trend, and the PVT cross of its 50-bar average times the entry, so positions are only opened when volume flow agrees with the price direction.

Example 3, Screening for volume-backed strength (ProScreener)

probuilder
p = PVT(close)
// PVT rising over the last 5 bars while price holds above its long average
rising = p > p[5]
SCREENER[rising AND close > Average[200](close)](p AS "PVT")

Returns instruments in long-term uptrends whose PVT has risen over the past five bars, filtering for advances supported by volume.

Interpretation

BehaviourReading
PVT rising with priceVolume confirms the uptrend.
PVT falling with priceVolume confirms the downtrend.
Price makes new highs, PVT does notBearish divergence, the advance lacks volume support.
Price makes new lows, PVT does notBullish divergence, selling pressure is drying up.

PVT measures the strength behind moves, not their direction in advance. It is a confirmation tool, typically read next to a trend indicator rather than traded on its own.

Common errors and gotchas

  • The absolute value is meaningless. PVT accumulates from the first bar loaded, so its level depends on chart history length. Thresholds such as PVT(close) > 1000000 are not portable across instruments or data ranges. Compare the line to its own past or to a moving average instead.
  • No volume, no signal. On indices, some forex feeds, and other instruments without real volume, PVT output is flat or spurious. Verify the instrument publishes volume before relying on it.
  • Wrong bracket type. PVT takes its price source in parentheses and has no period argument. PVT[14](close) raises a syntax error, the correct form is PVT(close).
  • Not comparable across instruments. Because volume scales differ by market, a PVT value on one instrument cannot be compared to another. Rank instruments by PVT slope or change, never by raw level.
  • OBV, on balance volume, adds or subtracts full bar volume by price direction.
  • Volume, raw volume series used inside the PVT accumulation.
  • AccumDistr, accumulation distribution line, an alternative money flow measure.
  • MoneyFlow, money flow value between -1 and 1.
  • MoneyFlowIndex, bounded 0 to 100 volume-weighted oscillator.
  • ChaikinOsc, oscillator on the accumulation distribution line.
  • ForceIndex, price change multiplied by volume, non-cumulative.
  • VolumeROC, rate of change of volume itself.
  • PositiveVolumeIndex, cumulative measure focused on rising-volume bars.
  • ROC, the pure price rate of change used inside PVT.