This indicator, as its name suggests, compares the difference between the volume on up days (positive) and the volume on down days (negative) with the total volume as follows:

The sum of the negative volume is subtracted from the sum positive volume and divided by the sum of the total volume over a specified period (usually 30-40 days). It is then normalized by dividing by the period and multiplied by 100. The indicator will thus oscillate theoretically between +/-100 but more usually between +/-80. Positive values above a certain critical value (0-20) are bullish and negative values are bearish. Each trading day the volume is classified as positive if the average stock price is higher than yesterday’s average price by more than 1/10 ATR (average true range) and the opposite for negative volume. If the average price difference is between +/- 0.10 ATR the volume is ignored.

For more information see my article in the April 2021 issue of Technical Analysis of Stocks and Commodities

In the chart of Atossa Therapeutics (ATOS) in the figure below you can see that the indicator  crossed over the critical value 2 times. The first time in the beginning of April of 2020, ATOS surged 290% during the next 3 months and the second time, in the January of 2021 the stock was up 294% in 5 weeks.

EXAMPLE

Finite Volume Elements (FVE) Indicator
Amibroker Code :

// VPN Indicator
// Created by Markos Katsanos
// Copyright 2021

Period = Param(“VP Period”, 30, 5, 100, 10 );
SMOOTH=Param( “SMOOTH”, 3, 1, 10, 1 );
VPNCRIT=Param( “VPNCRIT”, 10, 0, 40, 5 );
MAB=Param( “MA BARS”, 30, 10, 200, 10 );
MAV=MA(V,PERIOD);MAV=IIF(MAV>0,MAV,1);
MF = Avg – Ref( Avg, -1 );MC=.1*ATR(PERIOD);
VMP = IIf( MF > MC, V, 0 ) ;
VP = Sum( VMP , PERIOD);
VMN = IIf( MF < -MC, V, 0 ) ;
VN = Sum( VMN , PERIOD);
VPN=(VP-VN)/MAV/PERIOD*100;
VPN=EMA(VPN,SMOOTH);MAVPN=MA(VPN,MAB);
dynamic_color = IIf( VPN >= VPNCRIT, colorGreen, colorRED ) ;
Plot( VPN, “VPN(” + PERIOD + “)”, DYNAMIC_COLOR , STYLETHICK );
Plot( MAVPN, “MA”,colorGREEN, styleDashed );
Plot(VPNCRIT,”CRIT”,colorBLUE);