#property indicator_chart_window

extern int  CountDays=2;
extern bool Show_LABELS = true; 

extern bool Show_CurrDaily = true;
extern int Shift_CurrDaily_LABEL = 0;
extern bool Show_CurrWeekly = true;
extern int Shift_CurrWeekly_LABEL = 0;
extern bool Show_CurrMonthly = true;
extern int Shift_CurrMonthly_LABEL = 0;
extern color line_color_CurrDailyUPPER = Lime;
extern color line_color_CurrDailyLOWER = Magenta;
extern color line_color_CurrWeeklyUPPER = YellowGreen;
extern color line_color_CurrWeeklyLOWER = Pink;
extern color line_color_CurrMonthlyUPPER = Green;
extern color line_color_CurrMonthyLOWER = Red;
extern int CurrDaily_LineStyle = 2;
extern int CurrWeekly_LineStyle = 3;
extern int CurrMonthly_LineStyle = 4;


extern bool Show_PreviousDaily = true;
extern bool Xtend_Prev_DailyLine = false;
extern bool Show_PreviousWeekly = true;
extern bool Xtend_Prev_WeeklyLine = false;
extern bool Show_PreviousMonthly = true;
extern bool Xtend_Prev_MonthlyLine = false;
extern color line_color_PreviousDaily = DodgerBlue;
extern color line_color_PreviousWeekly = MidnightBlue;
extern color line_color_PreviousMonthly = Orange;
extern int PreviousLine_Style = 2;
extern int Shift_Prev_LABEL = 10;

extern bool Show_CurrRectangles_Display = false;
extern bool Show_Rectangles = true;
extern bool Rectangle_Curr_DayPeriod_only = false;
extern bool Show_Daily_Rectangle = true;
extern color Daily_Rectangle_color = Navy;
extern bool Show_Weekly_Rectangle = true;
extern color Weekly_Rectangle_color = Blue;
extern bool Show_Monthly_Rectangle = true;
extern color Monthly_Rectangle_color = Maroon;

extern bool Show_Daily_Pivots = false;
extern color Daily_Pivot_color = Aqua;
extern int Daily_Pivot_LineWidth = 1;  
extern bool Show_Weekly_Pivots = false;
extern color Weekly_Pivot_color = Yellow;
extern int Weekly_Pivot_LineWidth = 1; 
extern bool Show_Monthly_Pivots = false;
extern color Monthly_Pivot_color = Orange;
extern int Monthly_Pivot_LineWidth = 1;
extern int ShiftPivot_LABELS = 10; 

#define NAME "iHL "
#define Curr_DG "Curr_DG"
#define Curr_WG "Curr_WG"
#define Curr_MG "Curr_MG"

datetime time1, time2, time3, time4, time5, time6, time7, time8, time9, time10, time11, time12, time13, time14, time15, time16, time17, time18;
double DHi,DLo,WHi,WLo,MHi,MLo, DHigh,DLow,WHigh,WLow,MHigh,MLow, highD,lowD,closeD,highW,lowW,closeW,highM,lowM,closeM, PD,PW,PM;
int shift, num;

int init()  {   IndicatorShortName("MTF_HI_LOW");     return(0);}

int deinit(){   Object_Delete_ByPrefix(NAME);         return(0);}

//*******************************************************************************************
int start()
{
   CreateMHI();
}

void CreateMHI()
{
   Object_Delete_ByPrefix(NAME);
   
   //CurrDaily levels
   DHigh = iHigh(NULL,PERIOD_D1,0);
   DLow  = iLow (NULL,PERIOD_D1,0);
   WHigh = iHigh(NULL,PERIOD_W1,0);
   WLow  = iLow (NULL,PERIOD_W1,0);
   MHigh = iHigh(NULL,PERIOD_MN1,0);
   MLow  = iLow (NULL,PERIOD_MN1,0);
   
   if (Show_CurrRectangles_Display )
   { 
      if ( Show_Daily_Rectangle   )    f_RECTANGLE(Curr_DG, iTime(NULL,PERIOD_D1,0), DHigh, Time[0], DLow, 2,2,Daily_Rectangle_color);
      if ( Rectangle_Curr_DayPeriod_only )
      {
         if ( Show_Weekly_Rectangle  ) f_RECTANGLE(Curr_WG, iTime(NULL,PERIOD_D1,0), WHigh, Time[0], WLow, 2,2,Weekly_Rectangle_color);
         if ( Show_Monthly_Rectangle ) f_RECTANGLE(Curr_MG, iTime(NULL,PERIOD_D1,0), MHigh, Time[0], MLow ,2,2,Monthly_Rectangle_color);
      }
      else
      {
         if ( Show_Weekly_Rectangle  ) f_RECTANGLE(Curr_WG, iTime(NULL,PERIOD_W1,0), WHigh, Time[0], WLow ,2,2,Weekly_Rectangle_color);
         if ( Show_Monthly_Rectangle ) f_RECTANGLE(Curr_MG, iTime(NULL,PERIOD_MN1,0),MHigh, Time[0], MLow ,2,2,Monthly_Rectangle_color);
      }
   }
   
   //*******************************************************************************
   int i;
   num=0;
   
   for (shift=CountDays-1;shift>=0;shift--)
   {
      time1=iTime(NULL,PERIOD_D1,shift);
      time3=iTime(NULL,PERIOD_W1,shift);
      time5=iTime(NULL,PERIOD_MN1,shift);
      //**************************************************
      //CurrDaily levels
      time7=iTime(NULL,PERIOD_D1,0);
      time9=iTime(NULL,PERIOD_W1,0);
      time11=iTime(NULL,PERIOD_MN1,0);
      //**********************************************
      //Pivot
      time13=iTime(NULL,PERIOD_D1,shift);
      time15=iTime(NULL,PERIOD_W1,shift);
      time17=iTime(NULL,PERIOD_MN1,shift);
      
      
      i=shift-1;
      if (shift<1) 
      {
         time2=time4=time6=time14=time16=time18=Time[0];
         //CurrDaily levels
         time8 =iTime(NULL,PERIOD_D1,0)-Period()*60; 
         time10=iTime(NULL,PERIOD_W1,0)-Period()*60; 
         time12=iTime(NULL,PERIOD_MN1,0)-Period()*60; 
      }
      //*********************************************************
      
      highD  = iHigh (NULL,PERIOD_D1, shift+1);
      lowD   = iLow  (NULL,PERIOD_D1, shift+1);
      closeD = iClose(NULL,PERIOD_D1, shift+1);
      highW  = iHigh (NULL,PERIOD_W1, shift+1);
      lowW   = iLow  (NULL,PERIOD_W1, shift+1);
      closeW = iClose(NULL,PERIOD_W1, shift+1);
      highM  = iHigh (NULL,PERIOD_MN1,shift+1);
      lowM   = iLow  (NULL,PERIOD_MN1,shift+1);
      closeM = iClose(NULL,PERIOD_MN1,shift+1);
      
          
      PD    = (highD+lowD+closeD)/3.0;
      PW    = (highW+lowW+closeW)/3.0;
      PM    = (highM+lowM+closeM)/3.0;

      DHi   = iHigh(NULL,PERIOD_D1,shift+1);
      DLo   = iLow (NULL,PERIOD_D1,shift+1);
      WHi   = iHigh(NULL,PERIOD_W1,shift+1);
      WLo   = iLow (NULL,PERIOD_W1,shift+1);
      MHi   = iHigh(NULL,PERIOD_MN1,shift+1);
      MLo   = iLow (NULL,PERIOD_MN1,shift+1);
      //***************************
      
      time2=time1+PERIOD_D1*60;
      time4=time3+PERIOD_W1*60;
      time6=time5+PERIOD_MN1*60;
      //******************************************
      // CurrDaily levels
      time8=time7+PERIOD_D1*60;
      time10=time9+PERIOD_W1*60;
      time12=time11+PERIOD_MN1*60;
      //******************************************
      //Pivot
      time14=time13+PERIOD_D1*60;
      time16=time15+PERIOD_W1*60;
      time18=time17+PERIOD_MN1*60;
      
      num=shift;
      if ( Show_PreviousDaily )
      {
         f_Line("Previous_DailyHi["+num+"]", DHi, time1, time2, line_color_PreviousDaily, PreviousLine_Style, Xtend_Prev_DailyLine);
         f_Line("Previous_DailyLo["+num+"]", DLo, time1, time2, line_color_PreviousDaily, PreviousLine_Style, Xtend_Prev_DailyLine);
      }
      if ( Show_PreviousWeekly )
      {  
         f_Line("Previous_WeeklyHi["+num+"]", WHi, time3, time4, line_color_PreviousWeekly, PreviousLine_Style, Xtend_Prev_WeeklyLine);
         f_Line("Previous_WeeklyLo["+num+"]", WLo, time3, time4, line_color_PreviousWeekly, PreviousLine_Style, Xtend_Prev_WeeklyLine);
      }
      if ( Show_PreviousMonthly )
      {  
         f_Line("Previous_MonthlyHi["+num+"]", MHi, time5, time6, line_color_PreviousMonthly, PreviousLine_Style, Xtend_Prev_MonthlyLine);
         f_Line("Previous_MonthlyLo["+num+"]", MLo, time5, time6, line_color_PreviousMonthly, PreviousLine_Style, Xtend_Prev_MonthlyLine);
      }
      //***************************************************************************************************
      //CurrDaily levels
      if ( Show_CurrDaily )
      {    
         f_Line("CurrentDailyHi["+num+"]", DHigh, time7, time8, line_color_CurrDailyUPPER, CurrDaily_LineStyle, false);
         f_Line("CurrentDailyLo["+num+"]", DLow,  time7, time8, line_color_CurrDailyLOWER, CurrDaily_LineStyle, false);
      }
      if ( Show_CurrWeekly )
      { 
         f_Line("CurrentWeeklyHi["+num+"]", WHigh, time9, time10, line_color_CurrWeeklyUPPER, CurrWeekly_LineStyle, false);
         f_Line("CurrentWeeklyLo["+num+"]", WLow,  time9, time10, line_color_CurrWeeklyLOWER, CurrWeekly_LineStyle, false);
      }
      if ( Show_CurrMonthly )
      { 
         f_Line("CurrentMonthlyHi["+num+"]", MHigh, time9, time10, line_color_CurrMonthlyUPPER, CurrMonthly_LineStyle, false);
         f_Line("CurrentMonthlyLo["+num+"]", MLow,  time9, time10, line_color_CurrMonthyLOWER,  CurrMonthly_LineStyle, false);
      }
   }
   
  //*****************************************
   if (Show_Daily_Pivots == true)
         f_Line("CurrentPivot["+num+"]", PD, time13, time14, Daily_Pivot_color, 0, false, Daily_Pivot_LineWidth);
   if (Show_Weekly_Pivots == true)
         f_Line("CurrentWeeklylyPivot["+num+"]", PW, time15, time16, Weekly_Pivot_color, 0, false, Weekly_Pivot_LineWidth);
   if (Show_Monthly_Pivots == true)
         f_Line("CurrentMonthlyPivot["+num+"]", PM, time17, time18, Monthly_Pivot_color, 0, false, Monthly_Pivot_LineWidth);

   if (Show_LABELS == true)
   {
      f_Label(NAME+"HILO",  Time[Shift_CurrDaily_LABEL], DHigh, "Максимум Дня "+DoubleToStr(DHigh,Digits), line_color_CurrDailyUPPER);
      f_Label(NAME+"HILO1", Time[Shift_CurrDaily_LABEL], DLow,  "Минимум Дня "+DoubleToStr(DLow,Digits), line_color_CurrDailyLOWER);
      f_Label(NAME+"HILO2", Time[Shift_CurrWeekly_LABEL], WHigh, "Недельный Максимум "+DoubleToStr(WHigh,Digits), line_color_CurrWeeklyUPPER);
      f_Label(NAME+"HILO3", Time[Shift_CurrDaily_LABEL], WLow,  "Недельный Минимум "+DoubleToStr(WLow,Digits), line_color_CurrWeeklyLOWER);
      f_Label(NAME+"HILO4", Time[Shift_CurrMonthly_LABEL], MHigh, "Месячный Максимум "+DoubleToStr(MHigh,Digits), line_color_CurrMonthlyUPPER);
      f_Label(NAME+"HILO5", Time[Shift_CurrMonthly_LABEL], MLow,  "Месячный Минимум "+DoubleToStr(MLow,Digits), line_color_CurrMonthyLOWER);
  
      //Previous Levels
      f_Label(NAME+"HILOP",  Time[Shift_Prev_LABEL+10], DHi, "Пред. / Дневной Максимум "+DoubleToStr(DHi,Digits), line_color_PreviousDaily);
      f_Label(NAME+"HILO1P", Time[Shift_Prev_LABEL+10], DLo, "Пред. / Дневной Минимум "+DoubleToStr(DLo,Digits), line_color_PreviousDaily);
      f_Label(NAME+"HILO2P", Time[Shift_Prev_LABEL+10], WHi, "Пред. / Недельный Максимум "+DoubleToStr(WHi,Digits), line_color_PreviousWeekly);
      f_Label(NAME+"HILO3P", Time[Shift_Prev_LABEL+10], WLo, "Пред. / Недельный Минимум "+DoubleToStr(WLo,Digits), line_color_PreviousWeekly);
      f_Label(NAME+"HILO4P", Time[Shift_Prev_LABEL+10], MHi, "Пред. / Месячный Максимум "+DoubleToStr(MHi,Digits), line_color_PreviousMonthly);
      f_Label(NAME+"HILO5P", Time[Shift_Prev_LABEL+10], MLo, "Пред. / Месячный Минимум "+DoubleToStr(MLo,Digits), line_color_PreviousMonthly);

      if (Show_Daily_Pivots == true)   f_Label(NAME+"PIVOTD", Time[ShiftPivot_LABELS], PD,  "D / Pivot "+DoubleToStr(PD,Digits), Daily_Pivot_color);
      if (Show_Weekly_Pivots == true)  f_Label(NAME+"PIVOTW", Time[ShiftPivot_LABELS], PW,  "W / Pivot "+DoubleToStr(PW,Digits), Weekly_Pivot_color);
      if (Show_Monthly_Pivots == true) f_Label(NAME+"PIVOTM", Time[ShiftPivot_LABELS], PM,  "M / Pivot "+DoubleToStr(PM,Digits), Monthly_Pivot_color);
   }
    
}
//+------------------------------------------------------------------+

void  f_Label(string name, datetime time, double prc, string txt, color _color)
{
   if(ObjectFind(name) != 0){
      ObjectCreate(name, OBJ_TEXT, 0, time, prc);
      ObjectSetText(name, "                                   "+txt, 8, "Arial", _color);
   }else{   ObjectMove(name, 0, time, prc);}
}

void  f_Line(string name, double value, datetime timeSt, datetime timeEn, double _color, double style, bool isRAY, double _width = 1)
{
   string nm = NAME + name;
   ObjectCreate(nm, OBJ_TREND,0,timeSt,value,timeEn,value);
   ObjectSet(nm, OBJPROP_WIDTH, _width);
   ObjectSet(nm, OBJPROP_STYLE, style);
   ObjectSet(nm, OBJPROP_RAY, isRAY);
   ObjectSet(nm, OBJPROP_BACK, true);
   ObjectSet(nm, OBJPROP_COLOR, _color);
}

void  Object_Delete_ByPrefix(string sPrefix)
{
   int L = StringLen(sPrefix), i = 0;
   string ObjName;
   while(i < ObjectsTotal())
   {
      ObjName = ObjectName(i);
      if(StringSubstr(ObjName, 0, L) == sPrefix) { ObjectDelete(ObjName); i--; }
      i++; 
   }
}

void  f_RECTANGLE(string name, datetime timeS, double prcS, datetime timeE, double prcE, double _WIDTH, double _STYLE, color _COLOR)
{
   string nm = NAME + name;
   ObjectCreate(nm, OBJ_RECTANGLE, 0, timeS, prcS, timeE, prcE);
   ObjectSet(nm, OBJPROP_COLOR, _COLOR);
   ObjectSet(nm, OBJPROP_RAY, false);
   ObjectSet(nm, OBJPROP_BACK, Show_Rectangles);
   ObjectSet(nm, OBJPROP_WIDTH, _WIDTH);
   ObjectSet(nm, OBJPROP_STYLE, _STYLE);

}