SDX-TzBreaktout_v1
Download scriptThis tool is designed to identify and visualize specific "breakout zones" on your trading chart based on the price action of previous time periods. It helps traders see where the market has established highs and lows during early sessions, allowing them to anticipate potential moves when the price breaks out of those boundaries.
Core Logic and Functionality
Time Zone Management The script is built with a geographical awareness system. Since trading markets operate across different time zones, it allows you to input your local time settings. This ensures that the "morning" or "afternoon" sessions are calculated accurately based on your specific region rather than the generic server time.
Session Segmentation Instead of looking at the entire trading day as one block, the script divides the day into three distinct chronological phases:
- The First Period: Early morning price action.
- The Second Period: Mid-morning/early afternoon price action.
- The Remainder of the Day: The late session.
Dynamic High/Low Tracking As the market moves through these segments, the script constantly scans for the highest peak and the lowest valley reached within those specific hours. Once a period concludes (for example, when the first time window ends), the script "locks in" that high and low point.
Breakout Zone Projection The primary purpose of the tool is to project these locked-in levels onto your current chart. It draws horizontal boundaries (Zones 1 and 2) based on the highest and lowest prices from the completed periods. To provide a bit of "breathing room" for traders, it automatically adds a small buffer—defined by a customizable pip amount—above the highs and below the lows.
Visual Feedback
- Zone Lines: The script renders these horizontal boundaries clearly on your chart so you can see exactly where the "walls" are for the day.
- Carry Forward: These lines remain visible throughout the trading day, allowing you to see if the current price is respecting those previous boundaries or breaking through them.
- Reset Mechanism: Every time a new calendar day begins, the script automatically wipes the old data and resets, preparing itself to capture the highs and lows of the new session.
Summary for the Trader
Essentially, this tool automates the tedious task of manually drawing lines on your chart. It identifies the "territory" established by the market during specific early hours and projects those boundaries forward, making it much easier to spot breakout opportunities in real-time.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| TZ-Breaktout.mq4 |
//| Shimodax |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright Shimodax"
#property link "http://www.strategybuilderfx.com/forums/showthread.php?t=15439"
/* Introduction:
Draw ranges for "Simple Combined Breakout System for EUR/USD and GBP/USD" thread
(see http://www.strategybuilderfx.com/forums/showthread.php?t=15439)
LocalTimeZone: TimeZone for which MT4 shows your local time,
e.g. 1 or 2 for Europe (GMT+1 or GMT+2 (daylight
savings time). Use zero for no adjustment.
The MetaQuotes demo server uses GMT +2.
Enjoy :-)
Markus
*/
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_color3 LightGray
#property indicator_color4 LightGray
#property indicator_color5 Blue
extern int LocalTimeZone= 2;
extern int DestTimeZone= 0;
extern int PipsForEntry= 5;
double Zone1Upper[];
double Zone2Upper[];
double Zone1Lower[];
double Zone2Lower[];
double SignalsBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Zone1Upper);
SetIndexEmptyValue(0, 0.0);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Zone1Lower);
SetIndexEmptyValue(1, 0.0);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,Zone2Upper);
SetIndexEmptyValue(2, 0.0);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,Zone2Lower);
SetIndexEmptyValue(3, 0.0);
SetIndexStyle(4,DRAW_ARROW);
SetIndexArrow(4, 156);
SetIndexBuffer(4, SignalsBuffer);
return(0);
}
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars= IndicatorCounted(),
lastbar, result;
if (Bars<=100)
return(0);
if (counted_bars>0)
counted_bars--;
lastbar= Bars - counted_bars;
BreakoutRanges(0, lastbar, LocalTimeZone, DestTimeZone);
return(0);
}
//+------------------------------------------------------------------+
//| Compute index of first/last bar of yesterday and today |
//+------------------------------------------------------------------+
int BreakoutRanges(int offset, int lastbar, int tzlocal, int tzdest)
{
int i, j, k,
tzdiff= tzlocal - tzdest,
tzdiffsec= tzdiff*3600,
tidxstart[2]= { 0, 0},
tidxend[2]= { 0, 0 };
double thigh[2]= { 0.0, 0.0 },
tlow[2]= { 99999.9, 99999.9 };
string tfrom[3]= { "04:00", "08:00" , /*rest of day: */ "12:00"},
tto[3]= { "08:00", "12:00", /*rest of day: */ "24:00" },
tday;
bool inperiod= -1;
datetime timet;
//
// search back for the beginning of the day
//
tday= TimeToStr(Time[lastbar]-tzdiffsec, TIME_DATE);
for ( ; lastbar<Bars; lastbar++) {
if (TimeToStr(Time[lastbar] - tzdiffsec, TIME_DATE)!=tday) {
lastbar--;
break;
}
}
//
// find the high/low for the two periods and carry them forward through the day
//
tday= "XXX";
for (i= lastbar; i>=offset; i--) {
timet= Time[i] - tzdiffsec; // time of this bar
string timestr= TimeToStr(timet, TIME_MINUTES), // current time HH:MM
thisday= TimeToStr(timet, TIME_DATE); // current date
//
// for all three periods (first period, second period, rest of day)
//
for (j= 0; j<3; j++) {
if (tfrom[j]<=timestr && timestr<tto[j]) { // Bar[i] in this period
if (inperiod!=j) { // entered new period, so last one is completed
if (j>0) { // now draw high/low back over the recently completed period
for (k= tidxstart[j-1]; k>=tidxend[j-1]; k--) {
if (j-1==0) {
Zone1Upper[k]= thigh[j-1];
Zone1Lower[k]= tlow[j-1];
}
if (j-1==1) {
Zone2Upper[k]= thigh[j-1];
Zone2Lower[k]= tlow[j-1];
}
}
}
inperiod= j; // remember current period
}
if (inperiod==2) // inperiod==2 (end of day) is just to check completion of zone 2
break;
// for the current period find idxstart, idxend and compute high/low
if (tidxstart[j]==0) {
tidxstart[j]= i;
tday= thisday;
}
tidxend[j]= i;
thigh[j]= MathMax(thigh[j], High[i]);
tlow[j]= MathMin(tlow[j], Low[i]);
}
}
//
// carry forward the periods for which we have definite high/lows
//
if (inperiod>=1 && tday==thisday) { // first time period completed
Zone1Upper[i]= thigh[0] + PipsForEntry*Point;
Zone1Lower[i]= tlow[0] - PipsForEntry*Point;
if (inperiod>=2) { // second period completed
Zone2Upper[i]= thigh[1] + PipsForEntry*Point;
Zone2Lower[i]= tlow[1] - PipsForEntry*Point;
}
}
else { // none yet to carry forward (zero to clear old values, e.g. from switching timeframe)
Zone1Upper[i]= 0;
Zone1Lower[i]= 0;
Zone2Upper[i]= 0;
Zone2Lower[i]= 0;
}
//
// at the beginning of a new day reset everything
//
if (tday!="XXX" && tday!=thisday) {
Print("#", i, "new day ", thisday, "/", tday);
tday= "XXX";
inperiod= -1;
for (j= 0; j<2; j++) {
tidxstart[j]= 0;
tidxend[j]= 0;
thigh[j]= 0;
tlow[j]= 99999;
}
}
}
return (0);
}
Comments