// Downloaded From https://www.WiseStockTrader.com
/*   
   VolSpikeDemo_01.afl

   Demo code by Progster in response to:

   http://finance.groups.yahoo.com/group/amibroker/message/124977

   This is Exploration code.

*/


MaxBack = 150;       // maximum number of bars to look back
MaxFwd = 30;         // maximum number of bar to look forward

//   Exploration parameters
ShowBack = ParamToggle("ShowBack","No|Yes",1);
LB = Param("LookBack",1,1,MaxBack,1);      //   LookBack (for vol spikes exactly this many bars ago)

ShowFwd = ParamToggle("ShowFwd","No|Yes",0);
LF = Param("LookFwd",10,1,MaxFwd,1);      //   LookFwd (for vol spikes up to this many bars in the future)

//   Array calculations
MA_V = (MA(V,MaxBack)) ;   
SD_V = StDev(V,MaxBack) ;
VolSpike = Volume > (MA_V + SD_V);

//   Use array function BarsSince() to look back  (convenient and fast)
BarsSinceVolSpike = BarsSince(VolSpike);


//   Use a loop to look forward   (less convenient, less fast)
BarsToVolSpike = -1 ;

if ( ShowFwd )
{
    for ( idx = 0 ; idx < ( BarCount - MaxFwd ); idx++ )
    {
        //   Since jdx is positive, we are looking into the future relative to the current bar
        for ( jdx = 1; jdx < MaxFwd; jdx++ )
        {
            if ( VolSpike[idx + jdx] )
            {
                BarsToVolSpike[idx] = jdx;
                break;
            }
        }
    }
}

//   Set exploration Filter according to whether we are looking back, forward, or both
if(ShowBack AND ShowFwd){
   Filter = (BarsSinceVolSpike == LB) OR (BarsToVolSpike >= 0) ;
}
else if ( ShowBack ){
   Filter = (BarsSinceVolSpike == LB) ;
}
else if ( ShowFwd ){
   Filter = (BarsToVolSpike >= 0) ;
}

//   Info at current bar
AddColumn( DateTime(), "cDate", formatDateTime );      //   c = "current"
/*
AddColumn(Volume, "cVolume" );
AddColumn(MA_V, "cMA_V" );
AddColumn(SD_V, "cSD_V" );
*/

//   Info at the previous VolSpike bar.  p = "previous" or "past"
if ( ShowBack )
{
   // Volume-based calcs with no particular formatting applied
    AddColumn( LB, "BarsBack" );
    AddColumn( Ref( DateTime(), -LB ), "pDate", formatDateTime );
    AddColumn( Ref( Volume, -LB ), "pVolume" );
    AddColumn( Ref( MA_V, -LB ), "pMA_V" );
    AddColumn( Ref( SD_V, -LB ), "pSD_V" );
}

//   Info at the next VolSpike bar.  f = "forward"

if ( ShowFwd )
{
    textColor = colorDefault ;
    BGColor = IIf( BarsToVolSpike < 0, colorRed, colorDefault ) ;      // Use Red BG color if no forward vol spike found

    //   Volume-based calcs formetted to 0 decimals
    AddColumn( BarsToVolSpike, "BarsFwd", 1.0, textColor, BGColor );
    AddColumn( Ref( DateTime(), BarsToVolSpike ), "fDate", formatDateTime, textColor, BGColor );
    AddColumn( Ref( Volume, BarsToVolSpike ), "fVolume", 1.0, textColor, BGColor );
    AddColumn( Ref( MA_V, BarsToVolSpike ), "fMA_V", 1.0, textColor, BGColor );
    AddColumn( Ref( SD_V, BarsToVolSpike ), "fSD_V", 1.0, textColor, BGColor );
}