BatFink (Home Line)

Download script
BatFink (Home Line)

The Batfink Daily Range is a specialized charting tool designed to help traders visualize specific price action boundaries based on time zones and historical daily movements. Rather than just showing standard highs and lows, it segments the trading day into distinct periods to identify key levels for entry or breakout analysis.

Core Functionality

The script automatically scans your chart history to identify and mark significant price ranges. It operates by dividing the trading day into three specific chronological blocks:

  1. The First Period (Early morning)
  2. The Second Period (Mid-day/Morning transition)
  3. The Rest of Day (Afternoon/Evening)

How the Logic Works

The tool follows a systematic process to organize your chart data:

  • Time Zone Synchronization: The script allows you to input your local time zone and your destination time zone. It calculates the difference between these two, ensuring that the lines drawn on the chart align accurately with specific global market times (such as 00:00 GMT).
  • Dynamic Range Calculation: As the market moves, the tool tracks the "High" and "Low" prices within those three defined periods. Once a period concludes, it captures the price extremes from that window.
  • Level Projection: A key feature of this logic is its ability to project levels forward. For example, once the first trading period is finished, the script can calculate and display horizontal lines based on that data for the remainder of the day. This allows traders to see exactly where "the range" was established so they can monitor for breakouts in real-time.
  • Daily Reset: To ensure accuracy, the logic automatically detects when a new day begins. It clears the previous day's data and resets all calculations, ensuring that the boundaries you see on your screen are always relevant to the current trading session.

Key Features for the Trader

  • Visual Boundaries: It simplifies complex price action into clear horizontal lines, making it easier to identify support and resistance levels at a glance.
  • Customizable Offset: Includes a "Pips For Entry" setting, which allows you to add a small buffer or "cushion" to the projected lines, helping to filter out minor market noise.
  • Automated Scanning: Instead of manually drawing lines every day at specific times, the script automatically calculates these levels as new candles form, providing a consistent visual environment for your trading strategy.
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
BatFink (Home Line)

//+------------------------------------------------------------------+
//|  Batfink Daily Range.MT4                                         |
//|                                                                  |
//+------------------------------------------------------------------+


/* Introduction:

   Draw Line at 00:00GMT

   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 White
#property indicator_color2 White

extern int LocalTimeZone= 2;
extern int DestTimeZone= 0;
extern int PipsForEntry= 0;

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