How to plot volume at price with color buy/sell

For both Volume At Price and Volume At Price Multi, How to plot volume in order to show buy/sell color, it is similar to volume(color).
vol%40PriceBuyColorBS

Thank you.

The default "Volume at Price" formula uses the PlotVAPOverlay() function. The color parameter is a numeric one so there is no way to use multiple colors.

In a similar manner, the "Volume At Price Multi" formula uses the PlotVAPOverlayA() function that, again, does not accept an array for the color parameter.

/*
	Author: Anderson Wilson 
		based on PriceVolDistribution demo written by Tomasz Janeczko
		
Volume-by-Price is an indicator that shows the amount of volume for a particular price range,
The Volume-by-Price bars are horizontal and shown on the left side of the chart to correspond 
with these price ranges. Bar colors indicate bear/bull volume
*/

bi = BarIndex();
fvb = FirstVisibleValue( bi );
lvb = LastVisibleValue( bi );

fvb = Max( 0, fvb );
lvb = Max( 0, lvb );

bins = Param("Bins", 12, 3, 100, 1);
pRecHeight = Param("Rectangle Height", 0.90, 0.10, 1, 0.05);

BullBearZone = (High - Low) / 3;
bullbar = C > (High - BullBearZone);
bearbar = C < (Low + BullBearZone);

mx = PriceVolDistribution( H, L, V, bins, True, fvb, lvb );
mx1 = PriceVolDistribution( H, L, IIf( bullbar, V, 0 ), bins, True, fvb, lvb );
mx2 = PriceVolDistribution( H, L, IIf( bearbar, V, 0 ), bins, True, fvb, lvb );

bins = MxGetSize( mx, 0 );
bins1 = MxGetSize( mx1, 0 );
bins2 = MxGetSize( mx2, 0 );

GfxSetOverlayMode( 1 );
GfxSetCoordsMode( 1 );

if( bins > 1 && bins == bins1 && bins == bins2 ) {

	MaxVolume = mx[ 0 ][ 1 ];

	// find max volume
	for( i = 1; i < bins; i++ )
	{
		if( mx[ i ][ 1 ] > MaxVolume )
			MaxVolume = mx[ i ][ 1 ];
	}
	
	// rectangle height
	RecHeight = (mx[ 1 ][ 0 ] - mx[ 0 ][ 0 ]) / 2 * pRecHeight;
	
	for( i = 0; i < bins; i++ )
	{
		price = mx1[ i ][ 0 ]; // price level
		
		absVolume = mx1[ i ][ 1 ];
		VolAcum = absVolume;
		relvolume = absVolume / MaxVolume;
		relbar = relvolume * (lvb-fvb+1);
		
		// upper left corner of the rectangle.	
		x1 = fvb;
		y1 = price + RecHeight;
		// lower right corner of the rectangle.	
		x2 = fvb + relbar;
		y2 = price - RecHeight; 

		GfxFillSolidRect( x1, y1, x2, y2, colorDarkGreen );
		
		absVolume = mx2[ i ][ 1 ];
		VolAcum += absVolume;
		relvolume = absVolume / MaxVolume;
		relbar2 = relvolume * (lvb-fvb+1);

		x1 = x2;
		x2 = x1 + relbar2;
		GfxFillSolidRect( x1, y1, x2, y2, colorRed );

		absVolume = mx[ i ][ 1 ]; 
		relvolume = (absVolume - VolAcum) / MaxVolume;
		relbar3 = relvolume * (lvb-fvb+1);

		x1 = x2;
		x2 = x1 + relbar3;
		GfxFillSolidRect( x1, y1, x2, y2, colorBrown );
	}
}
Plot( C, "Price", colorDefault, styleBar );
10 Likes

Thank you for your help.
And thank a lot to Tomasz Janeczko for this code. I will try to follow it.
After shortly I posted this question I found this above your code as well as link below.
http://www.amibroker.com/members/library/formula.php?id=1475.

image