ang_AutoCh_HL-v1

Download script
ang_AutoCh_HL-v1

This script functions as a sophisticated technical analysis tool designed to project potential price boundaries on a trading chart. Rather than simply trailing the current price, it uses mathematical modeling to identify significant trends and "zones" of interest based on historical data over a user-defined period (defaulting to 24 hours).

Core Mathematical Logic

The script begins by performing a linear regression analysis on the closing prices of the market. This means it calculates a "line of best fit" for the chosen timeframe, establishing the underlying direction of the trend. By determining this baseline, the tool can differentiate between standard market noise and the actual structural movement of the asset.

Dynamic Zone Detection

Once the primary trend is established, the logic divides the recent price history into two halves. It then scans these sections to identify extreme outliers—specifically the highest peaks and lowest valleys relative to the calculated trend line.

The script evaluates which of these extremes is more significant:

  • Resistance Focus: If the volatility is driven primarily by "highs" (peaks) exceeding the trend, the script prioritizes upper boundaries.
  • Support Focus: If the volatility is driven primarily by "lows" (troughs) dropping below the trend, it prioritizes lower boundaries.

Projection and Visualization

After identifying the most dominant price extremes, the logic applies a geometric projection. It takes these identified highs or lows and extends them forward into the future. Instead of drawing a single line, it creates three distinct parallel trajectories:

  1. The Primary Boundary: The projected path of the extreme high or low point.
  2. The Median Path: A middle trajectory situated halfway between the primary boundary and the secondary calculated point.
  3. The Extended Boundary: A wider projection that captures a broader range of potential price movement.

User Experience

On the chart, these projections appear as three dotted lines (customizable by color). They provide a visual roadmap of where the market might face significant friction or "walls." By looking at these projected paths, traders can visually estimate where price may stall or reverse based on the mathematical weight of recent historical extremes.

14 Views
0 Downloads
0 Favorites
ang_AutoCh_HL-v1
//+------------------------------------------------------------------+
//|                                                                  |
//|                 Copyright © 1999-2007, MetaQuotes Software Corp. |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
#property  copyright "ANG3110@latchess.com"
//----------------------------------
#property indicator_chart_window
//----------------------------------
extern int Hours=24;
extern color col=Red;
//------------------
double lr,lr0,lrp;
double sx,sy,sxy,sx2,aa,bb;
int p,sName,fs;
int f,f0,f1;
double dh,dl,dh_1,dl_1,dh_2,dl_2;
int ai_1,ai_2,bi_1,bi_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
int p1,p0,p2,fp;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int init() 
  {
   p=Hours*60/Period();
   if (fs==0) 
   {
      sName=CurTime(); fs=1;
   }
//----
  return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int deinit() 
  {
   ObjectDelete("1"+sName);
   ObjectDelete("0"+sName);
   ObjectDelete("2"+sName); 
   }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start() 
  {
   int i,n;
//----
     if (f==1) 
     {
      p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));
      p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));
      p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));
      if (fp==0 && p!=p1) {p=p1; fp=1;}
      if (fp==0 && p!=p0) {p=p0; fp=1;}
      if (fp==0 && p!=p2) {p=p2; fp=1;}
     }
   //----
   sx=0; sy=0; sxy=0; sx2=0;
   for(n=0; n<=p; n++) 
   {
      sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);
   }
   aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);
//----
     for(i=0; i<=p; i++) 
     {
      lr=bb+aa*i;
      dh=High[i]-lr; dl=Low[i]-lr;
      //----
        if (i<p/2) 
        {
         if (i==0) 
         {
            dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;
        }
         if (dh>=dh_1) {dh_1=dh; ai_1=i;}
         if (dl<=dl_1) {dl_1=dl; bi_1=i;}
        }
      //----
        if (i>=p/2) 
        {
         if (i==p/2) 
         {
            dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;
         }
         if (dh>=dh_2) {dh_2=dh; ai_2=i;}
         if (dl<=dl_2) {dl_2=dl; bi_2=i;}
        }
       }
   lr0=bb; lrp=bb+aa*(i+p);
   //===================================================
   if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;
   if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;
   if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) 
   {
      if (MathAbs(dh_1-dh_2)<MathAbs(dl_1-dl_2)) f=1; if (MathAbs(dh_1-dh_2)>=MathAbs(dl_1-dl_2)) f=2;
   }
   //=================================================
     if (f==1) 
     {
        for(n=0; n<=20; n++) 
        { 
         f1=0;
           for(i=0; i<=p; i++) 
           {
            hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
            if (i==0 || i==p/2) dhm=0.0;
            if (High[i]-hai>dhm && i<p/2) {ai_1=i; f1=1;}
           if (High[i]-hai>dhm && i>=p/2) {ai_2=i; f1=1;} 
           }
        if (f==0) break;}
      //----------------------------
        for(i=0; i<=p; i++) 
        {
         hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
         dli=Low[i]-hai;
        if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}
      ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);
      hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);
      //----------------------------
      price_p1=hap;
      price_p0=hap+dlm/2;
      price_p2=hap+dlm;
      price_01=ha0;
      price_00=ha0+dlm/2;
      price_02=ha0+dlm;
     }
   //=================================================
     if (f==2) 
     {
        for(n=0; n<=20; n++) 
        {
          f1=0;
           for(i=0; i<=p; i++) {lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
            if (i==0 || i==p/2) dlm=0.0;
            if (Low[i]-lai<dlm && i<p/2) {bi_1=i; f1=1;}
           if (Low[i]-lai<dlm && i>=p/2) {bi_2=i; f1=1;}
           }
        if (f==0) break;
        }
      //----------------------------
        for(i=0; i<=p; i++) 
        {
         lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
         dhi=High[i]-lai;
        if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}
      la0=Low[bi_1]*(0-bi_2)/(bi_1-bi_2)+Low[bi_2]*(0-bi_1)/(bi_2-bi_1);
      lap=Low[bi_1]*(p-bi_2)/(bi_1-bi_2)+Low[bi_2]*(p-bi_1)/(bi_2-bi_1);
      //----------------------------------------------------------------
      price_p1=lap;
      price_p0=lap+dhm/2;
      price_p2=lap+dhm;
      price_01=la0;
      price_00=la0+dhm/2;
      price_02=la0+dhm;
     }
   //===================================================================================
   ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);
   ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);
   ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);
//-----------------------------------------------------------------
   ObjectSet("1"+sName,OBJPROP_COLOR,col);
   ObjectSet("0"+sName,OBJPROP_COLOR,col);
   ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("2"+sName,OBJPROP_COLOR,col);
//---------------------------------------------
   ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);
   ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);
   ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);
   ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);
   ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);
   ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);
   ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);
   ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);
   ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);
   ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);
   ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);
   ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);
   f=1; p1=p; p0=p; p2=p; fp=0;
   //*************************************************************************************
  return(0);
  }
//+------------------------------------------------------------------+

Comments