Murrey_Math

Author: Vladislav Goshkov (VG).
Murrey_Math

This script implements a sophisticated technical analysis tool designed to identify key zones of support and resistance on a trading chart. Rather than using simple moving averages or standard price levels, it utilizes a mathematical approach based on "Octaves" to map out the structural boundaries of price action.

Core Logic and Methodology

1. Dynamic Range Analysis The script begins by scanning a specific lookback period to identify the highest and lowest prices reached. It then determines a "fractal" value—a constant based on the magnitude of the current price—and uses this to calculate the market's current range. This allows the indicator to adapt its sensitivity whether the asset is trading at very high prices or very low values.

2. The Octave System The logic calculates a "sum" (an octave) based on the ratio between the market range and the fractal value. By doing this, it identifies the natural "container" in which the price is currently oscillating. It establishes a Minimum (base) and a Maximum (ceiling) for the current trading environment.

3. Structural Pivot Identification The script performs a series of complex checks to see where the price has historically "stalled" or "reversed." It looks for specific mathematical coordinates within the range:

  • It evaluates whether the price has reached specific percentage points of the current range.
  • It validates these points based on how much "room" remains in the trend.
  • If a certain threshold is met, it marks that level as a significant pivot point (X-coordinates).

4. Support and Resistance Mapping Once the pivot points are identified, the script calculates a final "Height" and "Length" for the trading range. These results are then divided into 8 equal segments (the 1/8th system). This creates 13 distinct horizontal lines on your chart, each with a specific psychological meaning:

  • The Extremes (0/8 and 8/8): These represent "Ultimate Support" and "Ultimate Resistance." They signify areas where the market is extremely oversold or overbought.
  • Weak Zones (1/8 and 7/8): These are identified as "Stall and Reverse" zones. If the price moves too quickly and hits these lines, it suggests a high probability of an immediate reversal.
  • The Pivot Points (2/8 and 6/8): These are major reversal areas where the price has shown significant strength in turning around.
  • Trading Range Boundaries (3/8 and 5/8): These define the "Premium" and "Discount" zones. If the price stays near these levels for a period of time, it indicates a period of consolidation; if it breaks through, it suggests a new trend is forming.
  • The Major Pivot (4/8): This is the central equilibrium of the market. It acts as the strongest support level when the price is above it and the strongest resistance level when the price is below it.

Visual Representation

The script automatically draws these 13 horizontal lines on the chart and labels them clearly. Each line is assigned a specific color to help traders distinguish between "danger zones," "equilibrium points," and "trend boundaries" at a glance. By visualizing these levels, the script helps traders identify where the market is likely to react, slow down, or reverse based on the underlying mathematical structure of the price history.

9 Views
0 Downloads
0 Favorites
Murrey_Math
//+------------------------------------------------------------------+
//|                                            Murrey_Math_MT_VG.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#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 = 64;
extern int StepBack = 0;

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_shft = 3,
        nTime = 0,
        CurPeriod = 0,
        nDigits = 0,
        i = 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]";// "Ultimate Support - extremely oversold [0/8]";// [0/8]
   ln_txt[3]  = "ÎÑÒÀÍÎÂÊÀ_ÐÀÇÂÎÐÎÒ [1/8]";// "Weak, Stall and Reverse - [1/8]";// [1/8]
   ln_txt[4]  = "ÂÐÀÙÅÍÈÅ_ÐÀÇÂÎÐÎÒ [2/8]";// "Pivot, Reverse - major [2/8]";// [2/8]
   ln_txt[5]  = "ÄÍÎ_ÊÀÍÀËÀ [3/8]";// "Bottom of Trading Range - [3/8], if 10-12 bars then 40% Time. BUY Premium Zone";//[3/8]
   ln_txt[6]  = "ÑÎÏÐÎÒÈÂËÅÍÈÅ_ÏÎÄÄÅÐÆÊÀ [4/8]";// "Major Support/Resistance Pivotal Point [4/8]- Best New BUY or SELL level";// [4/8]
   ln_txt[7]  = "ÂÅÐÕ_ÊÀÍÀËÀ [5/8]";// "Top of Trading Range - [5/8], if 10-12 bars then 40% Time. SELL Premium Zone";//[5/8]
   ln_txt[8]  = "ÂÐÀÙÅÍÈÅ_ÐÀÇÂÎÐÎÒ [6/8]";// "Pivot, Reverse - major [6/8]";// [6/8]
   ln_txt[9]  = "ÎÑÒÀÍÎÂÊÀ_ÐÀÇÂÎÐÎÒ [7/8]";// "Weak, Stall and Reverse - [7/8]";// [7/8]
   ln_txt[10] = "ÑÎÏÐÎÒÈÂËÅÍÈÅ [8/8]";// "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 = 25;
   mml_thk  = 3;

   // Íà÷àëüíàÿ óñòàíîâêà öâåòîâ óðîâíåé îêòàâ 
   mml_clr[0]  = Magenta;     // [-2]/8
   mml_clr[1]  = Pink;        // [-1]/8
   mml_clr[2]  = Blue;        //  [0]/8
   mml_clr[3]  = Orange;      //  [1]/8
   mml_clr[4]  = Red;         //  [2]/8
   mml_clr[5]  = OliveDrab;   //  [3]/8
   mml_clr[6]  = Blue;        //  [4]/8
   mml_clr[7]  = OliveDrab;   //  [5]/8
   mml_clr[8]  = Red;         //  [6]/8
   mml_clr[9]  = Orange;      //  [7]/8
   mml_clr[10] = Blue;        //  [8]/8
   mml_clr[11] = Pink;        // [+1]/8
   mml_clr[12] = Magenta;     // [+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
   bn_v1 = Lowest(NULL,0,MODE_LOW,P+StepBack,0);
   bn_v2 = Highest(NULL,0,MODE_HIGH,P+StepBack,0);

   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;

   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]);
           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();

   }
 
//---- End Of Program
  return(0);
  }
//+------------------------------------------------------------------+

Comments