BatFink (Target 3)
Download scriptThis tool is designed to automatically identify and visualize specific price boundaries on your trading chart based on historical time periods. Its primary purpose is to help traders identify key levels for entry or exit by analyzing how the market behaves during different segments of the day.
Core Functionality
The script analyzes daily price action by breaking the trading day into three distinct chronological periods:
- Initial Period: The first specific window of the day (e.g., 07:00 to 08:00).
- Secondary Period: A subsequent defined time block (e.g., 08:00 to 12:00).
- Remaining Day: The remainder of the trading session.
How the Logic Works
- Time Zone Synchronization: The script is built to be flexible regarding geography. It allows you to input your local time zone and the destination time zone. This ensures that even if your broker’s server time differs from your local time, the script will correctly identify the "start of the day" and the specific trading windows you wish to monitor.
- High/Low Identification: For each of the defined time periods, the script scans the historical price data to find the highest and lowest points reached. It tracks these values dynamically as the market moves.
- Dynamic Boundary Projection: Once a period (such as the first morning window) is completed, the script takes the price data from that period and projects a "zone" forward onto the rest of the day.
- Customizable Buffer: The logic includes a specific "Pips for Entry" setting. This allows you to create a buffer or a "cushion" around the identified price levels. Instead of just marking a single point, it draws lines at a specific distance above and below the target price, helping to define a clear area of interest.
Visual Output
On your chart, the logic results in the visual placement of lines that represent these calculated zones. These lines provide a constant reference point throughout the trading day, allowing you to see where previous time-block extremes sit relative to current price action. By automating this calculation, the tool removes the need for manual measurement, ensuring that your support and resistance levels are consistent and mathematically derived from the day's opening movements.
//+------------------------------------------------------------------+
//| Batfink Daily Range.MT4 |
//| |
//+------------------------------------------------------------------+
/* Introduction:
Draw Line at 00:00GMT + and - 85
TimeZONE Information - Indicator can be used for different Time Zones.
For Batfink settings set to -5 for MetaQuotes demo Server
This will place home line at 00:00GMT Time
*/
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Orange
#property indicator_color2 SteelBlue
extern int LocalTimeZone= 2;
extern int DestTimeZone= 0;
extern int PipsForEntry= 85;
double Zone1Upper[];
double Zone1Lower[];
//+------------------------------------------------------------------+
//| 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);
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 topen[2]= { 0.0, 0.0 },
tclose[2]= { 99999.9, 99999.9 };
string tfrom[3]= { "07: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]= tclose[j-1];
Zone1Lower[k]= tclose[j-1];
}
}
inperiod= j; // remember current period
}
// for the current period find idxstart, idxend and compute high/low
if (tidxstart[j]==0) {
tidxstart[j]= i;
tday= thisday;
}
tidxend[j]= i;
topen[j]= MathMax(topen[j], Open[i]);
tclose[j]= MathMin(tclose[j], Close[i]);
}
}
//------------------------------------------------------------------------
// carry forward the periods for which we have definite high/lows
//
if (inperiod>=1 && tday==thisday) { // first time period completed
Zone1Upper[i]= tclose[0] + PipsForEntry*Point;
Zone1Lower[i]= tclose[0] - PipsForEntry*Point;
}
}
//
// 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;
topen[j]= 0;
tclose[j]= 99999;
}
}
}
return (0);
}
Comments