From c946191b1d1c7825f54169dbfd7262abcd6b2cd4 Mon Sep 17 00:00:00 2001 From: EarnForex <48102957+EarnForex@users.noreply.github.com> Date: Thu, 10 Mar 2022 18:17:50 +0200 Subject: [PATCH] 1.04 --- Murrey_Math_Line_X.mq4 | 356 +++++++++++++++++ Murrey_Math_Line_X.mq5 | 360 ++++++++++++++++++ .../murrey-math-line-x-pivots-for-btcusd.png | Bin 0 -> 14046 bytes 3 files changed, 716 insertions(+) create mode 100644 Murrey_Math_Line_X.mq4 create mode 100644 Murrey_Math_Line_X.mq5 create mode 100644 README_Images/murrey-math-line-x-pivots-for-btcusd.png diff --git a/Murrey_Math_Line_X.mq4 b/Murrey_Math_Line_X.mq4 new file mode 100644 index 0000000..f6ebf9c --- /dev/null +++ b/Murrey_Math_Line_X.mq4 @@ -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; +} +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/Murrey_Math_Line_X.mq5 b/Murrey_Math_Line_X.mq5 new file mode 100644 index 0000000..afed08d --- /dev/null +++ b/Murrey_Math_Line_X.mq5 @@ -0,0 +1,360 @@ +//+---------------------------------------------------------------------+ +//| Murrey_Math_Line_X.mq5 | +//| 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 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[]) +{ + ArraySetAsSeries(High, true); + ArraySetAsSeries(Low, true); + ArraySetAsSeries(Time, true); + + 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; +} +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/README_Images/murrey-math-line-x-pivots-for-btcusd.png b/README_Images/murrey-math-line-x-pivots-for-btcusd.png new file mode 100644 index 0000000000000000000000000000000000000000..c7337a343e3d22814e450795f8cf81ca8e5f6f8c GIT binary patch literal 14046 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 literal 0 HcmV?d00001