//+------------------------------------------------------------------+
//|                                             shading new york.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                      ShadeNY.mq4 |
//|                                         Copyright © 2006, sx ted |
//| Purpose: shade NY sessions                                       |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, sx ted"
#property link      ""

#property indicator_chart_window

//---- input parameters
extern color     ShadeColor=Yellow;

/*
// if in Moscow
#define NY_OPEN_HH   17 // NY session open hour
#define NY_OPEN_MM   30 // NY session open minutes
#define NY_CLOSE_HH  00 // NY session close hour
#define NY_CLOSE_MM  05 // NY session close minutes
*/


// if in London
#define NY_OPEN_HH   14 // NY session open hour
#define NY_OPEN_MM   30 // NY session open minutes
#define NY_CLOSE_HH  21 // NY session close hour
#define NY_CLOSE_MM  05 // NY session close minutes


/*
// if in New York
#define NY_OPEN_HH   08 // NY session open hour
#define NY_OPEN_MM   30 // NY session open minutes
#define NY_CLOSE_HH  14 // NY session close hour
#define NY_CLOSE_MM  05 // NY session close minutes
*/

#define MAX_DAYS_TO_SHADE  5 // maximum number of days back from last chart date to be shaded

//---- global variables to program
datetime prevTime=D'01.01.2006';
string   obj[]; //array of object names
int      iWidth;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int in, i, io, ic, it, iStart=-1, ib;
   iWidth=(MAX_DAYS_TO_SHADE*PERIOD_D1)/Period();
   // find start of first day to shade
   ib=iBars(NULL,0);
   for(i=iWidth; i<ib; i++)
     {
      in=TimeYear(Time[i])*PERIOD_MN1*12+TimeMonth(Time[i])*PERIOD_MN1+TimeDay(Time[i])*PERIOD_D1;
      io=in+NY_OPEN_HH*60+NY_OPEN_MM;
      ic=in+NY_CLOSE_HH*60+NY_CLOSE_MM;
      it=in+TimeHour(Time[i])*60+TimeMinute(Time[i]);
      if(it>=io && it<=ic)
        {
         iStart=i;
        }
      else if(iStart>-1) break;  
     }
   if(iStart>-1) iWidth=iStart;
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   int iaCount=ArraySize(obj);
   for(int i=0; i<iaCount; i++)
     {
      if(ObjectFind(obj[i])>-1) ObjectDelete(obj[i]);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    iStart=-1, iEnd, in, io, ic, it, i;
   int    iaCount=ArraySize(obj), iPrv=0;
   double dLow, dHigh;
   
   if(Period()>PERIOD_H4) return(0);   // no shading
   if(prevTime == Time[0]) return(0);  // only start on complete bars
   
   for(i=0; i<iaCount; i++)
     {
      if(ObjectFind(obj[i])>-1) ObjectDelete(obj[i]);
     }
   iaCount=0;
   
   for(i=iWidth; i>0; i--)
     {
      in=TimeYear(Time[i])*PERIOD_MN1*12+TimeMonth(Time[i])*PERIOD_MN1+TimeDay(Time[i])*PERIOD_D1;
      io=in+NY_OPEN_HH*60+NY_OPEN_MM;
      ic=in+NY_CLOSE_HH*60+NY_CLOSE_MM;
      it=in+TimeHour(Time[i])*60+TimeMinute(Time[i]);
      if(it>=io && it<=ic)
        {
         if(in!=iPrv)   // new NY session
           {
            dLow=Low[i];
            dHigh=High[i];
            iStart=i;
            iPrv=in;
           }      
         dLow =MathMin(dLow,  Low[i]);
         dHigh=MathMax(dHigh, High[i]);
         iEnd=i;
        }
      else if(iStart>-1)
        {
         iaCount++;
         iaCount=ArrayResize(obj, iaCount);
         obj[iaCount-1]="ShadeNY_"+DoubleToStr(iPrv, 0);   // name for the object
         ObjectCreate(obj[iaCount-1],OBJ_RECTANGLE,0,Time[iStart],dLow-Point,Time[iEnd],dHigh+Point);
         ObjectSet(obj[iaCount-1],OBJPROP_COLOR,ShadeColor);
         iStart=-1;
        }  
     }
   if(iStart>-1)
     {
      iaCount++;
      iaCount=ArrayResize(obj, iaCount);
      obj[iaCount-1]="ShadeNY_"+DoubleToStr(iPrv, 0);   // name for the object
      ObjectCreate(obj[iaCount-1],OBJ_RECTANGLE,0,Time[iStart],dLow-Point,Time[iEnd],dHigh+Point);
      ObjectSet(obj[iaCount-1],OBJPROP_COLOR,ShadeColor);
     } 
   
   prevTime=Time[0];
   return(0);
  }
//+------------------------------------------------------------------+