#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Black
#property indicator_color3 Black

double g_ibuf_76[];
double g_ibuf_80[];
double g_ibuf_84[];
extern color LineColor = C'228,188,82';
extern int AllBars = 240;
extern int BarsForFract = 0;
int gi_100 = 0;
double gd_104 = 0.0;
int gi_112 = -1;
int gi_116 = -1;
int gi_120 = 0;
double g_price_124 = 0.0;
double g_price_132 = 0.0;
double g_price_140 = 0.0;
int gi_148 = 0;
int gi_152 = 300;
int gi_156 = 0;
int gi_160 = 0;
double gd_164 = 0.0;
int g_time_172;
int g_time_176;
string g_name_180;
string g_name_188;
string g_name_196;
string gs_204;

int init() {
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 164);
   SetIndexBuffer(0, g_ibuf_76);
   SetIndexEmptyValue(0, 0.0);
   SetIndexBuffer(1, g_ibuf_80);
   SetIndexBuffer(2, g_ibuf_84);
   switch (Period()) {
   case PERIOD_M1:
      gs_204 = "M1";
      break;
   case PERIOD_M5:
      gs_204 = "M5";
      break;
   case PERIOD_M30:
      gs_204 = "M30";
      break;
   case PERIOD_H1:
      gs_204 = "H1";
      break;
   case PERIOD_H4:
      gs_204 = "H4";
      break;
   case PERIOD_D1:
      gs_204 = "D1";
      break;
   case PERIOD_W1:
      gs_204 = "WK1";
      break;
   case PERIOD_MN1:
      gs_204 = "MN1";
      break;
   default:
      gs_204 = "UNKNOWN_TIMEFRAME";
   }
   g_name_180 = "TL1_" + gs_204;
   g_name_188 = "TL2_" + gs_204;
   g_name_196 = "MIDL_" + gs_204;
   return (0);
}

int deinit() {
   return (0);
}

void DelObj() {
   ObjectDelete(g_name_180);
   ObjectDelete(g_name_188);
   ObjectDelete(g_name_196);
}

int start() {
   int li_16 = Time[0] + 60 * Period() - TimeCurrent();
   double ld_0 = li_16 / 60.0;
   int li_20 = li_16 % 60;
   li_16 = (li_16 - li_16 % 60) / 60;
   string ls_8 = li_16 + " minutes " + li_20 + " seconds left to bar end";
   ObjectDelete("time");
   if (ObjectFind("time") != 0) {
//      ObjectCreate("time", OBJ_TEXT, 0, Time[0], Close[0] + 0.0005);
//      ObjectSetText("time", "                                 <--" + li_16 + ":" + li_20, 13, "Verdana", Yellow);
   } else ObjectMove("time", 0, Time[0], Close[0] + 0.0005);
   int l_ind_counted_28 = IndicatorCounted();
   if (AllBars == 0 || Bars < AllBars) gi_152 = Bars;
   else gi_152 = AllBars;
   if (BarsForFract > 0) gi_156 = BarsForFract;
   else {
      switch (Period()) {
      case PERIOD_M1:
         gi_156 = 12;
         break;
      case PERIOD_M5:
         gi_156 = 48;
         break;
      case PERIOD_M15:
         gi_156 = 24;
         break;
      case PERIOD_M30:
         gi_156 = 24;
         break;
      case PERIOD_H1:
         gi_156 = 12;
         break;
      case PERIOD_H4:
         gi_156 = 15;
         break;
      case PERIOD_D1:
         gi_156 = 10;
         break;
      case PERIOD_W1:
         gi_156 = 6;
         break;
      default:
         DelObj();
         return (-1);
      }
   }
   gi_100 = 2;
   gi_112 = -1;
   gi_116 = -1;
   gi_120 = 0;
   while (gi_112 == -1 || gi_116 == -1 && gi_100 < gi_152) {
      if (gi_120 < 1 && gi_100 == iLowest(Symbol(), Period(), MODE_LOW, gi_156 * 2 + 1, gi_100 - gi_156)) {
         if (gi_120 == 0) {
            gi_120 = -1;
            gi_112 = gi_100;
            g_price_124 = Low[gi_112];
         } else {
            gi_116 = gi_100;
            g_price_132 = Low[gi_116];
         }
      }
      if (gi_120 > -1 && gi_100 == iHighest(Symbol(), Period(), MODE_HIGH, gi_156 * 2 + 1, gi_100 - gi_156)) {
         if (gi_120 == 0) {
            gi_120 = 1;
            gi_112 = gi_100;
            g_price_124 = High[gi_112];
         } else {
            gi_116 = gi_100;
            g_price_132 = High[gi_116];
         }
      }
      gi_100++;
   }
   if (gi_112 == -1 || gi_116 == -1) {
      DelObj();
      return (-1);
   }
   gd_104 = (g_price_132 - g_price_124) / (gi_116 - gi_112);
   g_price_124 -= gi_112 * gd_104;
   gi_112 = 0;
   gi_160 = 0;
   gd_164 = 0;
   if (gi_120 == 1) {
      g_price_140 = Low[2] - 2.0 * gd_104;
      for (gi_148 = 3; gi_148 <= gi_116; gi_148++)
         if (Low[gi_148] < g_price_140 + gd_104 * gi_148) g_price_140 = Low[gi_148] - gi_148 * gd_104;
      if (Low[0] < g_price_140) {
         gi_160 = 0;
         gd_164 = g_price_140;
      }
      if (Low[1] < g_price_140 + gd_104) {
         gi_160 = 1;
         gd_164 = g_price_140 + gd_104;
      }
      if (High[0] > g_price_124) {
         gi_160 = 0;
         gd_164 = g_price_124;
      }
      if (High[1] > g_price_124 + gd_104) {
         gi_160 = 1;
         gd_164 = g_price_124 + gd_104;
      }
   } else {
      g_price_140 = High[2] - 2.0 * gd_104;
      for (gi_148 = 3; gi_148 <= gi_116; gi_148++)
         if (High[gi_148] > g_price_140 + gd_104 * gi_148) g_price_140 = High[gi_148] - gi_148 * gd_104;
      if (Low[0] < g_price_124) {
         gi_160 = 0;
         gd_164 = g_price_124;
      }
      if (Low[1] < g_price_124 + gd_104) {
         gi_160 = 1;
         gd_164 = g_price_124 + gd_104;
      }
      if (High[0] > g_price_140) {
         gi_160 = 0;
         gd_164 = g_price_140;
      }
      if (High[1] > g_price_140 + gd_104) {
         gi_160 = 1;
         gd_164 = g_price_140 + gd_104;
      }
   }
   g_price_132 = g_price_124 + gi_152 * gd_104;
   g_time_172 = Time[gi_112];
   g_time_176 = Time[gi_152];
   if (gd_164 != 0.0) g_ibuf_76[gi_160] = gd_164;
   DelObj();
   ObjectCreate(g_name_180, OBJ_TREND, 0, g_time_176, g_price_140 + gd_104 * gi_152, g_time_172, g_price_140);
   ObjectSet(g_name_180, OBJPROP_COLOR, LineColor);
   ObjectSet(g_name_180, OBJPROP_WIDTH, 1);
   ObjectSet(g_name_180, OBJPROP_STYLE, STYLE_SOLID);
   ObjectCreate(g_name_188, OBJ_TREND, 0, g_time_176, g_price_132, g_time_172, g_price_124);
   ObjectSet(g_name_188, OBJPROP_COLOR, LineColor);
   ObjectSet(g_name_188, OBJPROP_WIDTH, 1);
   ObjectSet(g_name_188, OBJPROP_STYLE, STYLE_SOLID);
   ObjectCreate(g_name_196, OBJ_TREND, 0, g_time_176, (g_price_132 + g_price_140 + gd_104 * gi_152) / 2.0, g_time_172, (g_price_124 + g_price_140) / 2.0);
   ObjectSet(g_name_196, OBJPROP_COLOR, LineColor);
   ObjectSet(g_name_196, OBJPROP_WIDTH, 1);
   ObjectSet(g_name_196, OBJPROP_STYLE, STYLE_DOT);
//   Comment("\nChannel size = ", DoubleToStr(MathAbs(g_price_140 - g_price_124) / Point, 0), " Slope = ", DoubleToStr((-gd_104) / Point, 2) 
//   + "\nSpread @ " + DoubleToStr(MarketInfo(Symbol(), MODE_SPREAD), 0) + CreateHL());
   g_ibuf_80[0] = NormalizeDouble(MathAbs(g_price_140 - g_price_124) / Point, 0);
   g_ibuf_84[0] = NormalizeDouble((-gd_104) / Point, 2);
   return (0);
}

string CreateHL() {
   string l_dbl2str_464;
   double l_ihigh_0 = iHigh(NULL, PERIOD_D1, 0);
   double l_ilow_8 = iLow(NULL, PERIOD_D1, 0);
   double l_ihigh_16 = iHigh(NULL, PERIOD_D1, 1);
   double l_ilow_24 = iLow(NULL, PERIOD_D1, 1);
   double l_ihigh_32 = iHigh(NULL, PERIOD_D1, 0);
   double l_ilow_40 = iLow(NULL, PERIOD_D1, 0);
   double l_ihigh_48 = iHigh(NULL, PERIOD_D1, 2);
   double l_ilow_56 = iLow(NULL, PERIOD_D1, 2);
   double l_ihigh_64 = iHigh(NULL, PERIOD_D1, 3);
   double l_ilow_72 = iLow(NULL, PERIOD_D1, 3);
   double l_ihigh_80 = iHigh(NULL, PERIOD_D1, 4);
   double l_ilow_88 = iLow(NULL, PERIOD_D1, 4);
   double l_ihigh_96 = iHigh(NULL, PERIOD_D1, 5);
   double l_ilow_104 = iLow(NULL, PERIOD_D1, 5);
   double l_ihigh_112 = iHigh(NULL, PERIOD_D1, 6);
   double l_ilow_120 = iLow(NULL, PERIOD_D1, 6);
   double l_ihigh_128 = iHigh(NULL, PERIOD_D1, 7);
   double l_ilow_136 = iLow(NULL, PERIOD_D1, 7);
   double l_ihigh_144 = iHigh(NULL, PERIOD_D1, 8);
   double l_ilow_152 = iLow(NULL, PERIOD_D1, 8);
   double l_ihigh_160 = iHigh(NULL, PERIOD_D1, 9);
   double l_ilow_168 = iLow(NULL, PERIOD_D1, 9);
   double l_ihigh_176 = iHigh(NULL, PERIOD_D1, 10);
   double l_ilow_184 = iLow(NULL, PERIOD_D1, 10);
   double l_ihigh_192 = iHigh(NULL, PERIOD_D1, 11);
   double l_ilow_200 = iLow(NULL, PERIOD_D1, 11);
   double l_ihigh_208 = iHigh(NULL, PERIOD_D1, 12);
   double l_ilow_216 = iLow(NULL, PERIOD_D1, 12);
   double l_ihigh_224 = iHigh(NULL, PERIOD_D1, 13);
   double l_ilow_232 = iLow(NULL, PERIOD_D1, 13);
   double l_ihigh_240 = iHigh(NULL, PERIOD_D1, 14);
   double l_ilow_248 = iLow(NULL, PERIOD_D1, 14);
   double l_ihigh_256 = iHigh(NULL, PERIOD_D1, 15);
   double l_ilow_264 = iLow(NULL, PERIOD_D1, 15);
   double l_ihigh_272 = iHigh(NULL, PERIOD_D1, 16);
   double l_ilow_280 = iLow(NULL, PERIOD_D1, 16);
   double l_ihigh_288 = iHigh(NULL, PERIOD_D1, 17);
   double l_ilow_296 = iLow(NULL, PERIOD_D1, 17);
   double l_ihigh_304 = iHigh(NULL, PERIOD_D1, 18);
   double l_ilow_312 = iLow(NULL, PERIOD_D1, 18);
   double l_ihigh_320 = iHigh(NULL, PERIOD_D1, 19);
   double l_ilow_328 = iLow(NULL, PERIOD_D1, 19);
   double l_ihigh_336 = iHigh(NULL, PERIOD_D1, 20);
   double l_ilow_344 = iLow(NULL, PERIOD_D1, 20);
   double l_iopen_352 = iOpen(NULL, PERIOD_D1, 0);
   double l_iclose_360 = iClose(NULL, PERIOD_D1, 0);
   double ld_368 = (l_ihigh_16 - l_ilow_24) / 2.0;
   double ld_376 = (l_ihigh_16 - l_ilow_24 + (l_ihigh_48 - l_ilow_56) + (l_ihigh_64 - l_ilow_72) + (l_ihigh_80 - l_ilow_88) + (l_ihigh_96 - l_ilow_104)) / 10.0;
   double ld_384 = (l_ihigh_16 - l_ilow_24 + (l_ihigh_48 - l_ilow_56) + (l_ihigh_64 - l_ilow_72) + (l_ihigh_80 - l_ilow_88) + (l_ihigh_96 - l_ilow_104) + (l_ihigh_112 - l_ilow_120) +
      (l_ihigh_128 - l_ilow_136) + (l_ihigh_144 - l_ilow_152) + (l_ihigh_160 - l_ilow_168) + (l_ihigh_176 - l_ilow_184)) / 20.0;
   double ld_392 = (l_ihigh_16 - l_ilow_24 + (l_ihigh_48 - l_ilow_56) + (l_ihigh_64 - l_ilow_72) + (l_ihigh_80 - l_ilow_88) + (l_ihigh_96 - l_ilow_104) + (l_ihigh_112 - l_ilow_120) +
      (l_ihigh_128 - l_ilow_136) + (l_ihigh_144 - l_ilow_152) + (l_ihigh_160 - l_ilow_168) + (l_ihigh_176 - l_ilow_184) + (l_ihigh_192 - l_ilow_200) + (l_ihigh_208 - l_ilow_216) + (l_ihigh_224 - l_ilow_232) + (l_ihigh_240 - l_ilow_248) + (l_ihigh_256 - l_ilow_264) + (l_ihigh_272 - l_ilow_280) + (l_ihigh_288 - l_ilow_296) + (l_ihigh_304 - l_ilow_312) + (l_ihigh_320 - l_ilow_328) + (l_ihigh_336 - l_ilow_344)) / 40.0;
   double ld_400 = (ld_376 + ld_384 + ld_392) / 3.0;
   double ld_408 = (ld_376 + ld_384 + ld_392) / 3.0 * MathPow(10, Digits);
   double ld_416 = iHigh(NULL, PERIOD_D1, 0) - ld_400;
   double ld_424 = iLow(NULL, PERIOD_D1, 0) + ld_400;
   double l_ihigh_432 = iHigh(NULL, PERIOD_D1, 0);
   double l_ilow_440 = iLow(NULL, PERIOD_D1, 0);
   double ld_448 = iHigh(NULL, PERIOD_D1, 0) - 2.0 * ld_400;
   double ld_456 = iLow(NULL, PERIOD_D1, 0) + 2.0 * ld_400;
   if (Bid >= l_iopen_352) l_dbl2str_464 = DoubleToStr((Bid - l_iopen_352) / Point, 0);
   else l_dbl2str_464 = DoubleToStr((-(l_iopen_352 - Bid)) / Point, 0);
   string ls_ret_472 = "\nTODAYS RANGE: " + DoubleToStr((l_ihigh_0 - l_ilow_8) / Point, 0) 
      + "\n" 
      + "AVG. Daily Average: " + DoubleToStr(ld_408, 0) 
      + "\n" 
      + "Open: " + DoubleToStr(l_iopen_352, Digits) 
      + "\n" 
      + "Today\'s Hi: " + DoubleToStr(l_ihigh_0, Digits) + "  Low: " + DoubleToStr(l_ilow_8, Digits) 
      + "\n" 
      + "Pips from Open: " + l_dbl2str_464 
      + "\n" 
      + "Top Daily Range: " + DoubleToStr(ld_456, Digits) 
      + "\n" 
      + "Bottom Daily Range: " + DoubleToStr(ld_448, Digits) 
   + "\n";
   return (ls_ret_472);
}
