//+------------------------------------------------------------------+
//|                                               xPivotMultiday.mq4 |
//|                                               Based on SDX-Pivots|
//|                                                  Coded by xecret |
//+------------------------------------------------------------------+
#property indicator_chart_window
extern int  LookBackDays=5, ServerTimeZone=2,LabelShift=9;
extern bool ShowPivot=true; 
                           extern color R_color=Red;      extern int R_style=1,      R_width=1; 
                           extern color S_color=Blue;     extern int S_style=1,      S_width=1;
                           extern color Pivot_color=Blue; extern int Pivot_style=0,  Pivot_width=2;                  
extern bool ShowFibo=true;
                           extern color Fibo_color=Blue; 
                           extern int   Fibo_style=2,Fibo_width=1;
extern bool ShowCamarilla=true;
                           extern color Camarilla_color=Black; 
                           extern int   Camarilla_style=2,Camarilla_width=1;
extern bool ShowOpen=true;
                           extern color Open_color=Black; 
                           extern int   Open_style=1,Open_width=1;
extern bool ShowTodayHighLow=True;
                           extern color TodayHighLow_color=Gray; 
                           extern int   TodayHighLow_style=1,TodayHighLow_width=1;
extern bool ShowYesterdayHighLow=true;
                           extern color YesterdayHighLow_color=Black; 
                           extern int   YesterdayHighLow_style=0,YesterdayHighLow_width=1;
extern bool ShowSweetSpots=true;
                           extern color SweetSpots_color=Orange; 
                           extern int   SweetSpots_style=2,SweetSpots_width=1;
extern string LabelFont="Arial";
extern int    LabelSize=6;
extern color  LabelColor=Black;
extern int    UpdateInterval=10;
double   H[100],L[100],O[100],C[100];
int      IdxOpen_H1[100],IdxClose_H1[100],Weekday[100],YesterdayOffset[100];
datetime TimeOpen_0[100],TimeClose_0[100];
string   Daymark[100];
datetime lasttime=0,timelastupdate=0;
int      TD, lastweekday=8;
int      RealLookBackDays;
int      PipDelta=1;
int init()
  {
   if(Digits==5 || Digits==3) PipDelta=10;
   TD=ServerTimeZone*3600;
   RealLookBackDays=MathMin(LookBackDays,MathFloor(Bars*Period()/1440)-2);
   int newsize=RealLookBackDays+3;
   ArrayResize(H,newsize);ArrayResize(L,newsize);ArrayResize(O,newsize);ArrayResize(C,newsize);
   ArrayResize(IdxOpen_H1,newsize);ArrayResize(IdxClose_H1,newsize);ArrayResize(Weekday,newsize);ArrayResize(YesterdayOffset,newsize);
   ArrayResize(TimeOpen_0,newsize);ArrayResize(TimeClose_0,newsize);ArrayResize(Daymark,newsize);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   int obj_total= ObjectsTotal();
   
   for (int i= obj_total; i>=0; i--) {
      string name= ObjectName(i);
    
      if (StringSubstr(name,0,7)=="[PIVOT]") 
         ObjectDelete(name);
   }   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   if(TimeDayOfWeek(Time[0]-TD)!=lastweekday){
     lastweekday=TimeDayOfWeek(Time[0]-TD);
     ComputeData(RealLookBackDays);
     double today_high,today_low,today_open,yesterday_high,yesterday_low,yesterday_close;
     double d,q,p,r1,r2,r3,s1,s2,s3,h3,h4,l3,l4;
     for(int i=0;i<=RealLookBackDays;i++){
       today_high=H[i];today_low=L[i];today_open=O[i];
       yesterday_high=H[i+YesterdayOffset[i]];yesterday_low=L[i+YesterdayOffset[i]];yesterday_close=C[i+YesterdayOffset[i]];
     
       if(ShowPivot){
         d = (today_high - today_low);
         q = (yesterday_high - yesterday_low);
         p = (yesterday_high + yesterday_low + yesterday_close) / 3;
         
         r1 = (2*p)-yesterday_low;
         r2 = p+(yesterday_high - yesterday_low);              //	r2 = p-s1+r1;
	      r3 = (2*p)+(yesterday_high-(2*yesterday_low));
         s1 = (2*p)-yesterday_high;
         s2 = p-(yesterday_high - yesterday_low);              //	s2 = p-r1+s1;
	      s3 = (2*p)-((2* yesterday_high)-yesterday_low);
	      SetLevel("R1", r1,      R_color, R_style, TimeOpen_0[i],TimeClose_0[i],i,R_width);
         SetLevel("R2", r2,      R_color, R_style, TimeOpen_0[i],TimeClose_0[i],i,R_width);
         SetLevel("R3", r3,      R_color, R_style, TimeOpen_0[i],TimeClose_0[i],i,R_width);
           
         SetLevel("Pivot", p,    Pivot_color, Pivot_style, TimeOpen_0[i],TimeClose_0[i],i,Pivot_width);
            
         SetLevel("S1", s1,      S_color, S_style, TimeOpen_0[i],TimeClose_0[i],i,S_width);
         SetLevel("S2", s2,      S_color, S_style, TimeOpen_0[i],TimeClose_0[i],i,S_width);
         SetLevel("S3", s3,      S_color, S_style, TimeOpen_0[i],TimeClose_0[i],i,S_width);
       }
        
       if(ShowFibo){
         SetLevel("L-62%", yesterday_low - q*0.618,      Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("L-38%", yesterday_low - q*0.382,      Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("L+38%", yesterday_low + q*0.382,      Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("LH50%", yesterday_low + q*0.5,        Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("H-38%", yesterday_high - q*0.382,    Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("H+38%", yesterday_high + q*0.382,    Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
         SetLevel("H+62%", yesterday_high +  q*0.618,   Fibo_color, Fibo_style, TimeOpen_0[i],TimeClose_0[i],i,Fibo_width);
       }
        
       if (ShowCamarilla==true) {
         h4 = (q*0.55)+yesterday_close;
	      h3 = (q*0.27)+yesterday_close;
	      l3 = yesterday_close-(q*0.27);	
	      l4 = yesterday_close-(q*0.55);	
	        
         SetLevel("H3", h3,   Camarilla_color, Camarilla_style, TimeOpen_0[i],TimeClose_0[i],i,Camarilla_width);
         SetLevel("H4", h4,   Camarilla_color, Camarilla_style, TimeOpen_0[i],TimeClose_0[i],i,Camarilla_width);
         SetLevel("L3", l3,   Camarilla_color, Camarilla_style, TimeOpen_0[i],TimeClose_0[i],i,Camarilla_width);
         SetLevel("L4", l4,   Camarilla_color, Camarilla_style, TimeOpen_0[i],TimeClose_0[i],i,Camarilla_width);
       }
     
       if (ShowOpen) {         
         SetLevel("T Open", today_open,      Open_color, Open_style, TimeOpen_0[i],TimeClose_0[i],i,Open_width);
       }
       if (ShowTodayHighLow){
         SetLevel("T High", today_high,  TodayHighLow_color, TodayHighLow_style, TimeOpen_0[i],TimeClose_0[i],i,TodayHighLow_width);         
         SetLevel("T Low", today_low,    TodayHighLow_color, TodayHighLow_style, TimeOpen_0[i],TimeClose_0[i],i,TodayHighLow_width);         
       }     
       if (ShowYesterdayHighLow){  
         SetLevel("Y High", yesterday_high,  YesterdayHighLow_color, YesterdayHighLow_style, TimeOpen_0[i],TimeClose_0[i],i,YesterdayHighLow_width);         
         SetLevel("Y Low", yesterday_low,    YesterdayHighLow_color, YesterdayHighLow_style, TimeOpen_0[i],TimeClose_0[i],i,YesterdayHighLow_width);
       }    
       
       SetTimeLine("Start"+i, WeekDayToChar(Weekday[i]), TimeOpen_0[i], CadetBlue, O[i] - 10*Point*PipDelta);
     }
     
   }
        
   UpdateToday();
   
   return(0);
}  
//+------------------------------------------------------------------+
void ComputeData(int lookbackdays)
{
  int i,j;
  IdxClose_H1[0]=0;
  //TimeClose_0[0]=Time[0];
  TimeClose_0[0]=Time[0]+Period()*60;
  for(i=0;i<=lookbackdays+2;i++){
    Weekday[i]=TimeDayOfWeek(iTime(NULL,PERIOD_H1,IdxClose_H1[i])-TD);
    for(j=IdxClose_H1[i]+1;j<=IdxClose_H1[i]+24;j++){
      if(TimeDayOfWeek(iTime(NULL,PERIOD_H1,j)-TD)!=Weekday[i]){
        IdxOpen_H1[i]=j-1;
        IdxClose_H1[i+1]=j;
        break;        
      }      
    }
    C[i]=iClose(NULL,PERIOD_H1,IdxClose_H1[i]);
    O[i]=iOpen(NULL,PERIOD_H1,IdxOpen_H1[i]);
    H[i]=iHigh(NULL,PERIOD_H1,iHighest(NULL,PERIOD_H1,MODE_HIGH,IdxOpen_H1[i]-IdxClose_H1[i]+1,IdxClose_H1[i]));
    L[i]=iLow(NULL,PERIOD_H1,iLowest(NULL,PERIOD_H1,MODE_LOW,IdxOpen_H1[i]-IdxClose_H1[i]+1,IdxClose_H1[i]));
    TimeOpen_0[i]=iTime(NULL,PERIOD_H1,IdxOpen_H1[i]);
    TimeClose_0[i+1]=iTime(NULL,0,iBarShift(NULL,0,TimeOpen_0[i])+1);
  }
  
  for(i=0;i<=lookbackdays;i++){
    for(j=1;j<=3;j++){
      if(Weekday[i+j]!=0 && Weekday[i+j]!=6){
        YesterdayOffset[i]=j;
        break;
      }
    }
    Daymark[i]=WeekDayToChar(Weekday[i]);
  }
  Daymark[0]="";
  Daymark[YesterdayOffset[0]]=Daymark[YesterdayOffset[0]] + "(Y)";
}
void SetLevel(string text, double level, color col1, int linestyle, datetime startofday, datetime endofday=0,int IdxDay=1,int Width=1)
{
   if(endofday==0) endofday=Time[0];
   int digits= Digits;
   text=  Daymark[IdxDay] + " " + text;
   string labelname= "[PIVOT] " + text + " Label"+IdxDay,
          linename= "[PIVOT] " + text + " Line"+IdxDay,
          pricelabel; 
   // create or move the horizontal line   
   if (ObjectFind(linename) != 0) {
      ObjectCreate(linename, OBJ_TREND, 0, startofday, level, endofday,level);
      ObjectSet(linename, OBJPROP_STYLE, linestyle);
      ObjectSet(linename, OBJPROP_COLOR, col1);
      ObjectSet(linename, OBJPROP_WIDTH, Width);
      if(IdxDay!=0) ObjectSet(linename, OBJPROP_RAY, false);
   }
   else {
      ObjectMove(linename, 1, endofday,level);
      ObjectMove(linename, 0, startofday, level);
   }
   
   // put a label on the line   
   datetime lableposition;
   if(IdxDay<1) lableposition=Time[0]+Period()*60*LabelShift;else lableposition=startofday+Period()*60*LabelShift;
   if (ObjectFind(labelname) != 0) {
      ObjectCreate(labelname, OBJ_TEXT, 0, lableposition, level);
   }
   else {
      ObjectMove(labelname, 0, lableposition, level);
   }
   pricelabel=text;
   //if (ShowLevelPrices && StrToInteger(text)==0) 
   //   pricelabel= pricelabel + ": "+DoubleToStr(level, Digits);
   
   ObjectSetText(labelname, pricelabel, LabelSize, LabelFont, LabelColor);
}
void SetTimeLine(string objname, string text, datetime x, color col1, double vleveltext) 
{
   string name= "[PIVOT] " + objname;
   //int x= iTime(NULL, PERIOD_H1, idx);
   if (ObjectFind(name) != 0) 
      ObjectCreate(name, OBJ_TREND, 0, x, 0, x, 100);
   else {
      ObjectMove(name, 0, x, 0);
      ObjectMove(name, 1, x, 100);
   }
   
   ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
   ObjectSet(name, OBJPROP_COLOR, DarkGray);
   
   if (ObjectFind(name + " Label") != 0) 
      ObjectCreate(name + " Label", OBJ_TEXT, 0, x, vleveltext);
   else
      ObjectMove(name + " Label", 0, x, vleveltext);
            
   ObjectSetText(name + " Label", text, 8, "Arial", col1);
}
void UpdateToday(){
  
  if(Time[0]!=lasttime){
    lasttime=Time[0]; 
    if(ShowPivot){
      MoveToday("R3");MoveToday("R2");MoveToday("R1");           MoveToday("Pivot");
      MoveToday("S1");MoveToday("S2");MoveToday("S3");
    }
    if(ShowFibo){  
      MoveToday("L-62%");MoveToday("L-38%");MoveToday("L+38%");  MoveToday("LH50%");
      MoveToday("H-38%");MoveToday("H+38%");MoveToday("H+62%");
    }
    if(ShowCamarilla){    
      MoveToday("H3");MoveToday("H4");MoveToday("L3");MoveToday("L4");
    }
    if(ShowYesterdayHighLow){    
      MoveToday("Y High");MoveToday("Y Low");MoveToday("T Open");
    }
    if(ShowOpen){    
      MoveToday("T Open");
    }
  }
  
  if (TimeCurrent()-timelastupdate < UpdateInterval) return (0);      
  timelastupdate= TimeCurrent();
  
  if (ShowTodayHighLow) {  
    IdxOpen_H1[0]=iBarShift(NULL,PERIOD_H1,TimeOpen_0[0]);
    IdxClose_H1[0]=0;
    H[0]=iHigh(NULL,PERIOD_H1,iHighest(NULL,PERIOD_H1,MODE_HIGH,IdxOpen_H1[0]-IdxClose_H1[0]+1,IdxClose_H1[0]));
    L[0]=iLow(NULL,PERIOD_H1,iLowest(NULL,PERIOD_H1,MODE_LOW,IdxOpen_H1[0]-IdxClose_H1[0]+1,IdxClose_H1[0]));    
    SetLevel("T High", H[0],  Black, STYLE_DASH, TimeOpen_0[0],TimeClose_0[0],0);         
    SetLevel("T Low", L[0],    Black, STYLE_DASH, TimeOpen_0[0],TimeClose_0[0],0);         
  }
  
  if (ShowSweetSpots) {
    int ssp1, ssp2;
    double ds1, ds2;
      
    ssp1= Bid / Point;
    ssp1= ssp1 - ssp1%(50*PipDelta);
    ssp2= ssp1 + 50*PipDelta;
      
    ds1= ssp1*Point;
    ds2= ssp2*Point;
      
    SetLevel(DoubleToStr(ds1,Digits), ds1,  SweetSpots_color, SweetSpots_style, Time[10],Time[0]+Period()*60*LabelShift,-1,SweetSpots_width);
    SetLevel(DoubleToStr(ds2,Digits), ds2,  SweetSpots_color, SweetSpots_style, Time[10],Time[0]+Period()*60*LabelShift,-1,SweetSpots_width);
  }
}
string WeekDayToChar(int weekday){
  switch(weekday){
    case 0: return("Sun");
    case 1: return("Mon");
    case 2: return("Tue");
    case 3: return("Wed");
    case 4: return("Thu");
    case 5: return("Fri");
    case 6: return("Sat");
    default: return("Err");
  }
}
void MoveToday(string text){
  ObjectSet("[PIVOT]  " + text + " Label0",OBJPROP_TIME1,Time[0]+Period()*60*LabelShift);
}
             
            
            
            
Comments