#property indicator_chart_window

extern int Start_Bar = 2;
extern int Line_Width = 2;
extern int Num_of_Channels = 1;
extern int Sensitivity = 0;
extern bool Show_Labels = TRUE;
extern bool Channel_as_Ray = TRUE;
extern bool Show_Alerts = TRUE;
extern color Channel_Color1 = Blue;
extern color Channel_Color2 = LightSkyBlue;
extern color Channel_Color3 = DeepPink;
extern color Channel_Color4 = DodgerBlue;
extern color Channel_Color5 = PaleGreen;
extern color Channel_Color6 = DarkOrange;
extern color Channel_Color7 = DodgerBlue;
extern color Channel_Color8 = Yellow;
double g_time_136 = 0.0;
double g_low_144 = 0.0;
double g_time_152 = 0.0;
double g_high_160 = 0.0;
double g_time_168 = 0.0;
double g_price_176 = 0.0;
double g_time_184 = 0.0;
double g_price_192 = 0.0;
double g_time_200 = 0.0;
double g_price_208 = 0.0;
double gd_216 = 0.0;
double gd_224 = 0.0;
double gd_232 = 0.0;
double gd_unused_240 = 0.0;
bool gi_248 = TRUE;
bool gi_unused_252 = FALSE;
int gi_256 = 0;
int gia_260[3];
int gia_264[3];
int gia_268[8];
int gi_272 = 0;
int gi_276 = 0;
int gi_280 = 0;

int init() {
   gia_268[0] = Channel_Color1;
   gia_268[1] = Channel_Color2;
   gia_268[2] = Channel_Color3;
   gia_268[3] = Channel_Color4;
   gia_268[4] = Channel_Color5;
   gia_268[5] = Channel_Color6;
   gia_268[6] = Channel_Color7;
   gia_268[7] = Channel_Color8;
   ArrayInitialize(gia_260, 0);
   ArrayInitialize(gia_264, 0);
   return (0);
}

int deinit() {
   for (int li_0 = 1; li_0 <= Num_of_Channels; li_0++) {
      ObjectDelete("Channel_" + li_0);
      if (Show_Labels) {
         ObjectDelete("Extremum_1_" + li_0);
         ObjectDelete("Extremum_2_" + li_0);
         ObjectDelete("Extremum_3_" + li_0);
      }
   }
   Comment(" ");
   ArrayInitialize(gia_260, 0);
   ArrayInitialize(gia_264, 0);
   return (0);
}

int min_ext(int ai_0) {
   bool li_ret_12 = FALSE;
   int li_8 = ai_0;
   int l_count_4 = 0;
   while (l_count_4 != 1) {
      if (Low[li_8 - 2] >= Low[li_8] && Low[li_8 - 1] >= Low[li_8] && Low[li_8] <= Low[li_8 + 1] && Low[li_8] <= Low[li_8 + 2]) {
         li_ret_12 = li_8;
         l_count_4++;
      }
      li_8++;
   }
   return (li_ret_12);
}

int max_ext(int ai_0) {
   bool li_ret_12 = FALSE;
   int li_8 = ai_0;
   int l_count_4 = 0;
   while (l_count_4 != 1) {
      if (High[li_8 - 2] <= High[li_8] && High[li_8 - 1] <= High[li_8] && High[li_8] >= High[li_8 + 1] && High[li_8] >= High[li_8 + 2]) {
         li_ret_12 = li_8;
         l_count_4++;
      }
      li_8++;
   }
   return (li_ret_12);
}

void find_extremums(int ai_0) {
   ArrayInitialize(gia_260, 0);
   gia_260[0] = min_ext(ai_0);
   g_low_144 = Low[gia_260[0]];
   g_time_136 = Time[gia_260[0]];
   gia_260[1] = max_ext(ai_0);
   g_high_160 = High[gia_260[1]];
   g_time_152 = Time[gia_260[1]];
   if (gia_260[0] < gia_260[1]) {
      gia_260[2] = min_ext(gia_260[1]);
      g_price_176 = Low[gia_260[2]];
      g_time_168 = Time[gia_260[2]];
      g_price_192 = g_low_144;
      g_time_184 = g_time_136;
      g_price_208 = g_high_160;
      g_time_200 = g_time_152;
      gi_272 = gia_260[0];
      gi_276 = gia_260[1];
      gi_280 = gia_260[2];
      gi_248 = FALSE;
   }
   if (gia_260[0] > gia_260[1]) {
      gia_260[2] = max_ext(gia_260[0]);
      g_price_176 = High[gia_260[2]];
      g_time_168 = Time[gia_260[2]];
      g_price_192 = g_high_160;
      g_time_184 = g_time_152;
      g_price_208 = g_low_144;
      g_time_200 = g_time_136;
      gi_272 = gia_260[1];
      gi_276 = gia_260[0];
      gi_280 = gia_260[2];
      gi_248 = TRUE;
   }
   if (gia_260[0] == gia_260[1]) {
      if (min_ext(gia_260[0] + 1) < max_ext(gia_260[0] + 2)) {
         gia_260[2] = min_ext(gia_260[0] + 2);
         g_price_176 = Low[gia_260[2]];
         g_time_168 = Time[gia_260[2]];
         g_price_192 = g_low_144;
         g_time_184 = g_time_136;
         g_price_208 = g_high_160;
         g_time_200 = g_time_152;
         gi_272 = gia_260[0];
         gi_276 = gia_260[1];
         gi_280 = gia_260[2];
         gi_248 = FALSE;
         return;
      }
      gia_260[2] = max_ext(gia_260[0] + 2);
      g_price_176 = High[gia_260[2]];
      g_time_168 = Time[gia_260[2]];
      g_price_192 = g_high_160;
      g_time_184 = g_time_152;
      g_price_208 = g_low_144;
      g_time_200 = g_time_136;
      gi_272 = gia_260[0];
      gi_276 = gia_260[1];
      gi_280 = gia_260[2];
      gi_248 = TRUE;
   }
}

int start() {
   int li_0 = 1;
   int l_index_4 = 0;
   int li_unused_8 = 0;
   if (Start_Bar > 0) gi_256 = Start_Bar;
   else gi_256 = 2;
   ArrayInitialize(gia_264, 0);
   find_extremums(gi_256);
   gd_216 = (g_price_192 - g_price_176) / (gi_280 - gi_272);
   if (gi_248) {
      gd_232 = High[gi_272] + gd_216 * gi_272;
      gd_224 = Low[gi_276] + gd_216 * gi_276;
   } else {
      gd_224 = Low[gi_272] + gd_216 * gi_272;
      gd_232 = High[gi_276] + gd_216 * gi_276;
   }
   if (Bid >= gd_232 - Sensitivity * Point && Bid <= gd_232 + Sensitivity * Point) {
      if (Show_Alerts) Alert("Верх канала - продажа.");
      Print("Верх канала - продажа.");
   }
   if (Ask <= gd_224 + Sensitivity * Point && Ask >= gd_224 - Sensitivity * Point) {
      if (Show_Alerts) Alert("Низ канала - покупка");
      Print("Низ канала - покупка");
   }
   deinit();
   Comment("Параметры канала:\nШирина = ", (gd_232 - gd_224) / Point, "; Наклон = ", (-gd_216) / Point, ";\nВерхняя граница = ", DoubleToStr(gd_232, Digits), "; Нижняя граница = ", DoubleToStr(gd_224, Digits), ";");
   while (li_0 <= Num_of_Channels) {
      gia_264[0] = gia_260[0];
      gia_264[1] = gia_260[1];
      gia_264[2] = gia_260[2];
      find_extremums(gi_256);
      if (gia_264[0] == gia_260[0] && gia_264[1] == gia_260[1] && gia_264[2] == gia_260[2]) gi_256++;
      else {
         if (Show_Labels) {
            ObjectCreate("Extremum_1_" + li_0, OBJ_ARROW, 0, g_time_136, g_low_144);
            ObjectSet("Extremum_1_" + li_0, OBJPROP_COLOR, gia_268[l_index_4]);
            ObjectSet("Extremum_1_" + li_0, OBJPROP_WIDTH, 1);
            ObjectSet("Extremum_1_" + li_0, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE);
            ObjectSet("Extremum_1_" + li_0, OBJPROP_STYLE, STYLE_SOLID);
            ObjectCreate("Extremum_2_" + li_0, OBJ_ARROW, 0, g_time_152, g_high_160);
            ObjectSet("Extremum_2_" + li_0, OBJPROP_COLOR, gia_268[l_index_4]);
            ObjectSet("Extremum_2_" + li_0, OBJPROP_WIDTH, 1);
            ObjectSet("Extremum_2_" + li_0, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE);
            ObjectSet("Extremum_2_" + li_0, OBJPROP_STYLE, STYLE_SOLID);
            ObjectCreate("Extremum_3_" + li_0, OBJ_ARROW, 0, g_time_168, g_price_176);
            ObjectSet("Extremum_3_" + li_0, OBJPROP_COLOR, gia_268[l_index_4]);
            ObjectSet("Extremum_3_" + li_0, OBJPROP_WIDTH, 1);
            ObjectSet("Extremum_3_" + li_0, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
            ObjectSet("Extremum_3_" + li_0, OBJPROP_STYLE, STYLE_SOLID);
         }
         ObjectCreate("Channel_" + li_0, OBJ_CHANNEL, 0, g_time_168, g_price_176, g_time_184, g_price_192, g_time_200, g_price_208);
         ObjectSet("Channel_" + li_0, OBJPROP_COLOR, gia_268[l_index_4]);
         ObjectSet("Channel_" + li_0, OBJPROP_WIDTH, Line_Width);
         ObjectSet("Channel_" + li_0, OBJPROP_RAY, Channel_as_Ray);
         ObjectSet("Channel_" + li_0, OBJPROP_STYLE, STYLE_SOLID);
         li_0++;
         if (l_index_4 < 7) l_index_4++;
         else l_index_4 = 0;
      }
      gi_256++;
   }
   return (0);
}