//+------------------------------------------------------------------+
//|                                            i-ParamonWorkTime.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  23.11.2005  Индикатор рабочего времени Парамона.                |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_chart_window

//------- Внешние параметры индикатора -------------------------------
extern int    NumberOfDays = 20;        // Количество дней
extern string Begin_1      = "12:00";
extern string End_1        = "14:00";
extern color  Color_1      = DarkGreen;
extern color  Color_2      = Red;

extern bool ShowDay1 = true;
extern bool ShowDay2 = true;
extern bool ShowDay3 = true;
extern bool ShowDay4 = false;
extern bool ShowDay5 = false;

extern bool   HighRange    = False;
bool ShowDay[5];
string prefix = "jj";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  clear();
  
  ShowDay[0] = ShowDay1;
  ShowDay[1] = ShowDay2;
  ShowDay[2] = ShowDay3;
  ShowDay[3] = ShowDay4;
  ShowDay[4] = ShowDay5;
  Comment("");
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  clear();
  Comment("");
}



//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  datetime dt=CurTime();
  int P = Period();
  if (P > PERIOD_D1) return;
  
  string name = "";
  
  int cnt = MathMin(Bars, PERIOD_D1/P*NumberOfDays);
  for (int i=0; i <= cnt; i++) 
  {
    if (TimeDayOfWeek(Time[i]) != TimeDayOfWeek(Time[i+1]))
    {
      name = prefix + TimeToStr(Time[i]);
      
      int res = ObjectFind(name);
      if (res == -1) 
      {      
//        int day = TimeDayOfWeek(Time[i]);
        int day = TimeDayOfWeek(dt);
        if (ShowDay[day-1])
        {
      
          CreateObjects(name, Color_1);
          DrawObjects(dt, name, Begin_1, End_1);
        }
        else
        {
          CreateObjects(name, Color_2);
          DrawObjects(dt, name, Begin_1, End_1);
        }
      }
   
      dt=decDateTradeDay(dt);
      while (TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
    }
  }
}
//+------------------------------------------------------------------+
//| Создание объектов индикатора                                     |
//| Параметры:                                                       |
//|   no - наименование объекта                                      |
//|   cl - цвет объекта                                              |
//+------------------------------------------------------------------+

void CreateObjects(string no, color cl) {
  ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
  ObjectSet(no, OBJPROP_STYLE, STYLE_SOLID);
  ObjectSet(no, OBJPROP_COLOR, cl);
  ObjectSet(no, OBJPROP_BACK, True);
}

//+------------------------------------------------------------------+
//| Прорисовка объектов на графике                                   |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//|   no - наименование объекта                                      |
//|   tb - время начала сессии                                       |
//|   te - время окончания сессии                                    |
//+------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te) {
  datetime t1, t2;
  double   p1, p2;
  int      b1, b2;

  t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb);
  t2=StrToTime(TimeToStr(dt, TIME_DATE)+" "+te);
  b1=iBarShift(NULL, 0, t1);
  b2=iBarShift(NULL, 0, t2);
  p1=High[Highest(NULL, 0, MODE_HIGH, b1-b2, b2)];
  p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2, b2)];
  if (!HighRange) {p1=0; p2=2*p2;}
  ObjectSet(no, OBJPROP_TIME1 , t1);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_TIME2 , t2);
  ObjectSet(no, OBJPROP_PRICE2, p2);
}

//+------------------------------------------------------------------+
//| Уменьшение даты на один торговый день                            |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//+------------------------------------------------------------------+
datetime decDateTradeDay (datetime dt) {
  int ty=TimeYear(dt);
  int tm=TimeMonth(dt);
  int td=TimeDay(dt);
  int th=TimeHour(dt);
  int ti=TimeMinute(dt);

  td--;
  if (td==0) {
    tm--;
    if (tm==0) {
      ty--;
      tm=12;
    }
    if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) td=31;
    if (tm==2) if (MathMod(ty, 4)==0) td=29; else td=28;
    if (tm==4 || tm==6 || tm==9 || tm==11) td=30;
  }
  return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}
void clear() {
  int P = Period();
  if (P > PERIOD_D1) return;
  
  string prefix = "jj";
  string name = "";
  
  int cnt = MathMin(Bars, PERIOD_D1/P*NumberOfDays);
  for (int i=0; i < cnt; i++) 
  {
    name = prefix + TimeToStr(Time[i]);
    
    int res = ObjectFind(name);
    ObjectDelete(name);
  }
}
//+------------------------------------------------------------------+

