xPivotMultiday





//+------------------------------------------------------------------+
//|                                               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);
}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: