Shade_NY_07__13_GMT

Download script
Author: Copyright � 2006, sx ted
Shade_NY_07__13_GMT

This tool is designed to provide a clear visual representation of specific trading sessions—most notably the New York session—directly on your price charts. By highlighting these periods, it helps traders quickly identify high-activity zones and distinguish between different market cycles throughout the day.

Core Functionality

The script automatically scans your historical chart data and identifies blocks of time that correspond to predefined session hours. Once identified, it draws a colored rectangular box over those specific timeframes. This allows you to see at a glance when major markets opened or closed, providing a cleaner, more organized view of the price action.

Key Logic Highlights

  • Timeframe Compatibility: The tool is optimized for lower and medium timeframes (ranging from 1-minute up to 4-hour charts). It automatically disables itself on higher timeframes where session shading would no longer provide meaningful detail.
  • Historical Depth: Rather than cluttering your entire account history, the script is designed to look back a specific number of days (defaulting to 5) from the current date to apply the shading.
  • Dynamic High/Low Detection: Instead of just drawing a fixed box, the logic constantly monitors the price during an active session. It tracks the highest and lowest prices reached within that timeframe, ensuring the shaded box accurately encompasses the total range of price movement for that period.
  • Real-Time Updates: The script is built to be efficient. While it handles historical data during the initial load, it also monitors the "live" candle. As the current session progresses and new highs or lows are hit, the tool dynamically expands the most recent shaded box in real-time.
  • Clean Interface: The script manages its own visual objects. When you remove the tool from your chart, it is designed to clean up and delete the drawn rectangles, leaving your workspace tidy.

User Experience

For the user, this means a more intuitive trading environment where "market context" is visible without needing to manually calculate time zones or check external clocks. You can choose your preferred highlight color to ensure the session blocks are easily distinguishable from other chart elements.

10 Views
0 Downloads
0 Favorites
Shade_NY_07__13_GMT
//+------------------------------------------------------------------+
//|                                                      ShadeNY.mq4 |
//|                                         Copyright © 2006, sx ted |
//| Purpose: shade New York or other sessions for chart time frames  |
//|          M1 to H4 (at a push).                                   |
//| version: 2 - enhanced for speed but with MT4 beeing so fast no   |
//|              difference will be noticed, all the sessions are    |
//|              shaded in the init(), last session if it is current |
//|              is widened in the start() in lieu of repainting all.|
//+------------------------------------------------------------------+
#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 07:00 - 13:00 GMT
#define NY_OPEN_HH   07 // NY session open hour
#define NY_OPEN_MM   00 // NY session open minutes
#define NY_CLOSE_HH  13 // NY session close hour
#define NY_CLOSE_MM  00 // 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
string obj[]; //array of object names
int    iPrevious=0, iStart=-1, iEnd;
double dLow, dHigh;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if(Period()>PERIOD_H4) return(0); // no shading required
   int iMaxBarsOnChart=iBars(NULL,0), i, iBarDay, iBarTime;
   // find approximate start of first day to shade
   int iBarsToDo=MathMin((MAX_DAYS_TO_SHADE*PERIOD_D1)/Period(),iMaxBarsOnChart);
   // find start of first day to shade
   for(i=iBarsToDo; i<iMaxBarsOnChart; i++)
     {
      iBarDay=TimeYear(Time[i])*PERIOD_MN1*12+TimeMonth(Time[i])*PERIOD_MN1+TimeDay(Time[i])*PERIOD_D1;
      iBarTime=iBarDay+TimeHour(Time[i])*60+TimeMinute(Time[i]);
      if(iBarTime>=iBarDay+NY_OPEN_HH*60+NY_OPEN_MM && iBarTime<=iBarDay+NY_CLOSE_HH*60+NY_CLOSE_MM) iStart=i;
      else if(iStart>-1) break;
     }
   if(iStart>-1) iBarsToDo=iStart;
   iStart=-1;
   // shade previous sessions and current session if started
   for(i=iBarsToDo; i>=0; i--)
     {
      iBarDay=TimeYear(Time[i])*PERIOD_MN1*12+TimeMonth(Time[i])*PERIOD_MN1+TimeDay(Time[i])*PERIOD_D1;
      iBarTime=iBarDay+TimeHour(Time[i])*60+TimeMinute(Time[i]);
      if(iBarTime>=iBarDay+NY_OPEN_HH*60+NY_OPEN_MM && iBarTime<=iBarDay+NY_CLOSE_HH*60+NY_CLOSE_MM)
        {
         if(iBarDay==iPrevious)   // current NY session
           {
            dLow =MathMin(dLow,  Low[i]);
            dHigh=MathMax(dHigh, High[i]);
           }
         else                     // new NY session
           {
            dLow=Low[i];
            dHigh=High[i];
            iStart=i;
            iPrevious=iBarDay;
           }
         iEnd=i;
        }
      else if(iStart>-1)
           {
            PaintRectangle();
            iStart=-1;
           }
     }
   if(iStart>-1) PaintRectangle(); // paint the last one if session not closed
   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 i=0, iBarDay, iBarTime;
   iBarDay=TimeYear(Time[i])*PERIOD_MN1*12+TimeMonth(Time[i])*PERIOD_MN1+TimeDay(Time[i])*PERIOD_D1;
   iBarTime=iBarDay+TimeHour(Time[i])*60+TimeMinute(Time[i]);
   if(iBarTime>=iBarDay+NY_OPEN_HH*60+NY_OPEN_MM && iBarTime<=iBarDay+NY_CLOSE_HH*60+NY_CLOSE_MM)
     {
      if(iBarDay==iPrevious)   // current NY session
        {
         dLow =MathMin(dLow,  Low[i]);
         dHigh=MathMax(dHigh, High[i]);
        }
      else                     // new NY session
        {
         dLow=Low[i];
         dHigh=High[i];
         iStart=i;
         iPrevious=iBarDay;
        }
      iEnd=i;
      PaintRectangle();
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Paint rectangle                                                  |
//+------------------------------------------------------------------+
void PaintRectangle()
  {
   string sObj="ShadeNY_"+DoubleToStr(iPrevious, 0); // name for the object
   if(ObjectFind(sObj)>-1)
     {
      // current session object found, so just widen it
      ObjectSet(sObj,OBJPROP_PRICE1,dLow-Point);
      ObjectSet(sObj,OBJPROP_TIME2 ,Time[iEnd]);
      ObjectSet(sObj,OBJPROP_PRICE2,dHigh+Point);
     }
   else
     {
      // otherwise create new object for the session
      int iaCount=ArraySize(obj);
      ArrayResize(obj, iaCount+1);
      obj[iaCount]=sObj;
      ObjectCreate(sObj,OBJ_RECTANGLE,0,Time[iStart],dLow-Point,Time[iEnd],dHigh+Point);
      ObjectSet(sObj,OBJPROP_COLOR,ShadeColor);
     }
  }
//+------------------------------------------------------------------+

Comments