HL Next Activator_v3

Download script
Author: Rosh
HL Next Activator_v3

The HL Next Activator is a technical analysis tool designed to identify potential price reversal zones by monitoring the relationship between current market prices and historical highs or lows. Unlike standard moving averages that smooth out data, this script focuses on specific structural "milestones" in time to determine key support and resistance levels.

Core Logic Overview

The script operates based on a hierarchy of logic that identifies significant price boundaries:

1. Time-Frame Intelligence The tool is designed to recognize specific time intervals (such as Hours, Days, or Weeks) depending on which chart period you are currently viewing. It doesn't just look at every candle equally; it understands the "boundaries" of time—for example, recognizing the start of a new day, week, or month.

2. Dynamic Boundary Detection The logic contains a specialized "Delimeter" system. This allows the script to scan backward through history to find the exact points where major periods begin or end. By identifying these markers, the tool can calculate high and low values based on completed blocks of time rather than just a simple fixed number of bars.

3. High/Low Averaging System Instead of using a single point in time, the script calculates an average of "Highs" and "Lows" over a user-defined period (the Activator Period).

  • It looks back to find previous completed periods.
  • It identifies the highest price reached during those periods.
  • It calculates the average of these peaks/troughs to create a stabilized baseline.

4. Execution and Visual Signaling The script continuously compares the current closing price against these calculated averages:

  • Bearish Signal (Sell): If the market price closes above the calculated Average High, the logic anticipates a potential reversal and prepares a "Sell" signal based on the Average Low.
  • Bullish Signal (Buy): If the market price closes below the calculated Average Low, it anticipates a potential bounce and prepares a "Buy" signal based on the Average High.
  • Trend Continuation: If no immediate breakout occurs, the script maintains the previous signal's level to help visualize the ongoing trend until a new boundary is breached.

Summary for the User

In plain terms, this tool acts as a "boundary watcher." It identifies where the price has historically struggled to move past during significant time blocks (like daily or weekly cycles). By averaging those historical extremes, it creates a dynamic zone of support and resistance. When the price breaks these zones, the script provides visual arrows to alert you to potential exhaustion points where the market might turn around.

Miscellaneous
Implements a curve of type %1
16 Views
0 Downloads
0 Favorites
HL Next Activator_v3
//+------------------------------------------------------------------+
//|                                            HL Next Activator.mq4 |
//|                                                             Rosh |
//|                                       http://fx.winm.ru/book.htm |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://fx.winm.ru/book.htm"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int       ActivatorPeriod=3;
extern int       useFullPeriods=1;
//---- buffers
double SellActivator[];
double BuyActivator[];
int first,counterPeriod;
int DelimeterArray[30];
//+------------------------------------------------------------------+
//| Ïîëó÷èì ñëåäóþùèé ïåðèîä                                         |
//+------------------------------------------------------------------+
string GetNextPeriod(int _Period)
  {
   string nextPeriod="";
//---- 
   switch(_Period)
     {
      case 5: nextPeriod="H1"; break;
      case 15: nextPeriod="H1"; break;
      case 30: nextPeriod="H4"; break;
      case 60: nextPeriod="H4"; break;
      case 240: nextPeriod="D1"; break;
      case 1440: nextPeriod="W1"; break;
      case 10080: nextPeriod="M"; break;
      default: Print("Íåäîïóñòèìûé ïåðèîä!!!");
     }
//----
   return(nextPeriod);
  }
//+------------------------------------------------------------------+
//| Ïðîâåðèì - ðàçäåëèòåëü äèàïàçîíà èëè íåò                         |
//+------------------------------------------------------------------+
bool isDelimeter(int _Period, int _shift)
  {
   bool result=false;
//---- 
   switch(_Period)
     {
      case 5:result=(TimeMinute(Time[_shift])==0); break;
      case 15:result=(TimeMinute(Time[_shift])==0); break;
      case 30:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0; break;
      case 60:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0;break;
      case 240:result=(TimeMinute(Time[_shift])==0)&&(TimeHour(Time[_shift])==0); break;
      case 1440:result=(TimeDayOfWeek(Time[_shift])==1)&&(TimeHour(Time[_shift])==0); break;
      case 10080:result=(TimeDay(Time[_shift])==1)||((TimeDay(Time[_shift])==2 && TimeDay(Time[_shift+1])!=1))||((TimeDay(Time[_shift])==3 && TimeDay(Time[_shift+1])!=2)); break;
      default: Print("Íåäîïóñòèìûé ïåðèîä!!!");
     }
//----
   return(result);
  }
//+------------------------------------------------------------------+
//| Âû÷èñëèòü ñðåäíèé High çà  ActivatorPeriod ïåðèîäîâ              |
//+------------------------------------------------------------------+
double AverageHigh(int _shift)
  {
   double AveragePeriodHigh=0.0,tempHigh;
   int cnt=_shift;
   first=0;
//---- 
   counterPeriod=0;
   while(counterPeriod<ActivatorPeriod+useFullPeriods)
     {
      while(!isDelimeter(Period(),cnt)) cnt++;
      if (first==0) first=cnt;
      DelimeterArray[counterPeriod]=cnt;
      cnt++;
      counterPeriod++;
     }
   cnt--;
   for(cnt=ActivatorPeriod-1;cnt>0;cnt--)
     {
      tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[cnt]-DelimeterArray[cnt-1],DelimeterArray[cnt-1]+1)];
      AveragePeriodHigh=AveragePeriodHigh+tempHigh;
     }
   if (useFullPeriods==1)
     {
      tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[ActivatorPeriod]-DelimeterArray[ActivatorPeriod-1],DelimeterArray[ActivatorPeriod-1]+1)];
      AveragePeriodHigh=AveragePeriodHigh+tempHigh;
      AveragePeriodHigh=AveragePeriodHigh/NormalizeDouble(ActivatorPeriod,0);
     }
   else
     {
      tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[0]-_shift,_shift)];
      AveragePeriodHigh=AveragePeriodHigh+tempHigh;
      AveragePeriodHigh=AveragePeriodHigh/NormalizeDouble(ActivatorPeriod,0);
     }
//----
   return(AveragePeriodHigh);
  }
//+------------------------------------------------------------------+
//| Âû÷èñëèòü ñðåäíèé Low çà  ActivatorPeriod ïåðèîäîâ              |
//+------------------------------------------------------------------+
double AverageLow(int _shift)
  {
   double AveragePeriodLow=0.0,tempLow;
   int cnt=_shift;
   first=0;
//---- 
   counterPeriod=0;
   while(counterPeriod<ActivatorPeriod+useFullPeriods)
     {
      while(!isDelimeter(Period(),cnt)) cnt++;
      if (first==0) first=cnt;
      DelimeterArray[counterPeriod]=cnt;
      cnt++;
      counterPeriod++;
     }
   cnt--;
   for(cnt=ActivatorPeriod-1;cnt>0;cnt--)
     {
      tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[cnt]-DelimeterArray[cnt-1],DelimeterArray[cnt-1]+1)];
      AveragePeriodLow=AveragePeriodLow+tempLow;
     }
   if (useFullPeriods==1)
     {
      tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[ActivatorPeriod]-DelimeterArray[ActivatorPeriod-1],DelimeterArray[ActivatorPeriod-1]+1)];
      AveragePeriodLow=AveragePeriodLow+tempLow;
      AveragePeriodLow=AveragePeriodLow/NormalizeDouble(ActivatorPeriod,0);
     }
   else
     {
      tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[0]-_shift,_shift)];
      AveragePeriodLow=AveragePeriodLow+tempLow;
      AveragePeriodLow=AveragePeriodLow/NormalizeDouble(ActivatorPeriod,0);
     }
//----
   return(AveragePeriodLow);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexBuffer(0,SellActivator);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexBuffer(1,BuyActivator);
   SetIndexEmptyValue(1,0.0);
   if (useFullPeriods!=0) useFullPeriods=1;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int cnt,limit;
   if (Period()==10080) return;
   if (counted_bars<0) return(-1);
   if (counted_bars>0) limit=Bars-counted_bars;
   if (counted_bars==0)
     {
      // íàéòè ïåðâûé è âòîðîé ðàçäåëèòåëü è óñòàíîâèòü limit
      cnt=Bars-1;
      while(!isDelimeter(Period(),cnt)) cnt--;
      first=cnt;
      cnt--;
      counterPeriod=0;
      while(counterPeriod<ActivatorPeriod)
        {
         while(!isDelimeter(Period(),cnt)) cnt--;
         cnt--;
         counterPeriod++;
        }
      cnt++;
      limit=cnt;
     }
//---- 
   for(int shift=limit;shift>=0;shift--)
     {
      if (Close[shift]>AverageHigh(shift))
        {
         SellActivator[shift]=AverageLow(shift);
         BuyActivator[shift]=0.0;
         continue;
        }
      if (Close[shift]<AverageLow(shift))
        {
         BuyActivator[shift]=AverageHigh(shift);
         SellActivator[shift]=0.0;
         continue;
        }
      if (BuyActivator[shift+1]!=0.0) BuyActivator[shift]=AverageHigh(shift);
      if (SellActivator[shift+1]!=0.0) SellActivator[shift]=AverageLow(shift);
     }

//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments