BatFink (StopLoss A)

Download script
BatFink (StopLoss A)

This script is designed to assist traders by automatically identifying and visualizing specific price "zones" based on historical market activity. It focuses on tracking price movements during distinct time windows throughout the trading day to help identify key support and resistance levels.

Core Logic and Functionality

1. Timezone Synchronization The tool is built with a flexible timezone configuration. It calculates the difference between your local time and a destination time (such as GMT). This ensures that the data it analyzes aligns correctly with the specific market hours you are trading, regardless of where your server is hosted.

2. Segmented Market Analysis Rather than looking at the entire day as one single block of price action, the script divides the trading day into three specific chronological periods:

  • Period 1: Early morning activity.
  • Period 2: Mid-day activity.
  • Period 3: The remainder of the trading day.

The logic scans through historical data to identify the price movements within these specific windows. Specifically, it monitors the high and low points reached during the first period to establish a baseline for the rest of the day.

3. Dynamic Zone Calculation As the market progresses, the script performs a "carry forward" calculation:

  • Once the first trading period is completed, the script identifies the price levels established during that time.
  • It then projects these levels onto the current chart as a visual zone.
  • The width of this zone is customizable via a "Pips For Entry" setting, allowing you to define how much space above and below the reference price should be highlighted.

4. Automatic Data Reset To ensure the data remains relevant, the script includes an automated reset mechanism. Every time a new day begins on the chart, the internal memory clears previous calculations. This prevents old data from interfering with today's analysis, ensuring that the lines and zones displayed are always based on the most recent trading session.

Summary of User Experience

When applied to a chart, this tool automatically filters out "market noise" by focusing on specific timeframes. It tells you where the price was held or reacted during the early parts of the day and projects those boundaries forward, providing a clear visual reference for potential entry points or areas of interest throughout the current session.

Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
BatFink (StopLoss A)

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


/* Introduction:

   Draw Line at 00:00GMT + and - 10

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

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

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