//+------------------------------------------------------------------+
//|                                                      xpPivot.mq4 |
//|                                         Developed by Coders Guru |
//|                                            http://www.xpworx.com |
//+------------------------------------------------------------------+

#property link      "http://www.xpworx.com"


#property indicator_chart_window
#property indicator_buffers 7

double R = 0;
double p = 0;
double r3 = 0;
double r2 = 0;
double r1 = 0;
double s1 = 0;
double s2 = 0;
double s3 = 0;

double buf0[] , buf1[], buf2[], buf3[], buf4[], buf5[], buf6[];


int init()
{
   SetIndexBuffer(0,buf0);
   SetIndexBuffer(1,buf1);
   SetIndexBuffer(2,buf2);
   SetIndexBuffer(3,buf3);
   SetIndexBuffer(4,buf4);
   SetIndexBuffer(5,buf5);
   SetIndexBuffer(6,buf6);
   SetIndexLabel(0, "Pivot");
   SetIndexLabel(1, "Resistance 1");
   SetIndexLabel(2, "Resistance 2");
   SetIndexLabel(3, "Resistance 3");
   SetIndexLabel(4, "Support 1");
   SetIndexLabel(5, "Support 2");
   SetIndexLabel(6, "Support 3");
   
   return(0);
}

int deinit()
{
   ObjectsDeleteAll();
   return(0);
}

void start()
{
   Draw_Pivots();
   return(0);
}

void Draw_Pivots()
{

   double rates[1][6],yesterday_close,yesterday_high,yesterday_low;
   ArrayCopyRates(rates, Symbol(), PERIOD_D1);

   if(DayOfWeek() == 1)
   {
      if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,1)) == 5)
      {
          yesterday_close = rates[1][4];
          yesterday_high = rates[1][3];
          yesterday_low = rates[1][2];
      }
      else
      {
         for(int d = 5;d>=0;d--)
         {
            if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,d)) == 5)
            {
                yesterday_close = rates[d][4];
                yesterday_high = rates[d][3];
                yesterday_low = rates[d][2];
            }
         
         }  
      }
   }
   else
   {
       yesterday_close = rates[1][4];
       yesterday_high = rates[1][3];
       yesterday_low = rates[1][2];
   }


   //---- Calculate Pivots

   R = yesterday_high - yesterday_low;//range

   p = (yesterday_high + yesterday_low + yesterday_close)/3;// Standard Pivot
   r3 = yesterday_high + 2 * (p - yesterday_low);
   r2 = p + ((p * 2) - yesterday_low - ((p * 2) - yesterday_high));
   r1 = (p * 2) - yesterday_low;
   s1 = (p * 2) - yesterday_high;
   s2 = p - ((p * 2) - yesterday_low - ((p * 2) - yesterday_high));
   s3 = yesterday_low - 2 * (yesterday_high - p);

   drawLine(r3,"R3", DarkGreen,0,0);
   drawLabel("Resistance 3",r3,DarkGreen);
   drawLine(r2,"R2", DarkGreen,0,0);
   drawLabel("Resistance 2",r2,DarkGreen);
   drawLine(r1,"R1", DarkGreen,0,0);
   drawLabel("Resistance 1",r1,DarkGreen);

   drawLine(p,"PIVIOT",DimGray,1,1);
   drawLabel("Piviot level",p,DimGray);

   drawLine(s1,"S1",Maroon,0,0);
   drawLabel("Support 1",s1,Maroon);
   drawLine(s2,"S2",Maroon,0,0);
   drawLabel("Support 2",s2,Maroon);
   drawLine(s3,"S3",Maroon,0,0);
   drawLabel("Support 3",s3,Maroon);
   
   WindowRedraw();
   
   for (int i = 0; i < 100; i++) 
   {
      buf0[i] = p;
      buf1[i] = r1;
      buf2[i] = r2;
      buf3[i] = r3;
      buf4[i] = s1;
      buf5[i] = s2;
      buf6[i] = s3;
   }
}

void drawLabel(string name,double lvl,color Color)
{
    if(ObjectFind(name) != 0)
    {
        ObjectCreate(name, OBJ_TEXT, 0, Time[10], lvl);
        ObjectSetText(name, name, 8, "Arial", EMPTY);
        ObjectSet(name, OBJPROP_COLOR, Color);
    }
    else
    {
        ObjectMove(name, 0, Time[10], lvl);
    }
}

void drawLine(double lvl,string name, color Col,int type,int width)
{
         if(ObjectFind(name) == -1)
         {
            ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl);
            
            if(type == 1)
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            else
            ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
            
            ObjectSet(name, OBJPROP_COLOR, Col);
            ObjectSet(name,OBJPROP_WIDTH,width);
            
         }
         else
         {
            ObjectDelete(name);
            ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl);
            
            if(type == 1)
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            else
            ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
            
            ObjectSet(name, OBJPROP_COLOR, Col);        
            ObjectSet(name,OBJPROP_WIDTH,width);
          
         }
         WindowRedraw();
}  

