How to get the values of PriceVolDistribution() bins using gfxTextOut or exploration or in title

Building on Tomasz Janeczko, Anderson Wilson and Beppe's code and ideas, I came up with the following AFL that shows the percentage of volume in the various rectangles representing the close in the candle thirds. Select the range required for the VAP by double clicking on the chart for your desired start and end candle. Double click on the blank region (right) to revert to all visible bars.
VAP
Here is the AFL:

/*
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.
*/
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 );
pRecHeight = Param( "Rectangle Height", 0.90, 0.10, 1, 0.05 );

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

// 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 );
    }
}


17 Likes