ShadeNY_v5b
Download scriptThis script is designed to enhance your trading chart by visually highlighting specific market sessions—such as the New York session—using shaded colored rectangles. By clearly marking these time windows, it allows traders to quickly identify high-volatility periods or specific trading hours at a glance without having to manually calculate time differences.
Core Logic and Functionality
Session Identification and Time Synchronization The script works by calculating the specific opening and closing times of a chosen exchange based on two different time zones: your broker's server time and the actual local time of the exchange (e.g., New York). It automatically calculates the offset between these two zones, ensuring that the shaded areas appear correctly regardless of where your server is located.
Dynamic Chart Compatibility The tool is designed to be versatile across different chart scales. It automatically detects the timeframe you are viewing and adjusts the session blocks to align with those bars. This ensures that whether you are looking at 1-minute, 5-minute, or 4-hour charts, the visual "blocks" remain consistent and accurate.
Automated Visual Mapping Once the script identifies the correct start and end times for a session:
- It scans back through your historical data (up to a user-defined number of days).
- It calculates the highest and lowest price points reached during that specific session window.
- It draws a rectangle covering that time period, spanning from the lowest price to the highest price.
- The color, style (solid or dashed lines), and transparency of these rectangles can be customized to suit your personal chart setup.
Real-Time Responsiveness To ensure the most accurate experience, the script includes a "Live Update" logic. If a new session starts while you are currently watching the market, the script can immediately trigger the shading for the current live period, providing real-time visual feedback as soon as the first price tick of the new session is received.
Performance and Efficiency To maintain smooth chart performance, the script is optimized to manage its "objects" (the rectangles) efficiently. It keeps track of every shape it creates on your screen and ensures that when the indicator is removed or updated, it cleans up the old data to prevent your chart from becoming cluttered or lagging.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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
extern string HelpText1 = "TRUE for solid, FALSE for frames"; // by Abhi
extern bool SolidRectangle = false; // by Abhi; if false shows rectangle frame
extern string HelpText2 = "0 - solid 1 - dash 2 - dot etc..."; // by Abhi
extern int FrameStyle = 0; // by Abhi
#define MAX_DAYS_TO_SHADE 5 // maximum number of days back from last chart date to be shaded
#define SERVER_TIME_ZONE +2 // MetaTrader server time zone, compare CurTime() with Greenwich GMT
#define EXCHANGE_TIME_ZONE -4 // Exchange time zone, example New York -4 GMT
#define SESSION_OPEN_HH 09 // session open hour (in local time at the exchange)
#define SESSION_OPEN_MM 30 // session open minutes (in local time at the exchange)
#define SESSION_CLOSE_HH 16 // session close hour (in local time at the exchange)
#define SESSION_CLOSE_MM 05 // 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);
ObjectSet(sName,OBJPROP_STYLE,FrameStyle);
ObjectSet(sName,OBJPROP_BACK,SolidRectangle);
// keep track of object names for tidying up upon exit
iCount=ArraySize(obj);
ArrayResize(obj, iCount+1);
obj[iCount]=sName;
}
}
return(0);
}
//+------------------------------------------------------------------+
Comments