Hans Indicator4
Download scriptThis script is designed to assist traders by visually identifying specific price "breakout zones" on a currency chart. Its primary purpose is to calculate and draw boundaries based on the high and low prices reached during specific time windows of the trading day.
Core Logic and Functionality
The tool operates by dividing the trading day into distinct segments and monitoring price action within those periods to establish two main zones:
1. Time-Based Period Identification The script recognizes three specific types of time periods throughout the day (which can be adjusted via settings). It tracks the "High" and "Low" prices reached during these windows. It is designed to handle different time zones, allowing it to align correctly with the specific market hours of your local area or the destination exchange.
2. Zone Calculation The logic processes the data to create two primary visual zones:
- Zone 1: This zone is derived from the first identified period of the day. The script calculates the distance between the high and low prices of that period (the "range"). It then projects a boundary forward. These boundaries are created by taking the high and low points and expanding them outward by the size of the range, plus an additional buffer (defined in pips) that you can set.
- Zone 2: This zone is derived from a second period of the day. Unlike the first zone, this is a simpler boundary established by taking the high and low of the second period and adding/subtracting your chosen pip buffer.
3. Visual Representation To make this data actionable for a trader:
- The script draws these boundaries as lines on your chart.
- Once a period is completed, the script "carries forward" those high and low levels throughout the rest of the day so you can see where the breakout levels are located in real-time.
- It includes signal markers (arrows) to highlight specific points of interest based on these calculated boundaries.
4. Automated Reset The script is programmed to be "aware" of the calendar. At the start of every new day, it automatically resets all previous high and low data. This ensures that the zones displayed on your chart are always relevant to the current trading session and do not mix with data from previous days.
Summary for the User
Essentially, this tool automates the tedious task of measuring how far the price moved during specific morning or afternoon sessions. It then draws "breakout lines" on your chart. If the price moves beyond these lines, it signals that the market is potentially breaking out of its established range for that day, helping you identify potential trading opportunities based on momentum.
//+------------------------------------------------------------------+
//| 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 Blue
#property indicator_color2 Blue
#property indicator_color3 LightGray
#property indicator_color4 LightGray
#property indicator_color5 Blue
extern int LocalTimeZone= 2;
extern int DestTimeZone= 6;
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_NONE);
SetIndexBuffer(2,Zone2Upper);
SetIndexEmptyValue(2, 0.0);
SetIndexStyle(3,DRAW_NONE);
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]= { "11:00", "15:00" , /*rest of day: */ "12:00"},
tto[3]= { "15:00", "20: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] + (MathAbs(thigh[0]-tlow[0])) + PipsForEntry*Point;
Zone1Lower[i]= tlow[0] - (MathAbs(thigh[0]-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