/* Author: Anderson Wilson, Beppe, Steve Walsh 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 Bull (SeaGreen) / Bear (Custom16) / Total (Grey40) volume Use double click to define range. The horizontal bars represent volume at a particular price. The longer the bar (all three colors) the more volume at that price. The longest bar is the most traded price. You will note that the longest bar's percentages add up to approximately 100% (some variation due to rounding). Shorter bars are relative to the longest bar. This gives you a good indication of possible support and resistance at the boundaries of the bars - particularly the longest. You can change the number of bins to increase/decrease them. You can also double click on your chart to set the first and last bars to be included in the indicator. Double click on the blank area to the right to reset to the default. The different bar colors are an indication of the volume in relation to the close at the price bar. The price bar is divided into three areas. If the volume is associated with a close at the top 1/3 of the bar it is colored green. If the close is in the lower third, the associated volume is red. For volume where the close is in the middle of the bar the volume is grey. This indicator is actually a combination of VPA (Volume Price Analysis) and a VSA (Volume Spread Analysis). It provides a bit more information than the classic PlotVAPOverlayA built into AmiBroker which only gives VPA. */ SetChartOptions( 0, chartShowArrows | chartShowDates ); GraphXSpace = 15; // Plot( C, "", colorAqua, styleCandle ); Title = GetFnData( "Alias" ) + " - " + StrFormat( "{{FULLNAME}} - {{INTERVAL}}: {{DATE}}, VAP Absolute Values, Open %g, Hi %g, Lo %g, Close %g (%.1f%%), Vol(mil) %.2f (%.0f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ), V / 1000000, SelectedValue( ROC( V, 1 ) ) ); // bi = BarIndex(); fvb = BeginValue( bi ); lvb = EndValue( bi ); if( fvb == 0 && lvb == LastValue( bi ) ) { fvb = FirstVisibleValue( bi ); lvb = LastVisibleValue( bi ); } fvb = Max( 0, fvb ); lvb = Max( 0, lvb ); bins = Param( "Bins", 10, 3, 100, 1 ); //So luong thanh Volume pRecHeight = Param( "Rectangle Height", 0.90, 0.10, 1, 0.05 ); //Chieu cao thanh Volume BullBearZone = ( High - Low ) / 3; bullbar = C > ( High - BullBearZone ); //Truong gia tang bearbar = C < ( Low + BullBearZone ); //Truong gia giam // mx = [row 0][col 0] // price levels in first column [0][0] and relative volume at that level in second column [0][1] // https://www.amibroker.com/guide/afl/pricevoldistribution.html 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 ]; // Volume for that bin 1... //printf( "mx=%g", MaxVolume / 100000 ); } // rectangle height RecHeight = ( mx[ 1 ][ 0 ] - mx[ 0 ][ 0 ] ) / 2 * pRecHeight; GfxSelectFont( "Arial", 7 ); // Change the text size here for( i = 0; i < bins; i++ ) { // mx1 = Bull 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; bullColor = ColorBlend( colorSeaGreen, GetChartBkColor(), 0.2 ); GfxFillSolidRect( x1, y1, x2, y2, bullColor ); GfxSetBkColor( bullColor ); GfxSetTextColor( colorBrightGreen ); GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 ); // mx2 = Bear absVolume = mx2[ i ][ 1 ]; VolAcum += absVolume; relvolume = absVolume / MaxVolume; relbar2 = relvolume * ( lvb - fvb + 1 ); x1 = x2; x2 = x1 + relbar2; bearColor = ColorBlend( colorCustom16, GetChartBkColor(), 0.2 ); GfxFillSolidRect( x1, y1, x2, y2, bearColor ); GfxSetBkColor( bearColor ); GfxSetTextColor( colorRed ); GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 ); // mx = All Bars absVolume = mx[ i ][ 1 ]; relvolume = ( absVolume - VolAcum ) / MaxVolume; relbar3 = relvolume * ( lvb - fvb + 1 ); x1 = x2; x2 = x1 + relbar3; midColor = ColorBlend( colorGrey40, GetChartBkColor(), 0.2 ); GfxFillSolidRect( x1, y1, x2, y2, midColor ); GfxSetBkColor( midColor ); GfxSetTextColor( colorBlack ); GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 ); } }