This is a derivation of the On Balance Volume Indicator.

The idea behind it is that volume consists of two parts. The driving theory is the basic law of supply and demand.

Part 1: Volume consists of shares traded at an equilibrium price. An equal number of buyers and sellers are present during this volume. This area is displayed as the upper and lower shadows on a single candlestick. For this indicator, volume traded in equilibrium is not included in the display.

Part 2: Volume consists of shares that are not traded at an equilibrium price, driving price up or down for the time period. In this volume, buyers or sellers are not present in equal numbers. This area is displayed as the body of the candlestick. This indicator focuses on this part of volume.

VPT_OBV plots only the volume that occurs at the difference in price between the open and the close. To achieve this, volume is divided by the difference between the high and the low (in pennies). Next, the difference between the open and close is calculated (in pennies). Volume is then divided by the difference in the high and low, to get the amount of volume needed to move the asset up or down by $0.01 during the time period. This number is then multiplied by the difference between the open and close.

VPT_OBV plots the outcome as a cumulative total. A simple moving average of the VPT_OBV is thrown in to provide smoothing.
Open-source script

In true TradingView spirit, the author of this script has published it open-source, so traders can understand and verify it. Cheers to the author! You may use it for free, but reuse of this code in a publication is governed by House Rules. You can favorite it to use it on a chart.

Disclaimer

The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.

Want to use this script on a chart?
study("VPT_OBV")

length = input(20, minval=1, title="SMA Length")

hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)


VPT = spreadvol + cum(spreadvol)
SMA = sma(VPT,length)


plot(VPT, color=green, style=line, linewidth=1 )
plot(SMA, color=blue, style=line, linewidth=2)