Skip to content

Commit

Permalink
1.04
Browse files Browse the repository at this point in the history
  • Loading branch information
EarnForex authored Mar 10, 2022
1 parent ac72466 commit c946191
Show file tree
Hide file tree
Showing 3 changed files with 716 additions and 0 deletions.
356 changes: 356 additions & 0 deletions Murrey_Math_Line_X.mq4
Original file line number Diff line number Diff line change
@@ -0,0 +1,356 @@
//+---------------------------------------------------------------------+
//| Murrey_Math_Line_X.mq4 |
//| Copyright © 2010-2022, EarnForex.com |
//| Copyright © 2004, Vladislav Goshkov (VG) |
//| 4vg@mail.ru |
//| code change by Alex.Piech.FinGeR |
//| https://www.earnforex.com/metatrader-indicators/Murrey-Math-Line-X/ |
//+---------------------------------------------------------------------+
#property copyright "Copyright © 2010-2022, EarnForex"
#property link "https://www.earnforex.com/metatrader-indicators/Murrey-Math-Line-X/"
#property version "1.04"
#property strict

#property description "Murrey Math Line X - support and resistance lines according to Murrey Math rules."

#property indicator_chart_window
#property indicator_plots 0

// ============================================================================================
// * Line 8/8 и 0/8 (Ultimate Support and Ultimate Resistance).
// * Those lines are the most strong concerning Support and resistance.
// ============================================================================================
//* Line 7/8 (Weak, Place to Stop and Reverse).
//* This line is weak. If suddenly the price was going too fast and too far and stops around this line
//* it means the price will reverse down very soon. If the price did not stop near this line this price
//* will continue the movement to the line 8/8.
// ============================================================================================
//* Line 1/8 (Weak, Place to Stop and Reverse).
//* This line is weak. If suddenly the price was going too fast and too far and stops around this line
//* it means the price will reverse up very soon. If the price did not stop near this line this price
//* will continue the movement down to the line 0/8.
// ============================================================================================
//* Line 2/8 and 6/8 (Pivot, Reverse)
//* Those two lines yield the line 4/8 only to the strength to reverse the price movement.
// ============================================================================================
//* Line 5/8 (Top of Trading Range)
//* The price is spending the about 40% of the time on the movement between the lines 5/8 and 3/8.
//* If the price is moving near line 5/8 and stopping near the line during the 10 - 12 days so it means
//* that it is necessary to sell in this "bonus zone" (some people are doing like this) but if the price is keeping the tendency to stay above
//* 5/8 line, so it means that the price will be above. But if the price is dropping below 5/8 line it means that the price will continue
//* falling to the next level of resistance.
// ============================================================================================
//* Line 3/8 (Bottom of Trading Range).
//* If the price is below this line and in uptrend it means that it will be very difficult for the price to break this level.
//* If the price broke this line during the uptrend and staying above during the 10 12 days it means that the price will be above this line
//* during the 40% of its time moving between this line and 5/8 line.
// ============================================================================================
//* Line 4/8 (Major Support/Resistance Line).
//* It is the major line concerning support and resistance. This level is the better for the new sell or buy.
//* It is the strong level of support of the price is above 4/8. It is the fine resistance line if the price is below this 4/8 line.
// ============================================================================================

enum enum_side
{
Left,
Right
};

input int period = 64; // Period
input ENUM_TIMEFRAMES UpperTimeframe = PERIOD_D1;
input int StepBack = 0;

input enum_side LabelSide = Left;

input color mml_clr_m_2_8 = clrWhite; // [-2]/8 Color
input color mml_clr_m_1_8 = clrWhite; // [-1]/8 Color
input color mml_clr_0_8 = clrAqua; // [0]/8 Color
input color mml_clr_1_8 = clrYellow; // [1]/8 Color
input color mml_clr_2_8 = clrRed; // [2]/8 Color
input color mml_clr_3_8 = clrGreen; // [3]/8 Color
input color mml_clr_4_8 = clrBlue; // [4]/8 Color
input color mml_clr_5_8 = clrGreen; // [5]/8 Color
input color mml_clr_6_8 = clrRed; // [6]/8 Color
input color mml_clr_7_8 = clrYellow; // [7]/8 Color
input color mml_clr_8_8 = clrAqua; // [8]/8 Color
input color mml_clr_p_1_8 = clrWhite; // [+1]/8 Color
input color mml_clr_p_2_8 = clrWhite; // [+2]/8 Color

input int mml_wdth_m_2_8 = 2; // [-2]/8 Width
input int mml_wdth_m_1_8 = 1; // [-1]/8 Width
input int mml_wdth_0_8 = 1; // [0]/8 Width
input int mml_wdth_1_8 = 1; // [1]/8 Width
input int mml_wdth_2_8 = 1; // [2]/8 Width
input int mml_wdth_3_8 = 1; // [3]/8 Width
input int mml_wdth_4_8 = 1; // [4]/8 Width
input int mml_wdth_5_8 = 1; // [5]/8 Width
input int mml_wdth_6_8 = 1; // [6]/8 Width
input int mml_wdth_7_8 = 1; // [7]/8 Width
input int mml_wdth_8_8 = 1; // [8]/8 Width
input int mml_wdth_p_1_8 = 1; // [+1]/8 Width
input int mml_wdth_p_2_8 = 2; // [+2]/8 Width

input color MarkColor = clrBlue;
input int MarkNumber = 217;

input string FontFace = "Verdana";
input int FontSize = 10;
input string ObjectPrefix = "MML-";

string ln_txt[13];

int
OctLinesCnt = 13,
mml_clr[13],
mml_wdth[13];

datetime nTime = 0;

int NewPeriod = 0;

void OnInit()
{
if ((UpperTimeframe != PERIOD_CURRENT) && (UpperTimeframe != Period()))
{
NewPeriod = period * (int)MathCeil(PeriodSeconds(UpperTimeframe) / PeriodSeconds(Period()));
}
else
{
NewPeriod = period;
}

ln_txt[0] = "[-2/8]P Extreme Overshoot [-2/8]";
ln_txt[1] = "[-1/8]P Overshoot [-1/8]";
ln_txt[2] = "[0/8]P Ultimate Support - extremely oversold [0/8]";
ln_txt[3] = "[1/8]P Weak, Place to Stop and Reverse [1/8]";
ln_txt[4] = "[2/8]P Pivot, Reverse - major [2/8]";
ln_txt[5] = "[3/8]P Bottom of Trading Range [3/8] - BUY Premium Zone";
ln_txt[6] = "[4/8]P Major S/R Pivot Point [4/8] - Best New BUY or SELL level";
ln_txt[7] = "[5/8]P Top of Trading Range [5/8] - SELL Premium Zone";
ln_txt[8] = "[6/8]P Pivot, Reverse - major [6/8]";
ln_txt[9] = "[7/8]P Weak, Place to Stop and Reverse [7/8]";
ln_txt[10] = "[8/8]P Ultimate Resistance - extremely overbought [8/8]";
ln_txt[11] = "[+1/8]P Overshoot [+1/8]";
ln_txt[12] = "[+2/8]P Extreme Overshoot [+2/8]";

// Initial setting of the lines' colors and width
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
}

void OnDeinit(const int reason)
{
ObjectsDeleteAll(ChartID(), ObjectPrefix);
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if (nTime == Time[0]) return 0;

// Price
int bn_v1 = ArrayMinimum(Low, StepBack, NewPeriod + StepBack);
int bn_v2 = ArrayMaximum(High, StepBack, NewPeriod + StepBack);

double v1 = Low[bn_v1];
double v2 = High[bn_v2];

double fractal = 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;

double range = v2 - v1;
double sum = MathFloor(MathLog(fractal / range) / MathLog(2));
double octave = fractal * (MathPow(0.5, sum));
double mn = MathFloor(v1 / octave) * octave;
double mx;
if (mn + octave > v2) mx = mn + octave;
else mx = mn + (2 * octave);

// Calculating X's
double x1, x2, x3, x4, x5, x6;

// 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;

double finalH = x1 + x2 + x3 + x4 + x5 + x6;

// Calculating Y's
double y1, y2, y3, y4, y5, y6;

// 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;

double finalL = y1 + y2 + y3 + y4 + y5 + y6;

double dmml = (finalH - finalL) / 8;

double mml[13];

mml[0] = (finalL - dmml * 2); //-2/8

for (int i = 1; i < OctLinesCnt; i++)
mml[i] = mml[i - 1] + dmml;

int first_bar = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);

if (first_bar == 0) return 0; // Data not ready.

if (LabelSide == Right) first_bar = 1;

for (int i = 0; i < OctLinesCnt; i++)
{
string name = ObjectPrefix + IntegerToString(i);
if (ObjectFind(0, name) == -1)
{
ObjectCreate(0, name, OBJ_HLINE, 0, Time[0], mml[i]);
ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, name, OBJPROP_COLOR, mml_clr[i]);
ObjectSetInteger(0, name, OBJPROP_WIDTH, mml_wdth[i]);
}
else ObjectMove(0, name, 0, Time[0], mml[i]);

name = ObjectPrefix + "txt" + IntegerToString(i);
if (ObjectFind(0, name) == -1)
{
ObjectCreate(0, name, OBJ_TEXT, 0, Time[first_bar - 1], mml[i]);
ObjectSetString(0, name, OBJPROP_TEXT, ln_txt[i]);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, FontSize);
ObjectSetString(0, name, OBJPROP_FONT, FontFace);
ObjectSetInteger(0, name, OBJPROP_COLOR, mml_clr[i]);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
}
else ObjectMove(0, name, 0, Time[first_bar - 1], mml[i]);
}

string name = ObjectPrefix + "LatestCalcBar";
if (ObjectFind(0, name) == -1)
{
ObjectCreate(0, name, OBJ_ARROW, 0, Time[StepBack], Low[StepBack] - 2 * _Point);
ObjectSetInteger(0, name, OBJPROP_ARROWCODE, MarkNumber);
ObjectSetInteger(0, name, OBJPROP_COLOR, MarkColor);
}
else ObjectMove(0, name, 0, Time[StepBack], Low[StepBack] - 2 * _Point);

nTime = Time[0];

return rates_total;
}
//+------------------------------------------------------------------+
Loading

0 comments on commit c946191

Please sign in to comment.