
#property indicator_chart_window

extern bool DrawLineMaxVolume = TRUE;
extern bool AlertMaxVolume = TRUE;
extern bool UseStartTime = TRUE;
extern string StartTime = "00:00";
extern int HistoryDepth = 5000;
extern color UpColor = Lime;
extern color DwColor = Red;
extern bool UseNumbOfDays = TRUE;
extern int numb_of_days = 2;
extern bool UseOpenDayLine = TRUE;
extern bool MaxVolumeCurrentWeek = TRUE;
extern bool MaxVolumeLastWeek = TRUE;
extern bool MaxVolumeCurrentMonth = TRUE;
extern bool MaxVolumeLastMonth = TRUE;
extern bool DrawValueMaxVolume = TRUE;
extern bool DrawLineCurrentMaxVolume = TRUE;
double Gd_144;
bool Gi_152;
int Gi_156;
int Gi_160;

int init() {
   if (Digits == 5 || Digits == 3) Gd_144 = 10.0 * Point;
   else Gd_144 = Point;
   Gi_152 = TRUE;
   if (!f0_8()) return (0);
   f0_1();
   int Li_0 = HistoryDepth;
   if (UseNumbOfDays) Li_0 = iBarShift(NULL, 0, iTime(NULL, PERIOD_D1, numb_of_days - 1));
   f0_5(Li_0);
   return (0);
}

int deinit() {
   f0_1();
   return (0);
}

int start() {
   if (!Gi_152) return (0);
   Gi_156 = iTime(NULL, 0, 0);
   if (Gi_156 == Gi_160) return (0);
   Gi_160 = Gi_156;
   f0_5();
   return (0);
}

void f0_5(int Ai_0 = 1) {
   double Ld_4;
   double Ld_12;
   double Ld_20;
   double Ld_28;
   double Ld_36;
   double Ld_44;
   double Ld_52;
   int Li_60;
   int Li_72;
   int Li_80;
   int Li_84;
   int Li_88;
   int Li_92;
   int Li_96;
   int Li_100;
   int Li_104;
   int Li_108;
   int Li_112;
   int Li_120;
   int Li_124;
   int Li_128;
   if (UseOpenDayLine) {
      f0_9(iOpen(NULL, PERIOD_D1, 0), Goldenrod, STYLE_SOLID);
      f0_3("Open_Day", iTime(NULL, 0, 0), iOpen(NULL, PERIOD_D1, 0), Goldenrod, "Open_Day");
   }
   if (MaxVolumeCurrentWeek) {
      Li_120 = 1;
      Li_124 = iBarShift(NULL, 0, iTime(NULL, PERIOD_W1, 0));
      Li_128 = 0;
      for (int Li_68 = Li_120; Li_68 <= Li_124; Li_68++)
         if (iVolume(NULL, 0, Li_68) > iVolume(NULL, 0, Li_128)) Li_128 = Li_68;
      if (iClose(NULL, 0, Li_128) >= iOpen(NULL, 0, Li_128)) {
         f0_4("Volume_текущей недели", iTime(NULL, 0, Li_128), iHigh(NULL, 0, Li_128), Yellow, 2);
         f0_9(iHigh(NULL, 0, Li_128), Yellow, STYLE_SOLID);
         f0_3("Volume_текущей недели", iTime(NULL, 0, 0), iHigh(NULL, 0, Li_128), White, "Volume_текущей недели");
      } else {
         f0_4("Volume_текущей недели", iTime(NULL, 0, Li_128), iLow(NULL, 0, Li_128), Yellow, 2);
         f0_9(iLow(NULL, 0, Li_128), Yellow, STYLE_SOLID);
         f0_3("Volume_текущей недели", iTime(NULL, 0, 0), iLow(NULL, 0, Li_128), White, "Volume_текущей недели");
      }
      if (AlertMaxVolume && Li_128 == 1) Alert("Превышен максимальный внутринедельный объём!");
   }
   if (MaxVolumeLastWeek) {
      Li_120 = iBarShift(NULL, 0, iTime(NULL, PERIOD_W1, 0)) + 1;
      Li_124 = iBarShift(NULL, 0, iTime(NULL, PERIOD_W1, 1));
      Li_128 = 0;
      for (Li_68 = Li_120; Li_68 <= Li_124; Li_68++)
         if (iVolume(NULL, 0, Li_68) > iVolume(NULL, 0, Li_128)) Li_128 = Li_68;
      if (iClose(NULL, 0, Li_128) >= iOpen(NULL, 0, Li_128)) {
         f0_4("Volume_прошлой недели", iTime(NULL, 0, Li_128), iHigh(NULL, 0, Li_128), DodgerBlue, 2);
         f0_9(iHigh(NULL, 0, Li_128), DodgerBlue, STYLE_SOLID);
         f0_3("Volume_прошлой недели", iTime(NULL, 0, 0), iHigh(NULL, 0, Li_128), White, "Volume_прошлой недели");
      } else {
         f0_4("Volume_прошлой недели", iTime(NULL, 0, Li_128), iLow(NULL, 0, Li_128), DodgerBlue, 2);
         f0_9(iLow(NULL, 0, Li_128), DodgerBlue, STYLE_SOLID);
         f0_3("Volume_прошлой недели", iTime(NULL, 0, 0), iLow(NULL, 0, Li_128), White, "Volume_прошлой недели");
      }
   }
   if (MaxVolumeCurrentMonth) {
      Li_120 = 1;
      Li_124 = iBarShift(NULL, 0, iTime(NULL, PERIOD_MN1, 0));
      Li_128 = 0;
      for (Li_68 = Li_120; Li_68 <= Li_124; Li_68++)
         if (iVolume(NULL, 0, Li_68) > iVolume(NULL, 0, Li_128)) Li_128 = Li_68;
      if (iClose(NULL, 0, Li_128) >= iOpen(NULL, 0, Li_128)) {
         f0_4("Volume_текущего месяца", iTime(NULL, 0, Li_128), iHigh(NULL, 0, Li_128), MediumVioletRed, 3);
         f0_9(iHigh(NULL, 0, Li_128), MediumVioletRed, STYLE_SOLID);
         f0_3("Volume_текущего месяца", iTime(NULL, 0, 0), iHigh(NULL, 0, Li_128), White, "Volume_текущего месяца");
      } else {
         f0_4("Volume_текущего месяца", iTime(NULL, 0, Li_128), iLow(NULL, 0, Li_128), MediumVioletRed, 3);
         f0_9(iLow(NULL, 0, Li_128), MediumVioletRed, STYLE_SOLID);
         f0_3("Volume_текущего месяца", iTime(NULL, 0, 0), iLow(NULL, 0, Li_128), White, "Volume_текущего месяца");
      }
      if (AlertMaxVolume && Li_128 == 1) Alert("Превышен максимальный внутринедельный объём!");
   }
   if (MaxVolumeLastMonth) {
      Li_120 = iBarShift(NULL, 0, iTime(NULL, PERIOD_MN1, 0)) + 1;
      Li_124 = iBarShift(NULL, 0, iTime(NULL, PERIOD_MN1, 1));
      Li_128 = 0;
      for (Li_68 = Li_120; Li_68 <= Li_124; Li_68++)
         if (iVolume(NULL, 0, Li_68) > iVolume(NULL, 0, Li_128)) Li_128 = Li_68;
      if (iClose(NULL, 0, Li_128) >= iOpen(NULL, 0, Li_128)) {
         f0_4("last_month", iTime(NULL, 0, Li_128), iHigh(NULL, 0, Li_128), RosyBrown, 3);
         f0_9(iHigh(NULL, 0, Li_128), RosyBrown, STYLE_SOLID);
         f0_3("last_month", iTime(NULL, 0, 0), iHigh(NULL, 0, Li_128), White, "Volume_прошлого месяца");
      } else {
         f0_4("last_month", iTime(NULL, 0, Li_128), iLow(NULL, 0, Li_128), RosyBrown, 3);
         f0_9(iLow(NULL, 0, Li_128), RosyBrown, STYLE_SOLID);
         f0_3("last_month", iTime(NULL, 0, 0), iLow(NULL, 0, Li_128), White, "Last Month");
      }
   }
   int Li_116 = Period();
   if (UseStartTime && Li_116 < PERIOD_D1) {
      Li_80 = iTime(NULL, 0, 1);
      Li_84 = iTime(NULL, 0, 2);
      Li_88 = StrToTime(TimeYear(Li_80) + "." + TimeMonth(Li_80) + "." + TimeDay(Li_80) + " " + StartTime);
      if (Li_80 < Li_88) Li_88 -= 86400;
      else {
         if (Li_84 < Li_88 && Li_80 >= Li_88) {
            if (Li_80 > Li_88) Li_80 = Li_84;
            f0_1();
            f0_0(Li_80);
         }
      }
   }
   for (Li_68 = 1; Li_68 <= Ai_0; Li_68++) {
      Li_72 = iVolume(NULL, 0, Li_68);
      Li_80 = iTime(NULL, 0, Li_68);
      Ld_4 = iClose(NULL, 0, Li_68);
      Ld_12 = iOpen(NULL, 0, Li_68);
      Ld_20 = iHigh(NULL, 0, Li_68);
      Ld_28 = iLow(NULL, 0, Li_68);
      if (UseStartTime && Li_116 < PERIOD_D1) {
         if (Li_80 < Li_88) {
            Li_112 = iBarShift(NULL, 0, Li_88, TRUE);
            if (Li_112 == -1) break;
            f0_0(iTime(NULL, 0, Li_112));
            break;
         }
      }
      if (Li_116 < PERIOD_D1) {
         Li_96 = iBarShift(NULL, PERIOD_D1, Li_80, TRUE);
         if (Li_96 != -1) {
            Li_92 = iTime(NULL, PERIOD_D1, Li_96);
            if (Li_92 != Li_80) {
               Li_100 = iBarShift(NULL, 0, Li_92, TRUE);
               if (Li_100 != -1) {
                  Li_104 = iHighest(NULL, 0, MODE_VOLUME, Li_100 - Li_68 + 1, Li_68);
                  if (Li_108 == 0) Li_108 = Li_104;
                  if (Li_68 == Li_104) {
                     if (Ld_4 >= Ld_12) {
                        Ld_44 = Ld_20;
                        Ld_52 = Ld_44 + 2.0 * Ld_36;
                        Li_60 = UpColor;
                     } else {
                        Ld_44 = Ld_28;
                        Ld_52 = Ld_44 - Ld_36;
                        Li_60 = DwColor;
                     }
                     if (DrawValueMaxVolume) f0_6("v", Li_80, Ld_52, Li_60, DoubleToStr(iVolume(NULL, 0, Li_104), 0));
                     f0_4("v", Li_80, Ld_44, Li_60);
                     if (DrawLineMaxVolume) f0_9(Ld_44, Li_60, STYLE_SOLID);
                     if (AlertMaxVolume && Li_68 == 1) Alert("MAX VOLUME Превышен!");
                  }
               }
            }
         }
      }
   }
   if (DrawLineCurrentMaxVolume) {
      f0_2();
      if (iClose(NULL, 0, Li_104) >= iOpen(NULL, 0, Li_104)) Ld_44 = iHigh(NULL, 0, Li_104);
      else Ld_44 = iLow(NULL, 0, Li_104);
      f0_7("BIG_Vol_Line", iTime(NULL, 0, Li_104) + 600 * Period(), Ld_44, iTime(NULL, 0, Li_104) - 600 * Period(), Ld_44, Seashell, STYLE_SOLID, 2);
      f0_6("BIG_Vol_Line", iTime(NULL, 0, Li_104) + 300 * Period(), Ld_44, Lime, "BIG_Vol_Line");
   }
   WindowRedraw();
}

bool f0_8() {
   //if (AccountNumber() != 9472233) {
      if (TimeCurrent() >= StrToTime("2020.12.10 00:00")) {
         Alert("Истёк демонстрационный период использования индикатора!");
         Gi_152 = FALSE;
         return (FALSE);
      }
 //  }
   
   Comment("Подождите, идет обновление данных таймфреймов...");
   for (int Li_0 = 0; Li_0 < 120; Li_0++) {
      iTime(NULL, PERIOD_D1, 0);
      iTime(NULL, 0, 0);
      if (MaxVolumeCurrentWeek || MaxVolumeCurrentWeek) iTime(NULL, PERIOD_W1, 0);
      if (MaxVolumeCurrentMonth || MaxVolumeCurrentMonth) iTime(NULL, PERIOD_MN1, 0);
      if (GetLastError() != 4066/* HISTORY_WILL_UPDATED */) break;
      Sleep(1000);
   }
   if (Li_0 == 120) Comment("Обновление данных завершилось с ошибкой. Переход к следующей попытке.");
   Comment("");
   return (TRUE);
}

void f0_4(string As_0, int Ai_8, double Ad_12, color Ai_20, int Ai_24 = 1) {
   string Ls_28 = "Arrow_" + As_0 + "_" + TimeToStr(Ai_8);
   ObjectDelete(Ls_28);
   ObjectCreate(Ls_28, OBJ_ARROW, 0, Ai_8, Ad_12, 0, 0, 0, 0);
   ObjectSet(Ls_28, OBJPROP_ARROWCODE, 159);
   ObjectSet(Ls_28, OBJPROP_COLOR, Ai_20);
   ObjectSet(Ls_28, OBJPROP_WIDTH, Ai_24);
   ObjectSetText(Ls_28, "Точка", 8, "Arial", Ai_20);
}

void f0_9(double Ad_0, color Ai_8, int Ai_12) {
   string Ls_16 = "LineH" + "_" + DoubleToStr(Ad_0, Digits);
   ObjectDelete(Ls_16);
   ObjectCreate(Ls_16, OBJ_HLINE, 0, 0, Ad_0, 0, 0, 0, 0);
   ObjectSet(Ls_16, OBJPROP_COLOR, Ai_8);
   ObjectSet(Ls_16, OBJPROP_STYLE, Ai_12);
   ObjectSetText(Ls_16, "Линия", 8, "Arial", Ai_8);
}

void f0_0(int Ai_0, color Ai_4 = 255, int Ai_8 = 0) {
   string Ls_12 = "LineV" + "_" + TimeToStr(Ai_0);
   ObjectDelete(Ls_12);
   ObjectCreate(Ls_12, OBJ_VLINE, 0, Ai_0, 0, 0, 0, 0, 0);
   ObjectSet(Ls_12, OBJPROP_COLOR, Ai_4);
   ObjectSet(Ls_12, OBJPROP_STYLE, Ai_8);
   ObjectSetText(Ls_12, "Линия", 8, "Arial", Ai_4);
}

void f0_7(string As_0, int Ai_8, double Ad_12, int Ai_20, double Ad_24, color Ai_32, int Ai_36 = 0, int Ai_40 = 0) {
   if (ObjectFind(As_0) == -1) {
      ObjectCreate(As_0, OBJ_TREND, 0, 0, 0, 0, 0);
      ObjectSet(As_0, OBJPROP_RAY, FALSE);
   }
   ObjectSet(As_0, OBJPROP_TIME1, Ai_8);
   ObjectSet(As_0, OBJPROP_TIME2, Ai_20);
   ObjectSet(As_0, OBJPROP_PRICE1, Ad_12);
   ObjectSet(As_0, OBJPROP_PRICE2, Ad_24);
   ObjectSet(As_0, OBJPROP_COLOR, Ai_32);
   ObjectSet(As_0, OBJPROP_STYLE, Ai_36);
   ObjectSet(As_0, OBJPROP_WIDTH, Ai_40);
}

void f0_6(string As_0, int Ai_8, double Ad_12, color Ai_20, string As_24) {
   string Ls_32 = "Digit_" + As_0 + "_" + TimeToStr(Ai_8);
   ObjectDelete(Ls_32);
   ObjectCreate(Ls_32, OBJ_TEXT, 0, Ai_8, Ad_12, 0, 0, 0, 0);
   ObjectSetText(Ls_32, As_24, 8, "Arial", Ai_20);
}

void f0_3(string As_0, int Ai_8, double Ad_12, color Ai_20, string As_24) {
   string Ls_32 = "Digit_" + As_0;
   ObjectDelete(Ls_32);
   ObjectCreate(Ls_32, OBJ_TEXT, 0, Ai_8, Ad_12, 0, 0, 0, 0);
   ObjectSetText(Ls_32, As_24, 8, "Arial", Ai_20);
}

void f0_1() {
   string Ls_0;
   for (int Li_8 = ObjectsTotal() - 1; Li_8 >= 0; Li_8--) {
      Ls_0 = ObjectName(Li_8);
      if (StringSubstr(Ls_0, 0, 5) == "Digit") ObjectDelete(Ls_0);
      else {
         if (StringSubstr(Ls_0, 0, 5) == "Arrow") ObjectDelete(Ls_0);
         else {
            if (StringSubstr(Ls_0, 0, 5) == "LineH") ObjectDelete(Ls_0);
            else {
               if (StringSubstr(Ls_0, 0, 5) == "LineV") ObjectDelete(Ls_0);
               else
                  if (StringSubstr(Ls_0, 0, 10) == "max_volume") ObjectDelete(Ls_0);
            }
         }
      }
   }
}

void f0_2() {
   string Ls_0;
   for (int Li_8 = ObjectsTotal() - 1; Li_8 >= 0; Li_8--) {
      Ls_0 = ObjectName(Li_8);
      if (StringSubstr(Ls_0, 0, 9) == "Digit_max") ObjectDelete(Ls_0);
   }
}