ShadeNY
Download scriptThis script is designed to automatically highlight specific trading sessions—most notably the New York session—on your trading charts. By visually shading these time periods, it helps traders quickly identify high-activity zones without having to manually calculate start and end times.
Core Functionality
The tool works by scanning your historical price data and identifying the specific hours and minutes that constitute a designated trading session. Once these timeframes are identified, the script draws colored rectangular blocks over those sections of the chart. This provides a clear visual "map" of when the market is most active according to your preferred settings.
Key Technical Logic
- Timeframe Compatibility: The script is optimized for lower timeframes (specifically from 1-minute up to 4-hour charts). It automatically detects if a timeframe is too large to display these details effectively and will refrain from drawing if necessary.
- Automated Historical Backfilling: When you first load the script, it performs a "sweep" of your recent history (up to 5 days back). It identifies all past sessions and draws the corresponding shaded blocks instantly so that your chart is populated with historical context immediately.
- Dynamic Real-Time Updating: For the session currently in progress, the script uses a "widening" logic. Instead of constantly redrawing every historical block (which can slow down your computer), it only updates the dimensions of the current active box. As new price highs and lows are hit during the live session, the shaded area expands in real-time to encompass the full range of movement.
- Resource Efficiency: The logic is structured to be "lightweight." By distinguishing between completed historical sessions (which are drawn once) and the active session (which is updated dynamically), the script ensures that your trading platform remains responsive and smooth even while processing a large amount of data.
Customization
The tool allows you to choose a custom highlight color, ensuring the shaded areas stand out against your specific chart theme. It is pre-configured with standard session times, but the underlying logic is built to pinpoint the exact opening and closing ticks of the market for consistent visual accuracy.
//+------------------------------------------------------------------+
//| 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 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