PV_Murrey_Math
Download scriptThis script is designed to identify and visualize specific price levels on a trading chart by analyzing the market's high and low extremes over a set period. It essentially automates the process of finding significant "structural" boundaries in price action, making it easier for a trader to see potential areas of support or resistance.
Core Logic Overview
The script functions through a multi-step mathematical process to determine where the "balance" of price currently lies:
1. Identifying Extremes First, the script looks back at a specific number of candles (defined by the user) to find the highest price point (High) and the lowest price point (Low). This establishes the total trading range for that period.
2. Fractal Scaling (The "Octave" System) Rather than just drawing simple lines, the script uses a logarithmic approach to determine the scale of the current market move. It calculates an "octave"—a mathematical value that helps the script understand how large or small the current price volatility is. This allows the indicator to adapt whether you are trading a very volatile pair or a very stable one.
3. Structural Analysis (The x and y coordinates) The most complex part of the logic involves calculating several internal "sub-points" within the high-low range. The script checks for various conditions to see where the price is sitting relative to the total range:
- It identifies specific mathematical segments (like 1/8th, 3/8ths, or 5/8ths of the total distance).
- It assigns different "weights" to these points based on how the price is behaving.
- If certain conditions are met, it selects a primary "Final High" and "Final Low."
4. Dynamic Grid Generation Once the "Final High" and "Final Low" are determined, the script divides that specific range into 8 equal parts (sub-divisions). This creates a localized grid of price levels.
Visual Output
The script translates these mathematical calculations into 8 distinct lines plotted on your chart. These lines represent:
- Key structural levels within the current market range.
- Dynamic boundaries that shift automatically as new highs and lows are formed.
- A visual "map" of where the market is currently balanced, helping to identify where price might stall or react.
In short, the script takes a raw period of price movement, calculates the most mathematically significant "balance points" within that move, and draws those levels on your screen as a dynamic guide.
//+------------------------------------------------------------------+
//| Murrey_Math_Modified.mq4 |
//| rewritten by CrazyChart |
//| |
//+------------------------------------------------------------------+
#property copyright "Murrey_Math_Modified. MetaTrader4 conversion created by PaVeL (CrazyChart)"
#property link "mailto:newcomer2003@yandex.ru"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 DarkGreen
#property indicator_color4 Blue
#property indicator_color5 DarkGreen
#property indicator_color6 Red
#property indicator_color7 Yellow
#property indicator_color8 Aqua
//---- input parameters
extern int CountBars = 500;
extern int ExtParam2;
extern int ExtParam3;
extern double myVar;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
//---- input parameters
extern int beginer=0;
extern int periodtotake=64;
extern int SomeVar=0;
int shift=0,i2=0,WorkTime=0,Periods=0;
double sum=0,v1=0,v2=0,fractal=0;
double v45=0,mml00=0,mml0=0,mml1=0,mml2=0,mml3=0,mml4=0,mml5=0,mml6=0,mml7=0,mml8=0,mml9=0,mml98=0,mml99=0;
double range=0,octave=0,mn=0,mx=0,price=0;
double finalH=0,finalL=0;
double x1=0,x2=0,x3=0,x4=0,x5=0,x6=0,y1=0,y2=0,y3=0,y4=0,y5=0,y6;
//string textArray[mm11_txt,mm12_txt,mm1_txt,mm2_txt,mm3_txt,mm4_txt,mm5_txt,mm6_txt,mm7_txt,mm8_txt,mm9_txt,mm-1_txt,mm-2_txt];
string textArray[13]={"mm11_txt","mm12_txt","mm1_txt","mm2_txt","mm3_txt","mm4_txt","mm5_txt","mm6_txt","mm7_txt","mm8_txt","mm9_txt","mm-1_txt","mm-2_txt"};
//string lineArray[13]={"mm11","mm12","mm1","mm2","mm3","mm4","mm5","mm6","mm7","mm8","mm9","mm-1","mm-2"};
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
IndicatorBuffers(8);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexDrawBegin(0,0);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
SetIndexDrawBegin(1,0);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexEmptyValue(2,0.0);
SetIndexDrawBegin(2,0);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,ExtMapBuffer4);
SetIndexEmptyValue(3,0.0);
SetIndexDrawBegin(3,0);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,ExtMapBuffer5);
SetIndexEmptyValue(4,0.0);
SetIndexDrawBegin(4,0);
SetIndexStyle(5,DRAW_LINE);
SetIndexBuffer(5,ExtMapBuffer6);
SetIndexEmptyValue(5,0.0);
SetIndexDrawBegin(5,0);
SetIndexStyle(6,DRAW_LINE);
SetIndexBuffer(6,ExtMapBuffer7);
SetIndexEmptyValue(6,0.0);
SetIndexDrawBegin(6,0);
SetIndexStyle(7,DRAW_LINE);
SetIndexBuffer(7,ExtMapBuffer8);
SetIndexEmptyValue(7,0.0);
SetIndexDrawBegin(7,0);
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectsDeleteAll(0, OBJ_HLINE);
int count=ArraySize(textArray);
for(int ch=0;ch<count;ch++) {
ObjectDelete(textArray[ch]);
//ObjectDelete(lineArray[ch]);
}
ObjectDelete("mm-sss");
//ObjectsDeleteAll(0, OBJ_TEXT);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit,counted_bars=IndicatorCounted(),i;
if (CountBars>=Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars);
SetIndexDrawBegin(1,Bars-CountBars);
SetIndexDrawBegin(2,Bars-CountBars);
SetIndexDrawBegin(3,Bars-CountBars);
SetIndexDrawBegin(4,Bars-CountBars);
SetIndexDrawBegin(5,Bars-CountBars);
SetIndexDrawBegin(6,Bars-CountBars);
SetIndexDrawBegin(7,Bars-CountBars);
//int counted_bars=IndicatorCounted(),CountBars;
//if (CountBars>=Bars) CountBars=Bars;
//SetIndexDrawBegin(0,Bars-CountBars);
//SetIndexDrawBegin(1,Bars-CountBars);
//for (shift=1;shift<=0;shift--) {
if (counted_bars<0) return(-1);
//---- last counted bar will be recounted
if (counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i=1;i<=0;i++) {
ExtMapBuffer1[Bars-i]=0.0;
ExtMapBuffer2[Bars-i]=0.0;
ExtMapBuffer3[Bars-i]=0.0;
ExtMapBuffer4[Bars-i]=0.0;
ExtMapBuffer5[Bars-i]=0.0;
ExtMapBuffer6[Bars-i]=0.0;
ExtMapBuffer7[Bars-i]=0.0;
ExtMapBuffer8[Bars-i]=0.0;
}
if( (WorkTime != Time[0]) || (Periods != Period()) ) {
for (i=limit;i>0;i--) {
//price
ExtMapBuffer1[i]=0;
ExtMapBuffer2[i]=0;
ExtMapBuffer3[i]=0;
ExtMapBuffer4[i]=0;
ExtMapBuffer5[i]=0;
ExtMapBuffer6[i]=0;
ExtMapBuffer7[i]=0;
ExtMapBuffer8[i]=0;
v1=(Low[Lowest(NULL,0,MODE_LOW,periodtotake+SomeVar,i+beginer)]);
v2=(High[Highest(NULL,0,MODE_HIGH,periodtotake+SomeVar,i+beginer)]);
//We would like to figure out these fractals
//triangle set OK
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;
//debugging((((
//v2=1.5625;
//v2=0.391625;
range=(v2-v1);
sum=MathFloor(MathLog(fractal/range)/MathLog(2));
octave=fractal*(MathPow(0.5,sum));
//Alert("Ïüÿíûé èíäþê ãîâîðèò, èê... îêòàâ = "+ octave);
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 when we have no sbj, du {}
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;
v45=(finalH-finalL)/8;
mml00=(finalL-v45*2); //-2/8
mml0=(finalL-v45); //-1/8
mml1=(finalL);// 0/8
mml2=(finalL+v45);// 1/8
mml3=(finalL+2*v45); // 2/8
mml4=(finalL+3*v45); // 3/8
mml5=(finalL+4*v45); // 4/8
mml6=(finalL+5*v45); // 5/8
mml7=(finalL+6*v45); // 6/8
mml8=(finalL+7*v45);// 7/8
mml9=(finalL+8*v45);// 8/8
mml99=(finalL+9*v45);// +1/8
mml98=(finalL+10*v45);// +2/8
ExtMapBuffer1[i]=mml2;
ExtMapBuffer2[i]=mml3;
ExtMapBuffer3[i]=mml4;
ExtMapBuffer4[i]=mml5;
ExtMapBuffer5[i]=mml6;
ExtMapBuffer6[i]=mml7;
ExtMapBuffer7[i]=mml8;
ExtMapBuffer8[i]=mml9;
//ExtMapBuffer1[shift]=0.0;
//ExtMapBuffer2[shift]=0.0;
if(GetLastError()!=0) Alert("Some error message");
}
//äàëüøå ïèøåì òåêñò
//*******************
/*
ObjectCreate("mm11_txt",OBJ_TEXT,0,Time[30],mml00,Time[30],mml00); //òàéì 30-2/8 áëèí
ObjectSetText("mm11_txt","-2/8",10,"Arial",Magenta);
//mm11_txt,mm12_txt,mm1_txt,mm2_txt,mm3_txt,mm4_txt,mm5_txt,mm6_txt,mm7_txt,mm8_txt,mm9_txt,mm-1_txt,mm-2_txt,,,
ObjectCreate("mm12_txt",OBJ_TEXT,0,Time[30],mml0,Time[30],mml0);
ObjectSetText("mm12_txt","-1/8 ",10,"Arial",Pink);
//+"÷"+v45+"mx"+mx
ObjectCreate("mm1_txt",OBJ_TEXT,0,Time[30],mml1,Time[30],mml1);
ObjectSetText("mm1_txt","0/8 ",10,"Arial",Yellow);
ObjectCreate("mm2_txt",OBJ_TEXT,0,Time[30],mml2,Time[30],mml2);
ObjectSetText("mm2_txt","1/8 ",10,"Arial",Orange);
ObjectCreate("mm3_txt",OBJ_TEXT,0,Time[30],mml3,Time[30],mml3);
ObjectSetText("mm3_txt","2/8 ",10,"Arial",Red);
ObjectCreate("mm4_txt",OBJ_TEXT,0,Time[30],mml4,Time[30],mml4);
ObjectSetText("mm4_txt","3/8 ",10,"Arial",Green);
ObjectCreate("mm5_txt",OBJ_TEXT,0,Time[30],mml5,Time[30],mml5);
ObjectSetText("mm5_txt","4/8 ",10,"Arial",Blue);
ObjectCreate("mm6_txt",OBJ_TEXT,0,Time[30],mml6,Time[30],mml6);
ObjectSetText("mm6_txt","5/8 ",10,"Arial",Green);
ObjectCreate("mm7_txt",OBJ_TEXT,0,Time[30],mml7,Time[30],mml7);
ObjectSetText("mm7_txt","6/8 ",10,"Arial",Red);
ObjectCreate("mm8_txt",OBJ_TEXT,0,Time[30],mml8,Time[30],mml8);
ObjectSetText("mm8_txt","7/8 ",10,"Arial",Orange);
ObjectCreate("mm9_txt",OBJ_TEXT,0,Time[30],mml9,Time[30],mml9);
ObjectSetText("mm9_txt","8/8 ",10,"Arial",Blue);
ObjectCreate("mm-1_txt",OBJ_TEXT,0,Time[30],mml99,Time[30],mml99);
ObjectSetText("mm-1_txt","+1/8 ",10,"Arial",Pink);
ObjectCreate("mm-2_txt",OBJ_TEXT,0,Time[30],mml98,Time[30],mml98);
ObjectSetText("mm-2_txt","+2/8 ",10,"Arial",Magenta);
*/
WorkTime = Time[0];
Periods= Period();
}
//----
return(0);
}
Comments