Author: Copyright � 2006, sx ted
ShadeNY_v5

This tool is designed to enhance your trading charts by visually highlighting specific market sessions—such as the New York session—using colored shading. By providing a clear visual boundary for these trading periods, it allows traders to quickly identify high-activity zones on various timeframes.

Core Functionality

The script automatically identifies and shades the designated "open" and "close" hours of a specific market. It scans your historical data (up to 15 days back by default) and draws a colored rectangle over the price action for each day that the session occurred. This helps in recognizing recurring patterns, such as specific volatility windows or opening trends associated with major global exchanges.

Key Technical Features

  • Dynamic Timezone Coordination: The logic accounts for the difference between your trading platform's server time and the actual local time of the exchange (e.g., New York). It ensures that the shading aligns correctly with real-world market events regardless of where your server is located.
  • Smart Scaling & Compatibility: The script is designed to work seamlessly across multiple intraday timeframes, from 1-minute charts up to 4-hour charts. If you move to a timeframe higher than 4 hours, the script intelligently remains inactive to keep your chart clean.
  • Precision Calculations: It automatically calculates the duration of the session in seconds. This ensures that even if a session spans across midnight or involves complex time offsets, the shaded area accurately covers the intended period without "breaking" at the date change.
  • Real-Time Accuracy: With the "Immediacy" feature enabled, the script can react instantly to the start of a new session. It ensures that as soon as a new trading day begins, the shading is applied correctly even if the very first price movement hasn't fully completed a candle yet.
  • Automated Cleanup: To maintain platform performance, the script manages its own "objects." It keeps a registry of all shaded boxes and automatically clears them when you remove the indicator or refresh the chart, ensuring no leftover visual clutter remains.

User Customization

While the logic handles the heavy lifting of time conversions and historical scanning, users can easily tailor the experience by adjusting:

  • Visual Style: Choose your preferred highlight color.
  • Session Hours: Define exactly when a market opens and closes to match any global exchange.
  • Timezone Offsets: Adjust settings to account for Daylight Savings Time (DST) or specific server configurations.
Price Data Components
Series array that contains open time of each bar
Miscellaneous
It issuies visual alerts to the screen
10 Views
0 Downloads
0 Favorites
ShadeNY_v5
//+------------------------------------------------------------------+
//|                                                   ShadeNY_v5.mq4 |
//|                                         Copyright © 2006, sx ted |
//| Purpose: shade New York or other sessions for chart time frames  |
//|          M1 to H4 (at a push).                                   |
//| Notes..: To change chart time frame from M5 to M15 for example,  |
//|          click on M15, M5 and M15 again to force a chart refresh.|
//|          Modify the values of MAX_DAYS_TO_SHADE, SESSION_OPEN_HH,|
//|          SESSION_OPEN_MM, SESSION_CLOSE_HH and SESSION_CLOSE_MM  |
//|          to suit ***** THE LOCAL TIMES AT THE EXCHANGE *****.    |
//|          The values for SERVER_TIME_ZONE and EXCHANGE_TIME_ZONE  |
//|          are to be edited for DST when applicable.               |
//| 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.|
//|          3 - 2006.03.22 added "SetImmediacyON" input parameter   |
//|              which forces shading after first tick is received   |
//|              in the new session. Corrected case where bar is not |
//|              complete and session starts, and case when session  |
//|              covers two days when in Moscow (GMT+3 and greater). |
//|          4 - 2006.03.29 corrected for not taking into account the|
//|              difference between Local time and Server time.      |
//|          5 - 2006.04.03 corrected for Server time change, open   |
//|              and close times of exchange are now expressed in    |
//|              local times of the exchange.                        |
//|              Added new SERVER_TIME_ZONE and EXCHANGE_TIME_ZONE in|
//|              the #define section. Finally learnt about GMT time! |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2006, sx ted"
#property link      ""

#property indicator_chart_window

//---- input parameters
extern color     ShadeColor=Yellow;
extern bool      SetImmediacyON=true;  // if set ON forces shading after first tick in new session

#define MAX_DAYS_TO_SHADE   15          // maximum number of days back from last chart date to be shaded

#define SERVER_TIME_ZONE   +1          // MetaTrader server time zone, compare CurTime() with Greenwich GMT
#define EXCHANGE_TIME_ZONE -5          // Exchange time zone, example New York -4 GMT
#define SESSION_OPEN_HH    12          // session open hour (in local time at the exchange)
#define SESSION_OPEN_MM    00          // session open minutes (in local time at the exchange)
#define SESSION_CLOSE_HH   21          // session close hour (in local time at the exchange)
#define SESSION_CLOSE_MM   00          // session close minutes (in local time at the exchange)

//---- global variables to program
string  obj[];                         // array of object names

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if(Period() > PERIOD_H4) return(0); // no shading required
   // comment out or delete the following line when no longer required
   Alert( "ServerTime at ", ServerAddress(), " is ", TimeToStr( CurTime(),TIME_MINUTES ), "\nAdjust #define SERVER_TIME_ZONE if required" );
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i=0; i < ArraySize(obj); i++)
     {
      if(ObjectFind(obj[i]) > -1) ObjectDelete(obj[i]); // tidy up
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if(Period() > PERIOD_H4) return(0); // no shading required
   int    i, iCount, iAdjust,          // counters
          iStart, iEnd;                // x co-ordinates of object (index)
   double dLow, dHigh;                 // y co-ordinates of object   
   string sName;                       // name for the object
   int    iSessionDuration;            // session duration in seconds
   bool   ok;
   // adjust for difference between Server time and Local time at the exchange (in minutes)
   iAdjust=(SERVER_TIME_ZONE - EXCHANGE_TIME_ZONE) * 60;
   // determine open time of first bar in the session matching chart time frame in format " hh:mi"
   iStart=SESSION_OPEN_HH*60+SESSION_OPEN_MM+iAdjust;
   if(iStart > 24*60) iStart-=24*60;
   string sStart=" "+TimeToStr(StrToTime("2006.3.22")+(MathFloor(iStart/Period()) * Period() ) * 60, TIME_MINUTES);
   // calculate session duration in seconds, check if session covers two days (cater for GMT+3 and above)
   if(SESSION_OPEN_HH*60+SESSION_OPEN_MM >= SESSION_CLOSE_HH*60+SESSION_CLOSE_MM) iSessionDuration = ((23-SESSION_OPEN_HH+SESSION_CLOSE_HH)*60+59-SESSION_OPEN_MM+SESSION_CLOSE_MM+1)*60;
   else iSessionDuration = ( (SESSION_CLOSE_HH*60+SESSION_CLOSE_MM) - (SESSION_OPEN_HH*60+SESSION_OPEN_MM) )*60;
   // round session duration to suit an open time of chart time frame
   datetime tStart =StrToTime(TimeToStr(Time[0], TIME_DATE)+sStart);
   datetime tEnd   =StrToTime(TimeToStr(Time[0], TIME_DATE)+" "+DoubleToStr(SESSION_OPEN_HH ,0)+":"+DoubleToStr(SESSION_OPEN_MM ,0))+iSessionDuration+iAdjust*60;
   iSessionDuration=MathCeil((tEnd-tStart)/Period())*Period();
   // clear previous objects
   for(i=0; i < ArraySize(obj); i++)
     {
      if(ObjectFind(obj[i]) > -1) ObjectDelete(obj[i]);
     }
   for(i=MAX_DAYS_TO_SHADE; i >= 0; i--)
     {
      tStart=StrToTime(TimeToStr(iTime(NULL, PERIOD_D1, i), TIME_DATE)+sStart);
      tEnd  =tStart+iSessionDuration;
      iStart=iBarShift(NULL, 0, tStart, false);
      ok=(iStart > 0 && iStart < Bars-1 && TimeDayOfYear(tStart) == TimeDayOfYear(Time[iStart]));
      if(!ok && SetImmediacyON && CurTime() >= tStart && CurTime() < tEnd)
        {
         ok=true;
         iStart=1;
        }
      if(ok)  
        {
         iEnd=iBarShift(NULL, 0, tEnd, false);
         if(iEnd >= Bars-1) iEnd=0; // end not found, therefore current session
         while(iEnd < iStart && Time[iEnd] > tEnd) iEnd++; // cater for earlier close on Friday
         dLow =Low[Lowest(NULL,0,MODE_LOW,iStart-iEnd,iEnd)];
         dHigh=High[Highest(NULL,0,MODE_HIGH,iStart-iEnd,iEnd)];
         sName="Session_"+TimeToStr(iTime(NULL, PERIOD_D1, i), TIME_DATE);
         ObjectCreate(sName,OBJ_RECTANGLE,0,Time[iStart],dLow-Point,Time[iEnd],dHigh+Point);
         ObjectSet(sName,OBJPROP_COLOR,ShadeColor);
         // keep track of object names for tidying up upon exit
         iCount=ArraySize(obj);
         ArrayResize(obj, iCount+1);
         obj[iCount]=sName;
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+

Comments