This script is designed to enhance your trading chart by visually highlighting specific market sessions, making it easier to identify periods of high activity or volatility at a glance. Instead of looking at a plain price graph, this tool overlays colored background boxes that correspond to major global trading windows.
How the Logic Works
1. Session Customization The script allows you to define three distinct trading sessions (such as European, American, and Asian/Australian). For each session, you can independently set:
- Start and End Times: Define exactly when the trading window begins and ends.
- Visual Styling: Choose unique colors for each session so you can instantly distinguish between different global markets.
- Historical Depth: You can choose how many days into the past the script should display these highlights.
2. Automatic Boundary Detection Rather than just drawing a box from the top to the bottom of your screen, the script intelligently calculates the price range for each specific session. It scans the historical data to find the "Highest High" and "Lowest Low" reached during that specific time window. It then draws the colored box to perfectly fit that price movement. This ensures that the shading stays relevant to the actual market action of that day.
3. Smart Time Navigation The script includes an internal calendar logic to ensure the highlights are placed correctly across different days. It is programmed to navigate through the trading history day-by-day, skipping weekends (Saturday and Sunday) and correctly handling complex calendar transitions, such as months with different numbers of days and leap years.
4. Dynamic Chart Overlay The tool operates in the "background" of your chart. This means it provides a clear visual guide without obstructing the candles or other technical indicators you may be using. When the script loads, it automatically generates the necessary objects on your screen; when you remove the script, it cleans up the chart by deleting all the boxes, leaving your workspace tidy.
Summary of Benefits
By automating the identification of market sessions, this script removes the guesswork of "where" a session happened. It provides a clear visual map of historical volatility, helping traders see where price action was most concentrated during specific times of the day.
//+-------------------------------------------------------------------------------+
//| MarketHoursShade_v01.mq4 |
//| Originally by KimIV |
//| http://www.kimiv.ru |
//| |
//| 23.11.2005 |
//| |
//| 29 Nov 06: Modified by Derk Wehler to be readable. |
//| Added/Changed a couple of input parameter defaults |
//| No other changes. |
//| |
//+-------------------------------------------------------------------------------+
#property copyright "Derk Wehler"
#property link "none"
//----
#property indicator_chart_window
//------- -------------------------------
extern int NumberOfDays=50;
extern string s1 ="European";
extern color Color_1 =C'60, 60, 60';
extern string Begin_1 ="07:00";
extern string End_1 ="17:00";
extern string s2 ="";
extern string s3 ="American";
extern color Color_2 =C'80, 80, 80';
extern string Begin_2 ="13:00";
extern string End_2 ="23:00";
extern string s4 ="";
extern string s5 ="Asian/Austrailian";
extern color Color_3 =C'100, 100, 100';
extern string Begin_3 ="23:00";
extern string End_3 ="09:00";
extern bool HighRange =true;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void init()
{
DeleteObjects();
for(int i=0; i < NumberOfDays; i++)
{
CreateObjects("PWT1"+i, Color_1);
CreateObjects("PWT2"+i, Color_2);
CreateObjects("PWT3"+i, Color_3);
}
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void deinit()
{
DeleteObjects();
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CreateObjects(string no, color cl)
{
ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
ObjectSet(no, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(no, OBJPROP_COLOR, cl);
ObjectSet(no, OBJPROP_BACK, True);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DeleteObjects()
{
for(int i=0; i < NumberOfDays; i++)
{
ObjectDelete("PWT1"+i);
ObjectDelete("PWT2"+i);
ObjectDelete("PWT3"+i);
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
{
datetime dt=CurTime();
for(int i=0; i < NumberOfDays; i++)
{
DrawObjects(dt, "PWT1"+i, Begin_1, End_1);
DrawObjects(dt, "PWT2"+i, Begin_2, End_2);
DrawObjects(dt, "PWT3"+i, Begin_3, End_3);
dt=decDateTradeDay(dt);
//----
while(TimeDayOfWeek(dt) > 5)
dt=decDateTradeDay(dt);
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te)
{
datetime t1, t2;
double p1, p2;
int b1, b2;
//----
t1=StrToTime(TimeToStr(dt, TIME_DATE) + " " + tb);
t2=StrToTime(TimeToStr(dt, TIME_DATE) + " " + te);
b1=iBarShift(NULL, 0, t1);
b2=iBarShift(NULL, 0, t2);
p1=High[Highest(NULL, 0, MODE_HIGH, b1-b2, b2)];
p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2, b2)];
//----
if (!HighRange)
{
p1=0;
p2=2 * p2;
}
ObjectSet(no, OBJPROP_TIME1 , t1);
ObjectSet(no, OBJPROP_PRICE1, p1);
ObjectSet(no, OBJPROP_TIME2 , t2);
ObjectSet(no, OBJPROP_PRICE2, p2);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
datetime decDateTradeDay (datetime dt)
{
int ty=TimeYear(dt);
int tm=TimeMonth(dt);
int td=TimeDay(dt);
int th=TimeHour(dt);
int ti=TimeMinute(dt);
td--;
if (td==0)
{
tm--;
if (tm==0)
{
ty--;
tm=12;
}
if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12)
td=31;
if (tm==2)
if (MathMod(ty, 4)==0)
td=29;
else
td=28;
if (tm==4 || tm==6 || tm==9 || tm==11)
td=30;
}
return(StrToTime(ty + "." + tm + "." + td + " " + th + ":" + ti));
}
//+------------------------------------------------------------------+
Comments