Background shading?

 
Is it possible to shade in areas of the chart background? I tried iterating through minutes and drawing vertical lines, but that creates a million objects and isn't the most efficient way to do it. I just want to shade NY hours.

thanks,
Jack
 
Try to use rectangles: Insert - Shapes - Rectangle.
 
//+------------------------------------------------------------------+
//| 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;
iWidth=(MAX_DAYS_TO_SHADE*PERIOD_D1)/Period();
// find start of first day to shade
in=iBars(NULL,0);
for(i=iWidth; i<in; 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;
}
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);
}
//+------------------------------------------------------------------+

Edit NY_OPEN_HH, NY_OPEN_MM, NY_CLOSE_HH and NY_CLOSE_MM to suit your local time, also MAX_DAYS_TO_SHADE can be changed. Take care.
 
it is not like I aligned it!
 
//+------------------------------------------------------------------+
//|                                                      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;
   iWidth=(MAX_DAYS_TO_SHADE*PERIOD_D1)/Period();
   // find start of first day to shade
   in=iBars(NULL,0);
   for(i=iWidth; i<in; 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;  
     }
   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);
  }
//+------------------------------------------------------------------+
 
I missed out iStart in init() function.

//+------------------------------------------------------------------+
//|                                                      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;
   iWidth=(MAX_DAYS_TO_SHADE*PERIOD_D1)/Period();
   // find start of first day to shade
   in=iBars(NULL,0);
   for(i=iWidth; i<in; 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);
  }
//+------------------------------------------------------------------+
 
Whoa...

Thats much more complicated than I thought it'd be! Thanks a lot. Gonna go play with it right now.

thanks,
Jack
 
Jack, in line 53 changed variable "in" to "ib" in init() function.

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