3shadeopen
Download scriptThis script is designed to enhance your trading charts by visually highlighting specific market sessions—specifically the New York session—using colored shaded blocks. By providing a clear visual boundary of when these major trading periods occur, it helps traders identify high-volatility zones and key timeframes at a glance without having to manually calculate clock times.
Core Functionality
The tool automatically scans your historical chart data and draws rectangular "shaded" areas over the price candles that fall within the defined New York opening and closing hours. It works across various timeframes (ranging from 1-minute to 4-hour charts) to ensure that regardless of how zoomed in or out you are, the session boundaries remain consistent.
Key Features and Logic
- Automated Time Recognition: The script is programmed with specific start and end times for the New York session. It calculates these moments based on the date and time of each bar on your chart, ensuring the shading aligns perfectly with the actual market activity.
- Historical Backfilling: Upon loading the script, it looks back through your history (up to a set limit of 5 days) to "paint" the previous sessions. This allows you to analyze past price action and see how the market behaved during specific New York windows in previous days.
- Real-Time Dynamic Updating: For the current ongoing session, the script is designed for smooth performance. Instead of constantly redrawing old data, it identifies the live session and dynamically expands the shaded box as new price highs and lows are formed. This ensures the "current" session always covers the full range of price movement from start to finish in real-time.
- Visual Customization: You can easily choose the color of the shading (defaulting to Gold) to suit your personal chart aesthetics, making it easy to distinguish session zones from other technical indicators.
- Efficiency & Cleanup: The script is optimized to handle data quickly without slowing down your platform. Additionally, it includes a cleanup routine that removes all drawn shapes if you decide to take the indicator off the chart, keeping your workspace clean.
How it Benefits the Trader
By using this tool, you eliminate the guesswork of tracking time across different time zones. It provides an immediate visual "map" of the trading day, allowing you to see exactly where the New York volatility begins and ends, which is essential for identifying patterns, liquidity zones, and specific trading opportunities.
//+------------------------------------------------------------------+
//| 3shadeopen.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=Gold;
/*
// 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 06 // NY session open hour
#define NY_OPEN_MM 30 // NY session open minutes
#define NY_CLOSE_HH 13 // 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