#property indicator_separate_window #property indicator_minimum 0.0 #property indicator_maximum 1.0 #property indicator_buffers 8 #property indicator_color1 MediumBlue #property indicator_color2 RoyalBlue #property indicator_color3 Blue #property indicator_color4 Blue #property indicator_color5 DarkGreen #property indicator_color6 Red #property indicator_color7 DarkGreen #property indicator_color8 Red extern int period = 0; extern int SR = 3; extern int SRZZ = 12; extern int MainRZZ = 20; extern int FP = 21; extern int SMF = 3; extern bool DrawZZ = FALSE; extern int PriceConst = 0; double g_ibuf_108[]; double g_ibuf_112[]; double gda_116[]; double gda_120[]; double g_ibuf_124[]; double g_ibuf_128[]; double g_ibuf_132[]; double g_ibuf_136[]; string gs_140; int gia_148[6] = {0, 0, 0, 0, 0, 0}; int gia_152[5] = {0, 0, 0, 0, 0}; int gi_156; int gi_160; int gi_164; int gi_168; int gi_172; bool gi_176 = TRUE; int g_bars_180 = 0; bool gi_184 = FALSE; int gi_188 = 0; bool gi_192 = FALSE; void MainCalculation(int ai_0) { if (Bars - ai_0 > SR + 1) SACalc(ai_0); else gda_116[ai_0] = 0; if (Bars - ai_0 > FP + SR + 2) { SMCalc(ai_0); return; } gda_120[ai_0] = 0; } void SACalc(int ai_0) { int li_4; int l_count_8; int li_12; int li_16; double ld_24; switch (PriceConst) { case 0: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_CLOSE, ai_0); break; case 1: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, ai_0); break; case 4: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_MEDIAN, ai_0); break; case 5: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_TYPICAL, ai_0); break; case 6: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_WEIGHTED, ai_0); break; default: gda_116[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, ai_0); } for (int li_20 = ai_0 + SR + 2; li_20 > ai_0; li_20--) { ld_24 = 0.0; li_4 = 0; l_count_8 = 0; li_12 = li_20 + SR; li_16 = li_20 - SR; if (li_16 < ai_0) li_16 = ai_0; while (li_12 >= li_20) { l_count_8++; ld_24 += l_count_8 * SnakePrice(li_12); li_4 += l_count_8; li_12--; } while (li_12 >= li_16) { l_count_8--; ld_24 += l_count_8 * SnakePrice(li_12); li_4 += l_count_8; li_12--; } gda_116[li_20] = ld_24 / li_4; } } double SnakePrice(int ai_0) { switch (PriceConst) { case 0: return (Close[ai_0]); case 1: return (Open[ai_0]); case 4: return ((High[ai_0] + Low[ai_0]) / 2.0); case 5: return ((Close[ai_0] + High[ai_0] + Low[ai_0]) / 3.0); case 6: return ((2.0 * Close[ai_0] + High[ai_0] + Low[ai_0]) / 4.0); } return (Open[ai_0]); } void SMCalc(int ai_0) { double ld_4; double ld_12; for (int li_20 = ai_0 + SR + 2; li_20 >= ai_0; li_20--) { ld_4 = gda_116[ArrayMaximum(gda_116, FP, li_20)]; ld_12 = gda_116[ArrayMinimum(gda_116, FP, li_20)]; gda_120[li_20] = ((SMF + 2) * 2 * gda_116[li_20] - (ld_4 + ld_12)) / 2.0 / (SMF + 1); } } void LZZCalc(int ai_0) { int li_8; int li_12; int li_16; int l_index_20; int li_4 = ai_0 - 1; int li_24 = 0; int li_28 = 0; while (li_4 < gi_156 && li_16 == 0) { li_4++; g_ibuf_112[li_4] = 0; li_8 = li_4 - MainRZZ; if (li_8 < ai_0) li_8 = ai_0; li_12 = li_4 + MainRZZ; if (li_4 == ArrayMinimum(gda_120, li_12 - li_8 + 1, li_8)) { li_16 = -1; li_24 = li_4; } if (li_4 == ArrayMaximum(gda_120, li_12 - li_8 + 1, li_8)) { li_16 = 1; li_28 = li_4; } } if (li_16 != 0) { l_index_20 = 0; if (li_4 > ai_0) { if (gda_120[li_4] > gda_120[ai_0]) { if (li_16 == 1) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) { l_index_20++; gia_148[l_index_20] = li_4; } li_28 = li_4; g_ibuf_112[li_4] = gda_120[li_4]; } } else { if (li_16 == -1) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) { l_index_20++; gia_148[l_index_20] = li_4; } li_24 = li_4; g_ibuf_112[li_4] = gda_120[li_4]; } } } while (li_4 < gi_172 || l_index_20 < 5) { g_ibuf_112[li_4] = 0; li_8 = li_4 - MainRZZ; if (li_8 < ai_0) li_8 = ai_0; li_12 = li_4 + MainRZZ; if (li_4 == ArrayMinimum(gda_120, li_12 - li_8 + 1, li_8)) { if (li_16 == -1 && gda_120[li_4] < gda_120[li_24]) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) gia_148[l_index_20] = li_4; g_ibuf_112[li_24] = 0; g_ibuf_112[li_4] = gda_120[li_4]; li_24 = li_4; } if (li_16 == 1) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) { l_index_20++; gia_148[l_index_20] = li_4; } g_ibuf_112[li_4] = gda_120[li_4]; li_16 = -1; li_24 = li_4; } } if (li_4 == ArrayMaximum(gda_120, li_12 - li_8 + 1, li_8)) { if (li_16 == 1 && gda_120[li_4] > gda_120[li_28]) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) gia_148[l_index_20] = li_4; g_ibuf_112[li_28] = 0; g_ibuf_112[li_4] = gda_120[li_4]; li_28 = li_4; } if (li_16 == -1) { if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) { l_index_20++; gia_148[l_index_20] = li_4; } g_ibuf_112[li_4] = gda_120[li_4]; li_16 = 1; li_28 = li_4; } } li_4++; if (li_4 > gi_156) return; } gi_164 = Bars - gia_148[5]; g_ibuf_112[ai_0] = gda_120[ai_0]; return; } } void SZZCalc(int ai_0) { int li_8; int li_12; int li_16; int l_index_20; int li_4 = ai_0 - 1; int li_24 = 0; int li_28 = 0; while (li_4 <= gi_172 && li_16 == 0) { li_4++; g_ibuf_136[li_4] = 0; g_ibuf_132[li_4] = 0; g_ibuf_128[li_4] = 0; g_ibuf_124[li_4] = 0; g_ibuf_108[li_4] = 0; li_8 = li_4 - SRZZ; if (li_8 < ai_0) li_8 = ai_0; li_12 = li_4 + SRZZ; if (li_4 == ArrayMinimum(gda_120, li_12 - li_8 + 1, li_8)) { li_16 = -1; li_24 = li_4; } if (li_4 == ArrayMaximum(gda_120, li_12 - li_8 + 1, li_8)) { li_16 = 1; li_28 = li_4; } } if (li_16 != 0) { l_index_20 = 0; if (li_4 > ai_0) { if (gda_120[li_4] > gda_120[ai_0]) { if (li_16 == 1) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) { l_index_20++; gia_152[l_index_20] = li_4; } li_28 = li_4; g_ibuf_128[li_4 - 1] = 1; } } else { if (li_16 == -1) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) { l_index_20++; gia_152[l_index_20] = li_4; } li_24 = li_4; g_ibuf_124[li_4 - 1] = 1; } } } while (li_4 <= gi_172 || l_index_20 < 4) { g_ibuf_136[li_4] = 0; g_ibuf_132[li_4] = 0; g_ibuf_128[li_4] = 0; g_ibuf_124[li_4] = 0; g_ibuf_108[li_4] = 0; li_8 = li_4 - SRZZ; if (li_8 < ai_0) li_8 = ai_0; li_12 = li_4 + SRZZ; if (li_4 == ArrayMinimum(gda_120, li_12 - li_8 + 1, li_8)) { if (li_16 == -1 && gda_120[li_4] < gda_120[li_24]) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) gia_152[l_index_20] = li_4; g_ibuf_124[li_24 - 1] = 0; g_ibuf_124[li_4 - 1] = 1; li_24 = li_4; } if (li_16 == 1) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) { l_index_20++; gia_152[l_index_20] = li_4; } g_ibuf_124[li_4 - 1] = 1; li_16 = -1; li_24 = li_4; } } if (li_4 == ArrayMaximum(gda_120, li_12 - li_8 + 1, li_8)) { if (li_16 == 1 && gda_120[li_4] > gda_120[li_28]) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) gia_152[l_index_20] = li_4; g_ibuf_128[li_28 - 1] = 0; g_ibuf_128[li_4 - 1] = 1; li_28 = li_4; } if (li_16 == -1) { if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) { l_index_20++; gia_152[l_index_20] = li_4; } g_ibuf_128[li_4 - 1] = 1; li_16 = 1; li_28 = li_4; } } li_4++; if (li_4 > gi_172) return; } gi_160 = Bars - gia_152[4]; return; } } void ArrCalc() { int li_8; int li_16 = 0; for (int li_0 = gi_172; g_ibuf_112[li_0] == 0.0; li_0--) { } int li_4 = li_0; double ld_20 = g_ibuf_112[li_0]; for (li_0--; g_ibuf_112[li_0] == 0.0; li_0--) { } if (g_ibuf_112[li_0] > ld_20) li_16 = 1; if (g_ibuf_112[li_0] > 0.0 && g_ibuf_112[li_0] < ld_20) li_16 = -1; ld_20 = g_ibuf_112[li_4]; for (li_0 = li_4 - 1; li_0 > 0; li_0--) { if (g_ibuf_112[li_0] > ld_20) { li_16 = -1; ld_20 = g_ibuf_112[li_0]; } if (g_ibuf_112[li_0] > 0.0 && g_ibuf_112[li_0] < ld_20) { li_16 = 1; ld_20 = g_ibuf_112[li_0]; } if (li_16 > 0 && g_ibuf_128[li_0] > 0.0) { g_ibuf_108[li_0] = 1; g_ibuf_128[li_0] = 0; } if (li_16 < 0 && g_ibuf_124[li_0] > 0.0) { g_ibuf_108[li_0] = 1; g_ibuf_124[li_0] = 0; } if (li_16 > 0 && g_ibuf_124[li_0] > 0.0) { if (li_0 > 1) { li_4 = li_0 - 1; li_8 = li_4 - SRZZ + 1; if (li_8 < 0) li_8 = 0; for (int li_12 = li_4; li_12 >= li_8 && g_ibuf_128[li_12] == 0.0; li_12--) { g_ibuf_132[li_12] = g_ibuf_124[li_0]; g_ibuf_136[li_12] = 0; } } if (li_0 == 1) g_ibuf_132[0] = g_ibuf_124[li_0]; } if (li_16 < 0 && g_ibuf_128[li_0] > 0.0) { if (li_0 > 1) { li_4 = li_0 - 1; li_8 = li_4 - SRZZ + 1; if (li_8 < 0) li_8 = 0; for (li_12 = li_4; li_12 >= li_8 && g_ibuf_124[li_12] == 0.0; li_12--) { g_ibuf_136[li_12] = g_ibuf_128[li_0]; g_ibuf_132[li_12] = 0; } } if (li_0 == 1) g_ibuf_136[0] = g_ibuf_128[li_0]; } } } void deinit() { } int init() { gs_140 = WindowExpertName(); IndicatorBuffers(8); SetIndexBuffer(0, g_ibuf_108); SetIndexStyle(0, DRAW_HISTOGRAM, EMPTY, 2); SetIndexEmptyValue(0, 0.0); SetIndexBuffer(1, g_ibuf_112); if (DrawZZ) { SetIndexStyle(1, DRAW_SECTION, EMPTY, 2); SetIndexEmptyValue(1, 0.0); } else SetIndexStyle(1, DRAW_NONE); SetIndexBuffer(2, gda_116); SetIndexStyle(2, DRAW_NONE); SetIndexBuffer(3, gda_120); SetIndexStyle(3, DRAW_NONE); SetIndexBuffer(4, g_ibuf_124); SetIndexStyle(4, DRAW_HISTOGRAM, EMPTY, 3); SetIndexArrow(4, 233); SetIndexEmptyValue(4, 0.0); SetIndexBuffer(5, g_ibuf_128); SetIndexStyle(5, DRAW_HISTOGRAM, EMPTY, 3); SetIndexArrow(5, 234); SetIndexEmptyValue(5, 0.0); SetIndexBuffer(6, g_ibuf_132); SetIndexStyle(6, DRAW_HISTOGRAM); SetIndexArrow(6, 217); SetIndexEmptyValue(6, 0.0); SetIndexBuffer(7, g_ibuf_136); SetIndexStyle(7, DRAW_HISTOGRAM); SetIndexArrow(7, 218); SetIndexEmptyValue(7, 0.0); return (0); } int start() { int li_0; int li_4; int li_28; int li_64; IndicatorShortName("ArrZZx2 period: " + DoubleToStr(period, 0)); if (period == Period() || period == 0) { gi_184 = FALSE; li_0 = IndicatorCounted(); if (li_0 < 0) return (-1); if (li_0 > 0) li_0--; if (gi_176 == TRUE) { if (SR < 2) SR = 2; if (Bars <= (MainRZZ + FP + SR + 2) * 2) return (-1); if (SRZZ <= SR) SRZZ = SR + 1; gi_156 = Bars - (MainRZZ + FP + SR + 2); gi_172 = gi_156; gi_168 = gi_172; g_bars_180 = Bars; gi_176 = FALSE; } li_4 = Bars - li_0; for (int li_8 = li_4; li_8 >= 0; li_8--) MainCalculation(li_8); if (g_bars_180 != Bars) { gi_168 = Bars - gi_160; gi_172 = Bars - gi_164; g_bars_180 = Bars; } SZZCalc(0); LZZCalc(0); ArrCalc(); return (0); } if (period < Period() && period != 0) { if (gi_184 == FALSE) { Alert("Parameter \"period\" is less than period of current graph. Please enter different period"); gi_184 = TRUE; } return (0); } gi_184 = FALSE; double ld_32 = period / Period(); int l_count_40 = 0; int l_error_44 = 0; int l_datetime_48 = iTime(NULL, period, 0); l_error_44 = GetLastError(); if (gi_188 == 0 && l_error_44 == 4066/* HISTORY_WILL_UPDATED */) { Alert("Error 4066: Data for period = ", period, " not loaded. Loading data... Indicator will be totally recounted in 1 minute."); gi_188 = TimeCurrent() + 60; } else { if (gi_188 > 0 && TimeCurrent() > gi_188) { Alert("Processing total recalculation of indicator."); gi_188 = 0; gi_192 = TRUE; } else { if (gi_192 == 2) { gi_192 = FALSE; Alert("Data for period = ", period, " loaded. Indicator recalculated totally."); } } } int li_52 = Time[0] - iTime(NULL, period, 0); double ld_56 = MathRound(li_52 / 60 / Period()) + 1.0; li_0 = IndicatorCounted(); if (gi_192 == TRUE) { li_0 = 1; gi_192 = 2; } if (li_0 < 0) return (-1); if (li_0 > 0) li_0--; for (double ld_20 = 0; ld_20 <= Bars - li_0 - 1; ld_20++) { li_64 = MathFloor((ld_20 + l_count_40 - ld_56) / ld_32) + 1.0; li_28 = MathRound(ld_20); if (Time[li_28] < iTime(NULL, period, li_64)) { l_count_40++; continue; } if (li_64 >= 1 && Time[li_28] >= iTime(NULL, period, li_64 - 1)) { l_count_40--; continue; } g_ibuf_108[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 0, li_64); g_ibuf_112[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 1, li_64); gda_116[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 2, li_64); gda_120[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 3, li_64); g_ibuf_124[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 4, li_64); g_ibuf_128[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 5, li_64); g_ibuf_132[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 6, li_64); g_ibuf_136[li_28] = iCustom(NULL, period, gs_140, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 7, li_64); } return (0); }