This script is designed to provide a visual structural analysis of price movements on a trading chart. It automates the calculation of specific price levels based on "Murrey Math" principles, which are used to identify potential support and resistance zones within a given market range.
Core Logic Overview
The script functions by analyzing a set period of historical price data to determine the high and low boundaries. Once these boundaries are established, it performs several logical steps to map out significant price levels:
1. Range and Octave Analysis The tool first calculates the total vertical distance between the highest high and lowest low over a specific timeframe. It then identifies the "Fractal" of the market—essentially determining the scale of the current price movement. By calculating the "Octave," the script adjusts its perspective to match the magnitude of the market, ensuring that the resulting levels remain relevant whether the price is moving in small increments or large swings.
2. Dynamic Pivot Identification The logic evaluates several specific conditions to determine where significant structural pivots occur within the current range. It checks for various "X" coordinates (geometric points) based on the relationship between the current high, the current low, and the calculated octave. This helps the script decide which parts of the range are technically significant and which are merely noise.
3. Level Generation (The 8/8 Grid) Based on the identified pivots, the script calculates a series of balanced price levels. It creates a structured grid that divides the market movement into eighths (similar to musical notes). These represent:
- Primary Levels: The core structural points of the current trend.
- Secondary Levels: Over-extended or "overflow" levels (labeled as +1/8, +2/8, -1/8, etc.) that indicate how far the price has pushed beyond the standard expected range.
Visual Presentation
The script translates these complex mathematical calculations into clear visual aids directly on your chart:
- Horizontal Lines: It draws a series of horizontal lines representing the calculated eighths of the market range. Each line is assigned a specific color and thickness to help differentiate between core levels and extreme zones.
- Price Labels: To ensure clarity, the script places text labels on the right side of the chart (e.g., "0/8", "1/8", "-1/8"). These labels identify exactly which structural level the price is currently interacting with.
- Real-Time Updates: The logic is set to refresh whenever new data arrives or the timeframe changes, ensuring that the levels move dynamically as the market develops.
Summary for the User
Instead of you having to manually estimate where "support" or "resistance" might be, this script automatically measures the current market "container." It then draws a grid showing you exactly where the most significant price milestones are located based on the mathematical proportions of the current trend.
//+------------------------------------------------------------------+
//| Murrey_Math_Modified.mq4 |
//| rewritten by CrazyChart |
//| |
//+------------------------------------------------------------------+
#property copyright "Murrey_Math_Modified. MetaTrader4 conversion created by CrazyChart"
#property link "mailto:newcomer2003@yandex.ru"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 MediumBlue
#property indicator_color2 Red
//---- input parameters
extern int beginer=200;
extern int periodtotake=200;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//---- TODO: add your code here
int shift,i2,WorkTime,Periods;
double sum,v1,v2,fractal;
double v45,mml00,mml0,mml1,mml2,mml3,mml4,mml5,mml6,mml7,mml8,mml9,mml98,mml99;
double range,octave,mn,mx,price;
double finalH,finalL;
double x1,x2,x3,x4,x5,x6,y1,y2,y3,y4,y5,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()
{
//---- indicators
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
//----
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]);
}
//ObjectsDeleteAll(0, OBJ_TEXT);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
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( (WorkTime != Time[0]) || (Periods != Period()) ) {
//price
v1=(Low[Lowest(NULL,0,MODE_LOW,periodtotake,0)]);
v2=(High[Highest(NULL,0,MODE_HIGH,periodtotake,0)]);
//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;
}
//debugging((((
//v2=1.5625;
//v2=0.391625;
range=(v2-v1);
//debugging((((
//fractal=1.5625;
//debugging))))
//Alert("Ñåé÷àñ ìàòîì íà÷íó ðóãàòüñÿ ãðîìêî î÷åíü 1 ôðàêòàë "+fractal);
//Alert("Range, èê... range = "+ range);
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/16*(mx-mn)+mn)&& (v2<=9/16*(mx-mn)+mn)) {
x2=mn+(mx-mn)/2;
}else{
x2=0;
}
//x1
if((v1>=mn-(mx-mn)/8)&& (v2<=5/8*(mx-mn)+mn) && x2==0) {
x1=mn+(mx-mn)/2;
}else{
x1=0;
}
//x4
if((v1>=mn+7*(mx-mn)/16)&& (v2<=13/16*(mx-mn)+mn)) {
x4=mn+3*(mx-mn)/4;
}else{
x4=0;
}
//x5
if((v1>=mn+3*(mx-mn)/8)&& (v2<=9/8*(mx-mn)+mn)&& x4==0) {
x5=mx;
}else{
x5=0;
}
//x3
if((v1>=mn+(mx-mn)/8)&& (v2<=7/8*(mx-mn)+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;
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
//comment("\n","finalh = ",finalh,"\n","finalL = ",finalL,"\n","v45 = ",v45,
//"\n","octave = ",octave,"\n","mn = ",mn,"\n","mx = ",mx,"\n","Fractal = ",fractal,
//"\n","range = ",range,"\n","sum = ",sum,"\n","high =",v2,"\n","Low = ",v1);
//name: named object name
//text: named object text to set
//font: font name
//size: font size
//color: text color
ObjectsRedraw( ) ;
//Comment("f,shdfkr "+ mml00);
//mml00=Close[5];
ObjectCreate("mm11_txt",OBJ_TEXT,0,Time[30],mml00,Time[30],mml00); //òàéì 30-2/8 áëèí
ObjectSetText("mm11_txt","_ôèíàë ë"+finalH+"mml7 "+mml7,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);
ObjectCreate("mm1_txt",OBJ_TEXT,0,Time[30],mml1,Time[30],mml1);
ObjectSetText("mm1_txt","0/8 ",10,"Arial",Blue);
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);
ObjectCreate("mm11",OBJ_HLINE,0,Time[0],mml00,Time[0],mml00);
ObjectMove("MyTrend", 1, Time[0], mml00);
ObjectSet("mm11",OBJPROP_COLOR,Magenta);
ObjectSet("mm11",OBJPROP_WIDTH,2);ObjectSet("mm11",OBJPROP_STYLE,STYLE_SOLID);
// -2/8
ObjectCreate("mm12" ,OBJ_HLINE,0,Time[0],mml0,Time[0],mml0);
ObjectSet("mm12",OBJPROP_COLOR,Pink);ObjectSet("mm12",OBJPROP_WIDTH,1);ObjectSet("mm12",OBJPROP_STYLE,STYLE_SOLID);
// -1/8
ObjectCreate("mm1" ,OBJ_HLINE,0,Time[0],mml1,Time[0],mml1);
ObjectSet("mm1",OBJPROP_COLOR,Blue);ObjectSet("mm1",OBJPROP_WIDTH,2);ObjectSet("mm1",OBJPROP_STYLE, STYLE_SOLID);
// 0/8
ObjectCreate("mm2" ,OBJ_HLINE,0,Time[0],mml2,Time[0],mml2);
ObjectSet("mm2",OBJPROP_COLOR,Orange);ObjectSet("mm2",OBJPROP_WIDTH,1);ObjectSet("mm2",OBJPROP_STYLE, STYLE_SOLID);
// 1/8
ObjectCreate("mm3" ,OBJ_HLINE,0,Time[0],mml3,Time[0],mml3);
ObjectSet("mm3",OBJPROP_COLOR,Red);ObjectSet("mm3",OBJPROP_WIDTH,1);ObjectSet("mm3",OBJPROP_STYLE, STYLE_SOLID);
// 2/8
ObjectCreate("mm4" ,OBJ_HLINE,0,Time[0],mml4,Time[0],mml4);
ObjectSet("mm4",OBJPROP_COLOR,Green);ObjectSet("mm4",OBJPROP_WIDTH,1);ObjectSet("mm4",OBJPROP_STYLE, STYLE_SOLID);
// 3/8
ObjectCreate("mm5" ,OBJ_HLINE,0,Time[0],mml5,Time[0],mml5);
ObjectSet("mm5",OBJPROP_COLOR,Blue);ObjectSet("mm5",OBJPROP_WIDTH,1);ObjectSet("mm5",OBJPROP_STYLE, STYLE_SOLID);
// 4/8
ObjectCreate("mm6" ,OBJ_HLINE,0,Time[0],mml6,Time[0],mml6);
ObjectSet("mm6",OBJPROP_COLOR,Green);ObjectSet("mm6",OBJPROP_WIDTH,1);ObjectSet("mm6",OBJPROP_STYLE, STYLE_SOLID);
// 5/8
ObjectCreate("mm7" ,OBJ_HLINE,0,Time[0],mml7,Time[0],mml7);
ObjectSet("mm7",OBJPROP_COLOR,Red);ObjectSet("mm7",OBJPROP_WIDTH,1);ObjectSet("mm7",OBJPROP_STYLE, STYLE_SOLID);
// 6/8
ObjectCreate("mm8" ,OBJ_HLINE,0,Time[0],mml8,Time[0],mml8);
ObjectSet("mm8",OBJPROP_COLOR,Orange);ObjectSet("mm8",OBJPROP_WIDTH,1);ObjectSet("mm8",OBJPROP_STYLE, STYLE_SOLID);
// 7/8
ObjectCreate("mm9" ,OBJ_HLINE,0,Time[0],mml9,Time[0],mml9);
ObjectSet("mm9",OBJPROP_COLOR,Red);ObjectSet("mm9",OBJPROP_WIDTH,2);ObjectSet("mm9",OBJPROP_STYLE, STYLE_SOLID);
// 0/8
ObjectCreate("mm-1" ,OBJ_HLINE,0,Time[0],mml99,Time[0],mml99);
ObjectSet("mm-1",OBJPROP_COLOR,Pink);ObjectSet("mm-1",OBJPROP_WIDTH,1);ObjectSet("mm-1",OBJPROP_STYLE, STYLE_SOLID);
// +2/8
ObjectCreate("mm-2" ,OBJ_HLINE,0,Time[0],mml98,Time[0],mml98);
ObjectSet("mm-2",OBJPROP_COLOR,Magenta);ObjectSet("mm-2",OBJPROP_WIDTH,2);ObjectSet("mm-2",OBJPROP_STYLE, STYLE_SOLID);
// +1/8
//ObjectCreate("12121" ,OBJ_HLINE,0,Time[0],1.2000,Time[0],1.2000);
//ObjectSet("12121",OBJPROP_COLOR,Magenta);ObjectSet("12121",OBJPROP_WIDTH,4);ObjectSet("12121",OBJPROP_STYLE, STYLE_SOLID);
//ExtMapBuffer1[shift]=0.0;
//ExtMapBuffer2[shift]=0.0;
if(GetLastError()!=0) Alert("Some error message");
//}
WorkTime = Time[0];
Periods= Period();
}
//----
return(0);
}
Comments