Murrey_Math_Line v2

Download script
Author: Vladislav Goshkov (VG) && Alex.Piech.FinGeR && Alexei Kharchenko
Murrey_Math_Line v2

This script implements a sophisticated technical analysis tool known as the Murrey Math Lines. Its primary purpose is to divide the trading price action into logical zones, identifying where the market is likely to find resistance (difficulty moving higher) or support (difficulty moving lower).

Instead of looking at simple averages, this logic calculates a mathematical "grid" based on the current price range. Here is a breakdown of how the system thinks:

Core Mathematical Logic

The script first identifies the highest and lowest prices over a specific period to establish a "trading range." It then uses a fractal-based calculation to determine the most relevant "octave" or scale for the current market volatility. This ensures that whether the price is moving in small increments or large swings, the lines adapt to the appropriate mathematical scale.

Once the range is established, the script calculates several specific "pivotal points." These aren't just random numbers; they are determined by checking where the price has actually moved and settled within that range. If certain conditions are met (such as price staying within a specific boundary), the script "activates" a specific level.

The 13 Levels of Analysis

The tool plots 13 horizontal lines, each with a unique significance:

  • Major Support & Resistance (4/8): This is the most critical line. It represents the primary "balance point." If the price is above this line, it acts as strong support; if below, it acts as strong resistance. This is often considered the best area for making significant trading decisions.
  • The Trading Range (3/8 and 5/8): These define the boundaries of the current "active" market. If the price spends a significant amount of time (around 10–12 bars) between these lines, it suggests a period of consolidation. The 5/8 is considered a "premium" selling zone, while the 3/8 is a "buying" zone.
  • Pivot and Reversal Points (2/8 and 6/8): These are major turning points. They indicate areas where the price has enough momentum to potentially flip its direction entirely.
  • Weakness and Stalls (1/8 and 7/8): These lines identify "weak" zones. If the price moves too quickly into these areas and stops, it suggests a high probability of an immediate reversal back toward the center of the range.
  • Extreme Zones ([0/8], [8/8], [-1/8], [+1/8], etc.): These represent "oversold" or "overbought" conditions. They indicate that the price has moved beyond the normal trading range and is in an extreme state, often signaling that a correction is imminent.

Visual Indicators

  • Dynamic Lines: The horizontal lines move automatically as new highs and lows are formed, ensuring the grid is always relevant to current market conditions.
  • Vertical Reference: The script can project vertical dotted lines to show the time-span of the current price range, helping traders visualize how long the current trend has been developing.
  • Custom Colors: Each level is assigned a specific color and thickness, allowing for immediate visual recognition of different market "moods" (e.g., identifying support vs. extreme exhaustion).
14 Views
0 Downloads
0 Favorites
Murrey_Math_Line v2
//+------------------------------------------------------------------+
//|                                          Murrey_Math_Line v2.mq4 |
//|                         Copyright © 2004, Vladislav Goshkov (VG).|
//|                                                      4vg@mail.ru |
//|            code change by Alex.Piech.FinGeR && Alexei Kharchenko |
//+------------------------------------------------------------------+
#property copyright "Vladislav Goshkov (VG) && Alex.Piech.FinGeR && Alexei Kharchenko "
#property link      "4vg@mail.ru && regnif@gmx.net"
#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 bool   VLine      =true;
extern color  MarkColor  =Blue;
extern int    MarkNumber =217;
//----
extern color  mmvl_clr     =Red;       
extern color  mml_clr_m_2_8=Black;       // [-2]/8
extern color  mml_clr_m_1_8=Black;       // [-1]/8
extern color  mml_clr_0_8  =DeepSkyBlue; //  [0]/8
extern color  mml_clr_1_8  =FireBrick;   //  [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  =FireBrick;   //  [7]/8
extern color  mml_clr_8_8  =DeepSkyBlue; //  [8]/8
extern color  mml_clr_p_1_8=Black;       // [+1]/8
extern color  mml_clr_p_2_8=Black;       // [+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  =1;        //  [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  =1;        //  [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  =1;        //  [8]/8
extern int    mml_wdth_p_1_8=1;       // [+1]/8
extern int    mml_wdth_p_2_8=2;       // [+2]/8
//----
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
//----
   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);
      buff_str="MML_LatestCulcBar";
      ObjectDelete(buff_str);
     }
   for(i=0;i<9;i++)
     {
      buff_str="mmvl"+i;
      ObjectDelete(buff_str);
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
  int start()
  {

//---- TODO: add your code here
//   if((nTime!=Time[0]) || (CurPeriod!=Period()))
//   {
      string buff_str="MML_StartBar";
      if(ObjectFind(buff_str)==-1)
      {
         ObjectCreate(buff_str, OBJ_ARROW,0, Time[16], Low[16]-2*Point );
         ObjectSet(buff_str, OBJPROP_ARROWCODE, MarkNumber);
         ObjectSet(buff_str, OBJPROP_COLOR, MarkColor);
         NewPeriod=16;
      }
      else
      {
         NewPeriod=iBarShift(NULL,0,ObjectGet(buff_str,OBJPROP_TIME1),false);
      }
      
      //price
      bn_v1=iLowest(NULL,0,MODE_LOW,NewPeriod,0);
      bn_v2=iHighest(NULL,0,MODE_HIGH,NewPeriod,0);
      v1=Low[bn_v1];
      v2=High[bn_v2];
      datetime t1=Time[bn_v1];
      datetime t2=Time[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;
      ArrayInitialize(mml,0);
      dmml=NormalizeDouble((finalH-finalL)/8,Digits);
      mml[0] =NormalizeDouble((finalL-dmml*2),Digits); //-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]);
         }
      }
      if(VLine)
      {
         int delta=MathAbs(Time[bn_v1]-Time[bn_v2]);
         for( i=0; i<9; i++ )
         {
            datetime time;
            if(bn_v1>bn_v2)
               time=t1+delta*i;
            else
               time=t2+delta*i;
         
            buff_str="mmvl"+i;
            if(ObjectFind(buff_str)==-1)
            {
               ObjectCreate(buff_str, OBJ_VLINE, 0,time,0);
               ObjectSet(buff_str, OBJPROP_STYLE, STYLE_DOT);
               ObjectSet(buff_str, OBJPROP_COLOR, mmvl_clr);
            }
            else
            {
               ObjectMove(buff_str, 0, time,0);
            }
         } 
      }
      else
      {
         if(ObjectFind("mmvl0")!=-1)
            for(i=0;i<9;i++)
           {
            buff_str="mmvl"+i;
            ObjectDelete(buff_str);
           }
       }  
//---- End Of Program
   return(0);
  }
//+------------------------------------------------------------------+

Comments