Author: Vladislav Goshkov (VG).
MMLevls_VG

This script is designed to identify and visualize significant price levels on a trading chart, acting as a roadmap of "Support" and "Resistance" zones. Rather than simply reacting to past price movement, it uses a mathematical approach to determine where the market is most likely to stall, reverse, or consolidate based on its current range.

Core Logic and Framework

The tool works by analyzing a specific lookback period (the historical data it "looks at") to establish a trading range. It then divides this range into a grid of 8 distinct levels (plus several overshoot zones). Each level has a specific personality and purpose for a trader:

  • Major Pivotal Points (4/8): This is the "center" of the logic. It identifies the strongest point of equilibrium. When price is above this, it acts as strong support; when below, it acts as strong resistance. This is highlighted as the primary area for new entries.
  • Trading Range Boundaries (3/8 and 5/8): These represent the "Premium" and "Discount" zones. The script identifies areas where price tends to spend significant time (roughly 40%). If the price lingers near these levels for a certain duration, it signals that the market is in a consolidation phase.
  • Reversal and Pivot Zones (2/8 and 6/8): These lines are identified as secondary pivot points. They possess enough strength to potentially flip the direction of the trend but are less significant than the 4/8 level.
  • Weak/Stall Zones (1/8 and 7/8): These are considered "weak" areas. The logic suggests that if the price reaches these lines very quickly and aggressively, it is likely to stall or reverse. If the price does not react here, it indicates the current momentum is strong enough to continue toward the next major level.
  • Overshoot/Overbought Zones (0/8, -1/8, -2/8 and 8/8, +1/8, +2/8): These are the outer boundaries. They represent "extreme" territory. When price enters these zones, it suggests the market is significantly extended (overbought or oversold), indicating a high probability of a sharp pullback or exhaustion.

How the Calculation Works

The script uses a sophisticated multi-step calculation to place these lines accurately:

  1. Range Identification: It finds the highest high and lowest low over a set period to define the "playground" of current price action.
  2. Fractal Scaling: It automatically adjusts its calculations based on the magnitude of the price (whether you are trading a low-value currency pair or a high-value asset), ensuring the levels remain proportional.
  3. Mathematical Mapping: It uses geometric formulas to calculate specific coordinates (x1 through x6) within that range. These coordinates determine exactly where "human" behavior typically creates price walls.
  4. Dynamic Updates: Every time a new candle forms or the timeframe changes, the script recalculates these levels automatically. This ensures that the support and resistance lines move in sync with the market's evolving volatility.

Visual Output

The script draws horizontal lines across your chart, color-coded by their "strength" and purpose. Each line is accompanied by a text label (e.g., [4/8]P) to tell you exactly what that level represents, allowing you to quickly identify whether the market is currently in a "Premium" zone (high price), a "Discount" zone (low price), or at a major pivot point.

14 Views
0 Downloads
0 Favorites
MMLevls_VG
//+------------------------------------------------------------------+
//|                                                   MMLevls_VG.mq4 |
//|                       Copyright © 2006, Vladislav Goshkov (VG).  |
//|                                           4vg@mail.ru            |
//|                                       Many thanks to Tim Kruzel  |
//+------------------------------------------------------------------+
#property copyright "Vladislav Goshkov (VG)."
#property link      "4vg@mail.ru"
//----
#property indicator_chart_window
// ============================================================================================
// * Ëèíèè 8/8 è 0/8 (Îêîí÷àòåëüíîå ñîïðîòèâëåíèå).
// * Ýòè ëèíèè ñàìûå ñèëüíûå è îêàçûâàþò ñèëüíåéøèå ñîïðîòèâëåíèÿ è ïîääåðæêó.
// ============================================================================================
//* Ëèíèÿ 7/8  (Ñëàáàÿ, ìåñòî äëÿ îñòàíîâêè è ðàçâîðîòà). Weak, Stall and Reverse
//* Ýòà ëèíèÿ ñëàáà. Åñëè öåíà çàøëà ñëèøêîì äàëåêî è ñëèøêîì áûñòðî è åñëè îíà îñòàíîâèëàñü îêîëî ýòîé ëèíèè, 
//* çíà÷èò îíà ðàçâåðíåòñÿ áûñòðî âíèç. Åñëè öåíà íå îñòàíîâèëàñü îêîëî ýòîé ëèíèè, îíà ïðîäîëæèò äâèæåíèå ââåðõ ê 8/8.
// ============================================================================================
//* Ëèíèÿ 1/8  (Ñëàáàÿ, ìåñòî äëÿ îñòàíîâêè è ðàçâîðîòà). Weak, Stall and Reverse
//* Ýòà ëèíèÿ ñëàáà. Åñëè öåíà çàøëà ñëèøêîì äàëåêî è ñëèøêîì áûñòðî è åñëè îíà îñòàíîâèëàñü îêîëî ýòîé ëèíèè, 
//* çíà÷èò îíà ðàçâåðíåòñÿ áûñòðî ââåðõ. Åñëè öåíà íå îñòàíîâèëàñü îêîëî ýòîé ëèíèè, îíà ïðîäîëæèò äâèæåíèå âíèç ê 0/8.
// ============================================================================================
//* Ëèíèè 6/8 è 2/8 (Âðàùåíèå, ðàçâîðîò). Pivot, Reverse
//* Ýòè äâå ëèíèè óñòóïàþò â ñâîåé ñèëå òîëüêî 4/8 â ñâîåé ñïîñîáíîñòè ïîëíîñòüþ ðàçâåðíóòü öåíîâîå äâèæåíèå.
// ============================================================================================
//* Ëèíèÿ 5/8 (Âåðõ òîðãîâîãî äèàïàçîíà). Top of Trading Range
//* Öåíû âñåõ ðûíêîâ òðàòÿò 40% âðåìåíè, íà äâèæåíèå ìåæäó 5/8 è 3/8 ëèíèÿìè. 
//* Åñëè öåíà äâèãàåòñÿ îêîëî ëèíèè 5/8 è îñòàåòñÿ îêîëî íåå â òå÷åíèè 10-12 äíåé, ðûíîê ñêàçàë ÷òî ñëåäóåò 
//* ïðîäàâàòü â ýòîé «ïðåìèàëüíîé çîíå», ÷òî è äåëàþò íåêîòîðûå ëþäè, íî åñëè öåíà ñîõðàíÿåò òåíäåíöèþ îñòàâàòüñÿ 
//* âûøå 5/8, òî îíà è îñòàíåòñÿ âûøå íåå. Åñëè, îäíàêî, öåíà ïàäàåò íèæå 5/8, òî îíà ñêîðåå âñåãî ïðîäîëæèò 
//* ïàäàòü äàëåå äî ñëåäóþùåãî óðîâíÿ ñîïðîòèâëåíèÿ.
// ============================================================================================
//* Ëèíèÿ 3/8 (Äíî òîðãîâîãî äèàïàçîíà). Bottom of Trading Range
//* Åñëè öåíû íèæå ýòîé ëèíè è äâèãàþòñÿ ââåðõ, òî öåíå áóäåò ñëîæíî ïðîáèòü ýòîò óðîâåíü. 
//* Åñëè ïðîáèâàþò ââåðõ ýòó ëèíèþ è îñòàþòñÿ âûøå íåå â òå÷åíèè 10-12 äíåé, çíà÷èò öåíû îñòàíóòñÿ âûøå ýòîé ëèíèè 
//* è ïîòðàòÿò 40% âðåìåíè äâèãàÿñü ìåæäó ýòîé ëèíèåé è 5/8 ëèíèåé.
// ============================================================================================
//* Ëèíèÿ 4/8 (Ãëàâíàÿ ëèíèÿ ñîïðîòèâëåíèÿ/ïîääåðæêè). Major Support/Resistance
//* Ýòà ëèíèÿ îáåñïå÷èâàåò íàèáîëüøåå ñîïðîòèâëåíèå/ïîääåðæêó. Ýòîò óðîâåíü ÿâëÿåòñÿ ëó÷øèì äëÿ íîâîé ïîêóïêè èëè ïðîäàæè. 
//* Åñëè öåíà íàõîäèòñÿ âûøå 4/8, òî ýòî ñèëüíûé óðîâåíü ïîääåðæêè. Åñëè öåíà íàõîäèòñÿ íèæå 4/8, òî ýòî ïðåêðàñíûé óðîâåíü 
//* ñîïðîòèâëåíèÿ.
// ============================================================================================
extern int P=90;
extern int MMPeriod=1440;
extern int StepBack=0;
//----
extern color  mml_clr_m_2_8=White;       // [-2]/8
extern color  mml_clr_m_1_8=White;       // [-1]/8
extern color  mml_clr_0_8  =Aqua;        //  [0]/8
extern color  mml_clr_1_8  =Yellow;      //  [1]/8
extern color  mml_clr_2_8  =Red;         //  [2]/8
extern color  mml_clr_3_8  =Green;       //  [3]/8
extern color  mml_clr_4_8  =Blue;        //  [4]/8
extern color  mml_clr_5_8  =Green;       //  [5]/8
extern color  mml_clr_6_8  =Red;         //  [6]/8
extern color  mml_clr_7_8  =Yellow;      //  [7]/8
extern color  mml_clr_8_8  =Aqua;        //  [8]/8
extern color  mml_clr_p_1_8=White;       // [+1]/8
extern color  mml_clr_p_2_8=White;       // [+2]/8
extern int    mml_wdth_m_2_8=2;        // [-2]/8
extern int    mml_wdth_m_1_8=1;        // [-1]/8
extern int    mml_wdth_0_8  =2;        //  [0]/8
extern int    mml_wdth_1_8  =1;        //  [1]/8
extern int    mml_wdth_2_8  =1;        //  [2]/8
extern int    mml_wdth_3_8  =1;        //  [3]/8
extern int    mml_wdth_4_8  =2;        //  [4]/8
extern int    mml_wdth_5_8  =1;        //  [5]/8
extern int    mml_wdth_6_8  =1;        //  [6]/8
extern int    mml_wdth_7_8  =1;        //  [7]/8
extern int    mml_wdth_8_8  =2;        //  [8]/8
extern int    mml_wdth_p_1_8=1;        // [+1]/8
extern int    mml_wdth_p_2_8=2;        // [+2]/8
extern color  MarkColor  =Blue;
extern int    MarkNumber =217;
//----
double  dmml=0,
        dvtl=0,
        sum =0,
        v1=0,
        v2=0,
        mn=0,
        mx=0,
        x1=0,
        x2=0,
        x3=0,
        x4=0,
        x5=0,
        x6=0,
        y1=0,
        y2=0,
        y3=0,
        y4=0,
        y5=0,
        y6=0,
        octave=0,
        fractal=0,
        range  =0,
        finalH =0,
        finalL =0,
        mml[13];
string  ln_txt[13],
        buff_str="";
int
        bn_v1  =0,
        bn_v2  =0,
        OctLinesCnt=13,
        mml_thk=8,
        mml_clr[13],
        mml_wdth[13],
        mml_shft=35,
        nTime=0,
        CurPeriod=0,
        nDigits=0,
        i=0;
int NewPeriod=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init() 
  {
//---- indicators
   if(MMPeriod>0)
      NewPeriod  =P*MathCeil(MMPeriod/Period());
   else NewPeriod=P;
//----
   ln_txt[0] ="[-2/8]P";// "extremely overshoot [-2/8]";// [-2/8]
   ln_txt[1] ="[-1/8]P";// "overshoot [-1/8]";// [-1/8]
   ln_txt[2] ="[0/8]P";// "Ultimate Support - extremely oversold [0/8]";// [0/8]
   ln_txt[3] ="[1/8]P";// "Weak, Stall and Reverse - [1/8]";// [1/8]
   ln_txt[4] ="[2/8]P";// "Pivot, Reverse - major [2/8]";// [2/8]
   ln_txt[5] ="[3/8]P";// "Bottom of Trading Range - [3/8], if 10-12 bars then 40% Time. BUY Premium Zone";//[3/8]
   ln_txt[6] ="[4/8]P";// "Major Support/Resistance Pivotal Point [4/8]- Best New BUY or SELL level";// [4/8]
   ln_txt[7] ="[5/8]P";// "Top of Trading Range - [5/8], if 10-12 bars then 40% Time. SELL Premium Zone";//[5/8]
   ln_txt[8] ="[6/8]P";// "Pivot, Reverse - major [6/8]";// [6/8]
   ln_txt[9] ="[7/8]P";// "Weak, Stall and Reverse - [7/8]";// [7/8]
   ln_txt[10]="[8/8]P";// "Ultimate Resistance - extremely overbought [8/8]";// [8/8]
   ln_txt[11]="[+1/8]P";// "overshoot [+1/8]";// [+1/8]
   ln_txt[12]="[+2/8]P";// "extremely overshoot [+2/8]";// [+2/8]
   //mml_shft = 3;
   mml_thk =3;
   // Íà÷àëüíàÿ óñòàíîâêà öâåòîâ óðîâíåé îêòàâ è òîëùèíû ëèíèé
   mml_clr[0] =mml_clr_m_2_8;   mml_wdth[0]=mml_wdth_m_2_8; // [-2]/8
   mml_clr[1] =mml_clr_m_1_8;   mml_wdth[1]=mml_wdth_m_1_8; // [-1]/8
   mml_clr[2] =mml_clr_0_8;     mml_wdth[2]=mml_wdth_0_8;   //  [0]/8
   mml_clr[3] =mml_clr_1_8;     mml_wdth[3]=mml_wdth_1_8;   //  [1]/8
   mml_clr[4] =mml_clr_2_8;     mml_wdth[4]=mml_wdth_2_8;   //  [2]/8
   mml_clr[5] =mml_clr_3_8;     mml_wdth[5]=mml_wdth_3_8;   //  [3]/8
   mml_clr[6] =mml_clr_4_8;     mml_wdth[6]=mml_wdth_4_8;   //  [4]/8
   mml_clr[7] =mml_clr_5_8;     mml_wdth[7]=mml_wdth_5_8;   //  [5]/8
   mml_clr[8] =mml_clr_6_8;     mml_wdth[8]=mml_wdth_6_8;   //  [6]/8
   mml_clr[9] =mml_clr_7_8;     mml_wdth[9]=mml_wdth_7_8;   //  [7]/8
   mml_clr[10]=mml_clr_8_8;     mml_wdth[10]= mml_wdth_8_8;   //  [8]/8
   mml_clr[11]=mml_clr_p_1_8;   mml_wdth[11]= mml_wdth_p_1_8; // [+1]/8
   mml_clr[12]=mml_clr_p_2_8;   mml_wdth[12]= mml_wdth_p_2_8; // [+2]/8
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
  int deinit() 
  {
//---- TODO: add your code here
   Comment(" ");
     for(i=0;i<OctLinesCnt;i++) 
     {
      buff_str="mml"+i;
      ObjectDelete(buff_str);
      buff_str="mml_txt"+i;
      ObjectDelete(buff_str);
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
  int start() 
  {
//---- TODO: add your code here
     if((nTime!=Time[0]) || (CurPeriod!=Period())){
      //price
      Print("MMLevls : NewPeriod = ",NewPeriod);
      bn_v1=Lowest(NULL,0,MODE_LOW,NewPeriod,StepBack);
      bn_v2=Highest(NULL,0,MODE_HIGH,NewPeriod,StepBack);
      v1=Low[bn_v1];
      v2=High[bn_v2];
      //determine fractal.....
      if(v2<=250000 && v2>25000 )
         fractal=100000;
      else
         if(v2<=25000 && v2>2500 )
            fractal=10000;
         else
            if(v2<=2500 && v2>250 )
               fractal=1000;
            else
               if(v2<=250 && v2>25 )
                  fractal=100;
               else
                  if(v2<=25 && v2>12.5 )
                     fractal=12.5;
                  else
                     if(v2<=12.5 && v2>6.25)
                        fractal=12.5;
                     else
                        if(v2<=6.25 && v2>3.125 )
                           fractal=6.25;
                        else
                           if(v2<=3.125 && v2>1.5625 )
                              fractal=3.125;
                           else
                              if(v2<=1.5625 && v2>0.390625 )
                                 fractal=1.5625;
                              else
                                 if(v2<=0.390625 && v2>0)
                                    fractal=0.1953125;
      range=(v2-v1);
      sum=MathFloor(MathLog(fractal/range)/MathLog(2));
      octave=fractal*(MathPow(0.5,sum));
      mn=MathFloor(v1/octave)*octave;
      if((mn+octave)>v2 )
         mx=mn+octave;
      else
         mx=mn+(2*octave);
      // calculating xx
      //x2
      if((v1>=(3*(mx-mn)/16+mn)) && (v2<=(9*(mx-mn)/16+mn)) )
         x2=mn+(mx-mn)/2;
      else x2=0;
      //x1
      if((v1>=(mn-(mx-mn)/8))&& (v2<=(5*(mx-mn)/8+mn)) && (x2==0) )
         x1=mn+(mx-mn)/2;
      else x1=0;
      //x4
      if((v1>=(mn+7*(mx-mn)/16))&& (v2<=(13*(mx-mn)/16+mn)) )
         x4=mn+3*(mx-mn)/4;
      else x4=0;
      //x5
      if((v1>=(mn+3*(mx-mn)/8))&& (v2<=(9*(mx-mn)/8+mn))&& (x4==0) )
         x5=mx;
      else  x5=0;
      //x3
      if((v1>=(mn+(mx-mn)/8))&& (v2<=(7*(mx-mn)/8+mn))&& (x1==0) && (x2==0) && (x4==0) && (x5==0) )
         x3=mn+3*(mx-mn)/4;
      else x3=0;
      //x6
      if((x1+x2+x3+x4+x5) ==0 )
         x6=mx;
      else x6=0;
      finalH=x1+x2+x3+x4+x5+x6;
      // calculating yy
      //y1
      if(x1>0 )
         y1=mn;
      else y1=0;
      //y2
      if(x2>0 )
         y2=mn+(mx-mn)/4;
      else y2=0;
      //y3
      if(x3>0 )
         y3=mn+(mx-mn)/4;
      else y3=0;
      //y4
      if(x4>0 )
         y4=mn+(mx-mn)/2;
      else y4=0;
      //y5
      if(x5>0 )
         y5=mn+(mx-mn)/2;
      else y5=0;
      //y6
      if((finalH>0) && ((y1+y2+y3+y4+y5)==0) )
         y6=mn;
      else y6=0;
//----
      finalL=y1+y2+y3+y4+y5+y6;
        for( i=0; i<OctLinesCnt; i++) 
        {
         mml[i]=0;
        }
      dmml=(finalH-finalL)/8;
      Print("MMLevls : NewPeriod = ",NewPeriod," dmml = ",dmml," finalL = ",finalL);
      mml[0] =(finalL-dmml*2); //-2/8
        for( i=1; i<OctLinesCnt; i++) 
        {
         mml[i]=mml[i-1] + dmml;
        }
        for( i=0; i<OctLinesCnt; i++ )
        {
         buff_str="mml"+i;
           if(ObjectFind(buff_str)==-1) 
           {
            ObjectCreate(buff_str, OBJ_HLINE, 0, Time[0], mml[i]);
            ObjectSet(buff_str, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSet(buff_str, OBJPROP_COLOR, mml_clr[i]);
            ObjectSet(buff_str, OBJPROP_WIDTH, mml_wdth[i]);
            ObjectMove(buff_str, 0, Time[0],  mml[i]);
           }
           else 
           {
            ObjectMove(buff_str, 0, Time[0],  mml[i]);
           }
         buff_str="mml_txt"+i;
           if(ObjectFind(buff_str)==-1) 
           {
            ObjectCreate(buff_str, OBJ_TEXT, 0, Time[mml_shft], mml_shft);
            ObjectSetText(buff_str, ln_txt[i], 8, "Arial", mml_clr[i]);
            ObjectMove(buff_str, 0, Time[mml_shft],  mml[i]);
           }
           else 
           {
            ObjectMove(buff_str, 0, Time[mml_shft],  mml[i]);
           }
        } // for( i=1; i<=OctLinesCnt; i++ ){
      nTime   =Time[0];
      CurPeriod= Period();
//----
      string buff_str="LR_LatestCulcBar";
        if(ObjectFind(buff_str)==-1) 
        {
         ObjectCreate(buff_str, OBJ_ARROW,0, Time[StepBack], Low[StepBack]-2*Point );
         ObjectSet(buff_str, OBJPROP_ARROWCODE, MarkNumber);
         ObjectSet(buff_str, OBJPROP_COLOR, MarkColor);
        }
        else 
        {
         ObjectMove(buff_str, 0, Time[StepBack], Low[StepBack]-2*Point );
        }
     }
//---- End Of Program
   return(0);
  }
//+------------------------------------------------------------------+ 

Comments