//+------------------------------------------------------------------+
//|                                           smQuarters Fractals.mq4
//|                Support and Resistance 
//+------------------------------------------------------------------+

#property copyright "SwingMan 08.12.2015"
#property link      ""
#property strict

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 Lime
#property indicator_color2 Red

#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_FRACTAL_PRICE
  {
   Close_Price,
   HighLow_Price
  };

//-- Inputs
//+------------------------------------------------------------------+
input ENUM_FRACTAL_PRICE Fractal_Price=Close_Price;
//+------------------------------------------------------------------+

//---- buffers
double v1[];
double v2[];
double val1;
double val2;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
   int iArrow=59; //167; //119;

   SetIndexBuffer(0,v1); SetIndexArrow(0,iArrow);   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,0,Lime);  SetIndexLabel(0,"Resistance");
   SetIndexBuffer(1,v2); SetIndexArrow(1,iArrow);   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,0,Red); SetIndexLabel(1,"Support");

//SetIndexBuffer(0,v1); SetIndexArrow(0,iArrow);   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Lime);  SetIndexLabel(0,"Resistance");
//SetIndexBuffer(1,v2); SetIndexArrow(1,iArrow);   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red); SetIndexLabel(1,"Support");
//----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//int start()
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static datetime oldTime,newTime;
   int i=Bars-10;
//----
   if(prev_calculated==0)
     {
      ////--- counting from 0 to rates_total
      //ArraySetAsSeries(v1,false);
      //ArraySetAsSeries(v2,false);

      //ArraySetAsSeries(close,false);
      //ArraySetAsSeries(high,false);
      //ArraySetAsSeries(low,false);

      //ArraySetAsSeries(close,true);
      //ArraySetAsSeries(high,true);
      //ArraySetAsSeries(low,true);

      //--- first calculation or number of bars was changed
      ArrayInitialize(v1,0);
      ArrayInitialize(v2,0);
     }
//----
//==============================================
   if(Fractal_Price==Close_Price)
     {
      while(i>=0)
        {
         newTime=Time[i];
         if(newTime!=oldTime)
           {
            oldTime=newTime;
            //val1=iFractals(NULL,0,MODE_UPPER,i);
            val1=Get_Fractal(MODE_UPPER,close,i);
            //val1=Get_Fractal(MODE_UPPER,high,i);
            //val1=Get_Fractal2(MODE_UPPER,i);
            if(val1>0)
              {
               v1[i]=val1; //Close[i];
               v1[i+1]=val1;
               v1[i+2]=val1;
              }
            else v1[i]=v1[i+1];

            //val2=iFractals(NULL,0,MODE_LOWER,i);
            val2=Get_Fractal(MODE_LOWER,close,i);
            //val2=Get_Fractal(MODE_LOWER,low,i);
            //val2=Get_Fractal2(MODE_LOWER,i);
            if(val2>0)
              {
               v2[i]=val2; //Close[i];
               v2[i+1]=val2;
               v2[i+2]=val2;
              }
            else v2[i]=v2[i+1];
           }
         i--;
        }
     }
   else
//==============================================   
//-- Bill Williams fractals
   if(Fractal_Price==HighLow_Price)
     {
      while(i>=0)
        {
         newTime=Time[i];
         if(newTime!=oldTime)
           {
            oldTime=newTime;
              {
               val1=iFractals(NULL,0,MODE_UPPER,i);
               if(val1>0)
                  v1[i]=High[i];
               else v1[i]=v1[i+1];

               val2=iFractals(NULL,0,MODE_LOWER,i);
               if(val2>0)
                  v2[i]=Low[i];
               else v2[i]=v2[i+1];
              }
           }
         i--;
         }
        }
      //----
      //return(0);
      return(rates_total);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   double Get_Fractal(int fractalMode,const double &price[],int iBar)
     {
      double dFractal=-1;
      if(iBar<=2 || iBar>=Bars-2)
         return(dFractal);
      int medBar=iBar+2;
      double medPrice;
      //double dFractal=iFractals(NULL,0,fractalMode,iBar);
      string sss=Symbol();
      switch(fractalMode)
        {
         case MODE_UPPER:
            medPrice=price[medBar];
            if(medPrice>price[medBar+2] && medPrice>price[medBar+1] && 
               medPrice>price[medBar-2] && medPrice>price[medBar-1])
               dFractal=medPrice;
            break;
         case MODE_LOWER:
            medPrice=price[medBar];
            if(medPrice<price[medBar+2] && medPrice<price[medBar+1] && 
               medPrice<price[medBar-2] && medPrice<price[medBar-1])
               dFractal=medPrice;
            break;
        }

      return(dFractal);
     }
//+------------------------------------------------------------------+
