MktFlwAnlMth

MktFlwAnlMth
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
MktFlwAnlMth
//+----------------------------------------+
//|                  BREW_MktFlwAnlMth.mq4 |
//| Market Flow Analysis Method            |
//| http://www.forexforprofits.com         |
//+----------------------------------------+
#property  copyright "Copyright © 2011, Brewmanz"
#property link      "http://www.metaquotes.net/"

//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Lime
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_color2 Cyan
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
#property indicator_color3 Red
#property indicator_style3 STYLE_SOLID
#property indicator_width3 2
#property indicator_color4 Magenta
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1

#property indicator_color5 Lime
#property indicator_style5 STYLE_SOLID
#property indicator_width5 2
#property indicator_color6 Cyan
#property indicator_style6 STYLE_SOLID
#property indicator_width6 1
#property indicator_color7 Red
#property indicator_style7 STYLE_SOLID
#property indicator_width7 2
#property indicator_color8 Magenta
#property indicator_style8 STYLE_SOLID
#property indicator_width8 1

//#include <LibUtil.mqh>

//---- input parameters
extern string Comment1="Set UseSeparateChartAges to true to show how Highest High etc Bar Aging is working";
extern bool UseSeparateChartAges=false;
extern string Comment2="Set MaxAge to limit how long a Highest High etc is valid for";
extern int  MaxAge=999;

//---- display buffers
double buff_BarsSinceLastHH[];
double buff_BarsSinceHHAfterLL[];
double buff_BarsSinceLastLL[];
double buff_BarsSinceLLAfterHH[];

double buff_HH[];
double buff_HAfterL[];
double buff_LL[];
double buff_LAfterH[];

double buff_DBG[];

//---- work buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   string short_name;
   IndicatorBuffers(8);
   IndicatorDigits(Digits);
//---- indicator line

   SetIndexBuffer(0,buff_BarsSinceLastHH);
   SetIndexBuffer(1,buff_BarsSinceHHAfterLL);
   SetIndexBuffer(2,buff_BarsSinceLastLL);
   SetIndexBuffer(3,buff_BarsSinceLLAfterHH);
   SetIndexBuffer(4,buff_HH);
   SetIndexBuffer(5,buff_HAfterL);
   SetIndexBuffer(6,buff_LL);
   SetIndexBuffer(7,buff_LAfterH);
   if(UseSeparateChartAges)
   {
      SetIndexStyle( 0,DRAW_LINE);
      SetIndexStyle( 1,DRAW_LINE);
      SetIndexStyle( 2,DRAW_LINE);
      SetIndexStyle( 3,DRAW_LINE);
      SetIndexStyle( 4,DRAW_NONE);
      SetIndexStyle( 5,DRAW_NONE);
      SetIndexStyle( 6,DRAW_NONE);
      SetIndexStyle( 7,DRAW_NONE);
   }
   else
   {
      SetIndexStyle( 0,DRAW_NONE);
      SetIndexStyle( 1,DRAW_NONE);
      SetIndexStyle( 2,DRAW_NONE);
      SetIndexStyle( 3,DRAW_NONE);
      SetIndexStyle( 4,DRAW_LINE);
      SetIndexStyle( 5,DRAW_LINE);
      SetIndexStyle( 6,DRAW_LINE);
      SetIndexStyle( 7,DRAW_LINE);
   }

//---- name for DataWindow and indicator subwindow label
   short_name="MFAM("
   +")";

   IndicatorShortName(""+short_name);
   SetIndexLabel(0,"AgeHH");
   SetIndexLabel(1,"HH_AfterLL");
   SetIndexLabel(2,"AgeLL");
   SetIndexLabel(3,"LL_AfterHH");
   SetIndexLabel(4,"HH");
   SetIndexLabel(5,"HAfterL");
   SetIndexLabel(6,"LL");
   SetIndexLabel(7,"LAfterH");
//----
//   SetIndexDrawBegin(0,MaPeriod);
//----
   return(0);
}
//+------------------------------------------------------------------+
int start()
{

   int ix,ixLimit,counted_bars=IndicatorCounted();
//----
   if(counted_bars>0)counted_bars--;
   ixLimit = Bars-counted_bars-1;
//----
   for(ix=ixLimit;ix>=0;ix--)
   {
      if(ix==Bars-1)
      {
         // FirstEverBar
         buff_BarsSinceLastHH   [ix] = 0;
         buff_BarsSinceHHAfterLL[ix] = 0;
         buff_BarsSinceLastLL   [ix] = 0;
         buff_BarsSinceLLAfterHH[ix] = 0;
         continue;
      }

//--- New Bar?      
      static datetime NewBarTimeCheck = 0;
      bool IsNewBar = false;
      if(NewBarTimeCheck!=Time[ix])
      {  
         IsNewBar = true;
         NewBarTimeCheck = Time[ix];
      }

      // up age of all bars
      int barsToLastHH    = 1 + buff_BarsSinceLastHH   [ix+1];
      int barsToHHSinceLL = 1 + buff_BarsSinceHHAfterLL[ix+1];
      int barsToLastLL    = 1 + buff_BarsSinceLastLL   [ix+1];
      int barsToLLSinceHH = 1 + buff_BarsSinceLLAfterHH[ix+1];

      // note any extreme price action
      if(High[ix] > High[ix+barsToLastHH])
         barsToLastHH = 0;
      if(High[ix] > High[ix+barsToHHSinceLL])
         barsToHHSinceLL = 0;
      
      if(Low[ix] < Low[ix+barsToLastLL])
         barsToLastLL = 0;
      if(Low[ix] < Low[ix+barsToLLSinceHH])
         barsToLLSinceHH = 0;
         
      // check if Max Age has been exceeded
      if(barsToLastHH    > MaxAge)
         barsToLastHH    = iHighest(NULL, Period(), MODE_HIGH, MaxAge, ix) - ix;
      if(barsToHHSinceLL > MaxAge)
         barsToHHSinceLL = iHighest(NULL, Period(), MODE_HIGH, MaxAge, ix) - ix;
      if(barsToLastLL    > MaxAge)
         barsToLastLL    = iLowest (NULL, Period(), MODE_LOW,  MaxAge, ix) - ix;
      if(barsToLLSinceHH > MaxAge)
         barsToLLSinceHH = iLowest (NULL, Period(), MODE_LOW,  MaxAge, ix) - ix;
      
      // check new HH then we have new Active Lo created
      switch(barsToLastHH)
      {
      case 0:
         barsToLastLL = barsToLLSinceHH;
         break;
      case 1:
         barsToLLSinceHH = 0;
         break;
      }

      // check new LL then we have new Active Hi created
      switch(barsToLastLL)
      {
      case 0:
         barsToLastHH = barsToHHSinceLL;
         break;
      case 1:
         barsToHHSinceLL = 0;
         break;
      }

      buff_BarsSinceLastHH   [ix] = barsToLastHH;
      buff_BarsSinceHHAfterLL[ix] = barsToHHSinceLL;
      buff_BarsSinceLastLL   [ix] = barsToLastLL;
      buff_BarsSinceLLAfterHH[ix] = barsToLLSinceHH;
         
      buff_HH     [ix] = High[ix + barsToLastHH];
      buff_HAfterL[ix] = High[ix + barsToHHSinceLL];
      buff_LL     [ix] = Low [ix + barsToLastLL];
      buff_LAfterH[ix] = Low [ix + barsToLLSinceHH];
   }
//----
   return(0);
}
//+------------------------------------------------------------------+

Comments