This script is designed to enhance the visual clarity of a trading chart by automatically highlighting specific time windows and price actions over a historical period. Instead of looking at a blank chart, it helps traders identify significant "working hours" or active sessions by painting defined areas directly on the screen.
Core Functionality
Time-Based Visualization The script allows you to define two distinct time blocks during the trading day. For example, you can set one block for morning volatility and another for afternoon trends. It takes the specific start and end times you provide and draws shaded rectangular zones on the chart for each of these periods.
Historical Backtracking Rather than only showing today's active sessions, the script can automatically look back over a significant amount of history (up to 50 days by default). It moves backward day-by-day, skipping weekends (Saturdays and Sundays), to populate your chart with consistent visual data from previous trading days.
Dynamic Price Mapping The tool doesn't just draw boxes at a fixed price; it intelligently analyzes the market data within those specific time windows:
- High/Low Detection: For each designated time block, the script identifies the highest and lowest prices reached during that window.
- Customizable Range: Depending on your settings, the script can either draw a box based on the actual high and low of that period or use a modified calculation to create a specific visual height for the zone.
User Experience Highlights
- Visual Organization: By using different colors for different time blocks, you can instantly distinguish between different market sessions (e.g., distinguishing a "London" session from a "New York" session).
- Automatic Cleanup: The script manages its own objects. When you load or remove it from your chart, it automatically cleans up the previous drawings to ensure your workspace remains organized and free of overlapping clutter.
- Seamless Integration: It works in the background to calculate dates and bar positions, meaning you don't have to manually measure timeframes; the script handles the math of converting hours into specific coordinates on your chart.
//+------------------------------------------------------------------+
//| i-ParamonWorkTime.mq4 |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 23.11.2005 Èíäèêàòîð ðàáî÷åãî âðåìåíè Ïàðàìîíà. |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
//----
#property indicator_chart_window
//------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà -------------------------------
extern int NumberOfDays=50; // Êîëè÷åñòâî äíåé
extern string Begin_1 ="08:00";
extern string End_1 ="11:00";
extern color Color_1 =DarkBlue;
extern string Begin_2 ="14:00";
extern string End_2 ="17:00";
extern color Color_2 =Brown;
extern bool HighRange =False;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init()
{
DeleteObjects();
for(int i=0; i<NumberOfDays; i++)
{
CreateObjects("PWT1"+i, Color_1);
CreateObjects("PWT2"+i, Color_2);
}
Comment("");
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
void deinit()
{
DeleteObjects();
Comment("");
}
//+------------------------------------------------------------------+
//| Ñîçäàíèå îáúåêòîâ èíäèêàòîðà |
//| Ïàðàìåòðû: |
//| no - íàèìåíîâàíèå îáúåêòà |
//| cl - öâåò îáúåêòà |
//+------------------------------------------------------------------+
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);
}
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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);
dt=decDateTradeDay(dt);
while(TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
}
}
//+------------------------------------------------------------------+
//| Ïðîðèñîâêà îáúåêòîâ íà ãðàôèêå |
//| Ïàðàìåòðû: |
//| dt - äàòà òîðãîâîãî äíÿ |
//| no - íàèìåíîâàíèå îáúåêòà |
//| tb - âðåìÿ íà÷àëà ñåññèè |
//| te - âðåìÿ îêîí÷àíèÿ ñåññèè |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Óìåíüøåíèå äàòû íà îäèí òîðãîâûé äåíü |
//| Ïàðàìåòðû: |
//| dt - äàòà òîðãîâîãî äíÿ |
//+------------------------------------------------------------------+
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