#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 White
#property indicator_color2 Black
#property indicator_color3 Black
#property indicator_color4 Black
#property indicator_color5 Lime
#property indicator_color6 Red
#property indicator_color7 White
#property indicator_color8 Yellow

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 Gibuf_104[];
double Gibuf_108[];
double Gda_112[];
double Gda_116[];
double Gibuf_120[];
double Gibuf_124[];
double Gibuf_128[];
double Gibuf_132[];
int Gia_136[6] = {0, 0, 0, 0, 0, 0};
int Gia_140[5] = {0, 0, 0, 0, 0};
int Gi_144;
int Gi_148;
int Gi_152;
int Gi_156;
int Gi_160;
bool Gi_164 = TRUE;
int Gbars_168 = 0;

void MainCalculation(int i) {
   if (Bars - i > SR + 1) SACalc(i);
   else Gda_112[i] = 0;
   if (Bars - i > FP + SR + 2) {
      SMCalc(i);
      return;
   }
   Gda_116[i] = 0;
}

void SACalc(int i) {
   int Li_4;
   int l_count_8;
   int Li_12;
   int Li_16;
   double ld_24;
   switch (PriceConst) {
   case 0:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_CLOSE, i);
      break;
   case 1:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, i);
      break;
   case 4:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_MEDIAN, i);
      break;
   case 5:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_TYPICAL, i);
      break;
   case 6:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_WEIGHTED, i);
      break;
   default:
      Gda_112[i] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, i);
   }
   for (int Li_20 = i + SR + 2; Li_20 > i; 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 < i) Li_16 = i;
      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_112[Li_20] = ld_24 / Li_4;
   }
}

double SnakePrice(int i) {
   switch (PriceConst) {
   case 0:
      return (Close[i]);
   case 1:
      return (Open[i]);
   case 4:
      return ((High[i] + Low[i]) / 2.0);
   case 5:
      return ((Close[i] + High[i] + Low[i]) / 3.0);
   case 6:
      return ((2.0 * Close[i] + High[i] + Low[i]) / 4.0);
   }
   return (Open[i]);
}

void SMCalc(int i) {
   double ld_4;
   double ld_12;
   for (int Li_20 = i + SR + 2; Li_20 >= i; Li_20--) {
      ld_4 = Gda_112[ArrayMaximum(Gda_112, FP, Li_20)];
      ld_12 = Gda_112[ArrayMinimum(Gda_112, FP, Li_20)];
      Gda_116[Li_20] = ((SMF + 2) * 2 * Gda_112[Li_20] - (ld_4 + ld_12)) / 2.0 / (SMF + 1);
   }
}

void LZZCalc(int i) {
   int Li_8;
   int Li_12;
   int Li_16;
   int index_20;
   int Li_4 = i - 1;
   int Li_24 = 0;
   int Li_28 = 0;
   while (Li_4 < Gi_144 && Li_16 == 0) {
      Li_4++;
      Gibuf_108[Li_4] = 0;
      Li_8 = Li_4 - MainRZZ;
      if (Li_8 < i) Li_8 = i;
      Li_12 = Li_4 + MainRZZ;
      if (Li_4 == ArrayMinimum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
         Li_16 = -1;
         Li_24 = Li_4;
      }
      if (Li_4 == ArrayMaximum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
         Li_16 = 1;
         Li_28 = Li_4;
      }
   }
   if (Li_16 != 0) {
      index_20 = 0;
      if (Li_4 > i) {
         if (Gda_116[Li_4] > Gda_116[i]) {
            if (Li_16 == 1) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) {
                  index_20++;
                  Gia_136[index_20] = Li_4;
               }
               Li_28 = Li_4;
               Gibuf_108[Li_4] = Gda_116[Li_4];
            }
         } else {
            if (Li_16 == -1) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) {
                  index_20++;
                  Gia_136[index_20] = Li_4;
               }
               Li_24 = Li_4;
               Gibuf_108[Li_4] = Gda_116[Li_4];
            }
         }
      }
      while (Li_4 < Gi_160 || index_20 < 5) {
         Gibuf_108[Li_4] = 0;
         Li_8 = Li_4 - MainRZZ;
         if (Li_8 < i) Li_8 = i;
         Li_12 = Li_4 + MainRZZ;
         if (Li_4 == ArrayMinimum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
            if (Li_16 == -1 && Gda_116[Li_4] < Gda_116[Li_24]) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) Gia_136[index_20] = Li_4;
               Gibuf_108[Li_24] = 0;
               Gibuf_108[Li_4] = Gda_116[Li_4];
               Li_24 = Li_4;
            }
            if (Li_16 == 1) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) {
                  index_20++;
                  Gia_136[index_20] = Li_4;
               }
               Gibuf_108[Li_4] = Gda_116[Li_4];
               Li_16 = -1;
               Li_24 = Li_4;
            }
         }
         if (Li_4 == ArrayMaximum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
            if (Li_16 == 1 && Gda_116[Li_4] > Gda_116[Li_28]) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) Gia_136[index_20] = Li_4;
               Gibuf_108[Li_28] = 0;
               Gibuf_108[Li_4] = Gda_116[Li_4];
               Li_28 = Li_4;
            }
            if (Li_16 == -1) {
               if (Li_4 >= i + MainRZZ && index_20 < 5) {
                  index_20++;
                  Gia_136[index_20] = Li_4;
               }
               Gibuf_108[Li_4] = Gda_116[Li_4];
               Li_16 = 1;
               Li_28 = Li_4;
            }
         }
         Li_4++;
         if (Li_4 > Gi_144) return;
      }
      Gi_152 = Bars - Gia_136[5];
      Gibuf_108[i] = Gda_116[i];
      return;
   }
}

void SZZCalc(int i) {
   int Li_8;
   int Li_12;
   int Li_16;
   int index_20;
   int Li_4 = i - 1;
   int Li_24 = 0;
   int Li_28 = 0;
   while (Li_4 <= Gi_160 && Li_16 == 0) {
      Li_4++;
      Gibuf_132[Li_4] = 0;
      Gibuf_128[Li_4] = 0;
      Gibuf_124[Li_4] = 0;
      Gibuf_120[Li_4] = 0;
      Gibuf_104[Li_4] = 0;
      Li_8 = Li_4 - SRZZ;
      if (Li_8 < i) Li_8 = i;
      Li_12 = Li_4 + SRZZ;
      if (Li_4 == ArrayMinimum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
         Li_16 = -1;
         Li_24 = Li_4;
      }
      if (Li_4 == ArrayMaximum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
         Li_16 = 1;
         Li_28 = Li_4;
      }
   }
   if (Li_16 != 0) {
      index_20 = 0;
      if (Li_4 > i) {
         if (Gda_116[Li_4] > Gda_116[i]) {
            if (Li_16 == 1) {
               if (Li_4 >= i + SRZZ && index_20 < 4) {
                  index_20++;
                  Gia_140[index_20] = Li_4;
               }
               Li_28 = Li_4;
               Gibuf_124[Li_4 - 1] = Open[Li_4 - 1];
            }
         } else {
            if (Li_16 == -1) {
               if (Li_4 >= i + SRZZ && index_20 < 4) {
                  index_20++;
                  Gia_140[index_20] = Li_4;
               }
               Li_24 = Li_4;
               Gibuf_120[Li_4 - 1] = Open[Li_4 - 1];
            }
         }
      }
      while (Li_4 <= Gi_160 || index_20 < 4) {
         Gibuf_132[Li_4] = 0;
         Gibuf_128[Li_4] = 0;
         Gibuf_124[Li_4] = 0;
         Gibuf_120[Li_4] = 0;
         Gibuf_104[Li_4] = 0;
         Li_8 = Li_4 - SRZZ;
         if (Li_8 < i) Li_8 = i;
         Li_12 = Li_4 + SRZZ;
         if (Li_4 == ArrayMinimum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
            if (Li_16 == -1 && Gda_116[Li_4] < Gda_116[Li_24]) {
               if (Li_4 >= i + SRZZ && index_20 < 4) Gia_140[index_20] = Li_4;
               Gibuf_120[Li_24 - 1] = 0;
               Gibuf_120[Li_4 - 1] = Open[Li_4 - 1];
               Li_24 = Li_4;
            }
            if (Li_16 == 1) {
               if (Li_4 >= i + SRZZ && index_20 < 4) {
                  index_20++;
                  Gia_140[index_20] = Li_4;
               }
               Gibuf_120[Li_4 - 1] = Open[Li_4 - 1];
               Li_16 = -1;
               Li_24 = Li_4;
            }
         }
         if (Li_4 == ArrayMaximum(Gda_116, Li_12 - Li_8 + 1, Li_8)) {
            if (Li_16 == 1 && Gda_116[Li_4] > Gda_116[Li_28]) {
               if (Li_4 >= i + SRZZ && index_20 < 4) Gia_140[index_20] = Li_4;
               Gibuf_124[Li_28 - 1] = 0;
               Gibuf_124[Li_4 - 1] = Open[Li_4 - 1];
               Li_28 = Li_4;
            }
            if (Li_16 == -1) {
               if (Li_4 >= i + SRZZ && index_20 < 4) {
                  index_20++;
                  Gia_140[index_20] = Li_4;
               }
               Gibuf_124[Li_4 - 1] = Open[Li_4 - 1];
               Li_16 = 1;
               Li_28 = Li_4;
            }
         }
         Li_4++;
         if (Li_4 > Gi_160) return;
      }
      Gi_148 = Bars - Gia_140[4];
      return;
   }
}

void ArrCalc() {
   int Li_8;
   int Li_16 = 0;
   for (int Li_0 = Gi_160; Gibuf_108[Li_0] == 0.0; Li_0--) {
   }
   int Li_4 = Li_0;
   double ld_20 = Gibuf_108[Li_0];
   for (Li_0--; Gibuf_108[Li_0] == 0.0; Li_0--) {
   }
   if (Gibuf_108[Li_0] > ld_20) Li_16 = 1;
   if (Gibuf_108[Li_0] > 0.0 && Gibuf_108[Li_0] < ld_20) Li_16 = -1;
   ld_20 = Gibuf_108[Li_4];
   for (Li_0 = Li_4 - 1; Li_0 > 0; Li_0--) {
      if (Gibuf_108[Li_0] > ld_20) {
         Li_16 = -1;
         ld_20 = Gibuf_108[Li_0];
      }
      if (Gibuf_108[Li_0] > 0.0 && Gibuf_108[Li_0] < ld_20) {
         Li_16 = 1;
         ld_20 = Gibuf_108[Li_0];
      }
      if (Li_16 > 0 && Gibuf_124[Li_0] > 0.0) {
         Gibuf_104[Li_0] = Open[Li_0];
         Gibuf_124[Li_0] = 0;
      }
      if (Li_16 < 0 && Gibuf_120[Li_0] > 0.0) {
         Gibuf_104[Li_0] = Open[Li_0];
         Gibuf_120[Li_0] = 0;
      }
      if (Li_16 > 0 && Gibuf_120[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 && Gibuf_124[Li_12] == 0.0; Li_12--) {
               Gibuf_128[Li_12] = Gibuf_120[Li_0];
               Gibuf_132[Li_12] = 0;
            }
         }
         if (Li_0 == 1) Gibuf_128[0] = Gibuf_120[Li_0];
      }
      if (Li_16 < 0 && Gibuf_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 (Li_12 = Li_4; Li_12 >= Li_8 && Gibuf_120[Li_12] == 0.0; Li_12--) {
               Gibuf_132[Li_12] = Gibuf_124[Li_0];
               Gibuf_128[Li_12] = 0;
            }
         }
         if (Li_0 == 1) Gibuf_132[0] = Gibuf_124[Li_0];
      }
   }
}

void deinit() {
}

int init() {
   IndicatorBuffers(8);
   SetIndexBuffer(0, Gibuf_104);
   SetIndexStyle(0, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(0, 34);
   SetIndexEmptyValue(0, 0.1);
   SetIndexBuffer(1, Gibuf_108);
   if (DrawZZ) {
      SetIndexStyle(1, DRAW_SECTION, EMPTY, 2);
      SetIndexEmptyValue(1, 0.0);
   } else SetIndexStyle(1, DRAW_NONE);
   SetIndexBuffer(2, Gda_112);
   SetIndexStyle(2, DRAW_NONE);
   SetIndexBuffer(3, Gda_116);
   SetIndexStyle(3, DRAW_NONE);
   SetIndexBuffer(4, Gibuf_120);
   SetIndexStyle(4, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(4, 59);
   SetIndexEmptyValue(4, 0.2);
   SetIndexBuffer(5, Gibuf_124);
   SetIndexStyle(5, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(5, 59);
   SetIndexEmptyValue(5, 0.2);
   SetIndexBuffer(6, Gibuf_128);
   SetIndexStyle(6, DRAW_ARROW, STYLE_SOLID, 0);
   SetIndexArrow(6, 59);
   SetIndexEmptyValue(6, 0.0);
   SetIndexBuffer(7, Gibuf_132);
   SetIndexStyle(7, DRAW_ARROW, STYLE_SOLID, 0);
   SetIndexArrow(7, 59);
   SetIndexEmptyValue(7, 0.0);
   return (0);
}

int start() {
   if (TimeCurrent() >= D'21.03.2029 08:00') return (0);
   int Li_0 = IndicatorCounted();
   if (Li_0 < 0) return (-1);
   if (Li_0 > 0) Li_0--;
   if (Gi_164 == TRUE) {
      if (SR < 2) SR = 2;
      if (Bars <= (MainRZZ + FP + SR + 2) * 2) return (-1);
      if (SRZZ <= SR) SRZZ = SR + 1;
      Gi_144 = Bars - (MainRZZ + FP + SR + 2);
      Gi_160 = Gi_144;
      Gi_156 = Gi_160;
      Gbars_168 = Bars;
      Gi_164 = FALSE;
   }
   int Li_4 = Bars - Li_0;
   for (int Li_8 = Li_4; Li_8 >= 0; Li_8--) MainCalculation(Li_8);
   if (Gbars_168 != Bars) {
      Gi_156 = Bars - Gi_148;
      Gi_160 = Bars - Gi_152;
      Gbars_168 = Bars;
   }
   SZZCalc(0);
   LZZCalc(0);
   ArrCalc();
   return (0);
}
/*
void StempelSEFC() {
   ObjectCreate("Original Created by SEFC", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Original Created by SEFC", "SEFC *PALATO* - (Palato = Under earth Kingdom)", 8, "Lucida Handwriting", SpringGreen);
   ObjectSet("Original Created by SEFC", OBJPROP_CORNER, 2);
   ObjectSet("Original Created by SEFC", OBJPROP_XDISTANCE, 5);
   ObjectSet("Original Created by SEFC", OBJPROP_YDISTANCE, 10);
}*/