//+----------------------------------------------------------------------------+
//|                                                        i-Sessions-mod.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  16.11.2005  Индикатор торговых сессий.                                    |
//|  04.06.2008  Исправлена ошибка учёта первого бара в сессии.                |
//|  25.10.2008  Добавлены параметры: Style - Стиль линий объектов и           |
//|              FillBack - Заливка объектов.                                  |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_chart_window

//------- Внешние параметры индикатора ----------------------------------------+
extern int    NumberOfDays = 60;              // Количество дней // 5 дней - неделя; 20 - месяц; 60 - квартал
extern string AsiaBegin    = "01:00";         // Открытие азиатской сессии
extern string AsiaEnd      = "11:00";         // Закрытие азиатской сессии
extern color  AsiaColor    = C'177,192,177';  // Цвет азиатской сессии
extern string EurBegin     = "08:00";         // Открытие европейской сессии
extern string EurEnd       = "17:00";         // Закрытие европейской сессии
extern color  EurColor     = C'177,177,192';  // Цвет европейской сессии
extern string USABegin     = "14:00";         // Открытие американской сессии
extern string USAEnd       = "23:00";         // Закрытие американской сессии
extern color  USAColor     = C'177,192,177';  // Цвет американской сессии
extern color  LineColor    = DarkGray;        // Цвет разделительных линий
extern int    Style        = 2;               // Стиль линий объектов
extern bool   FillBack     = True;            // Заливать объекты
extern bool   ShowPrice    = False;           // Показывать ценовые уровни
extern color  clFont       = DimGray;         // Цвет шрифта
extern int    SizeFont     = 8;               // Размер шрифта
extern int    OffSet       = -10;             // Смещение


//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  DeleteObjects();
  for (int i=0; i<NumberOfDays; i++) {
    CreateObjects("r", "AS"+i, AsiaColor);
    CreateObjects("r", "EU"+i, EurColor);
    CreateObjects("r", "US"+i, USAColor);
    
    CreateObjects("l", "EUBeginLine"+i, LineColor);
    CreateObjects("l", "EUEndLine"+i, LineColor);
  }
  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Custor indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() {
  DeleteObjects();
  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Создание объектов индикатора                                              |
//|  Параметры:                                                                |
//|    no - наименование объекта                                               |
//|    cl - цвет объекта                                                       |
//+----------------------------------------------------------------------------+
void CreateObjects(string type, string no, color cl) {
  
  if(type == "r"){
    
    ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
    ObjectSet(no, OBJPROP_STYLE, Style);
    ObjectSet(no, OBJPROP_COLOR, cl);
    ObjectSet(no, OBJPROP_BACK, FillBack);
    
  }else if(type == "l"){
    
    ObjectCreate(no, OBJ_VLINE, 0, 0,0, 0,0);
    ObjectSet(no, OBJPROP_STYLE, Style);
    ObjectSet(no, OBJPROP_COLOR, LineColor);
    ObjectSet(no, OBJPROP_BACK, true);
  }
}

//+----------------------------------------------------------------------------+
//|  Удаление объектов индикатора                                              |
//+----------------------------------------------------------------------------+
void DeleteObjects() {
  for (int i=0; i<NumberOfDays; i++) {
    ObjectDelete("AS"+i);
    ObjectDelete("EU"+i);
    ObjectDelete("US"+i);
    
    ObjectDelete("EUBeginLine"+i);
    ObjectDelete("EUEndLine"+i);
    
    ObjectDelete("AS"+i+"up");
    ObjectDelete("EU"+i+"up");
    ObjectDelete("US"+i+"up");
  }
}

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  
  int period = Period();
  
  if(period < PERIOD_H1){
    
    datetime dt=CurTime();
    
    for (int i=0; i<NumberOfDays; i++) {
      if (ShowPrice) {
        DrawPrices(dt, "AS"+i, AsiaBegin, AsiaEnd);
        DrawPrices(dt, "EU"+i, EurBegin, EurEnd);
        DrawPrices(dt, "US"+i, USABegin, USAEnd);
      }
      DrawObjects(dt, "AS"+i, AsiaBegin, AsiaEnd);
      DrawObjects(dt, "EU"+i, EurBegin, EurEnd);
      DrawObjects(dt, "US"+i, USABegin, USAEnd);
      
      DrawLines(dt, "EUBeginLine"+i, EurBegin);
      DrawLines(dt, "EUEndLine"+i, EurEnd);
      
      dt-=24*60*60;
      while (TimeDayOfWeek(dt)<1 || TimeDayOfWeek(dt)>5) dt-=24*60*60;
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Прорисовка линий на графике                                               |
//|  Параметры:                                                                |
//|    dt - дата торгового дня                                                 |
//|    no - наименование объекта                                               |
//|    tb - время отрисовки линии                                              |
//+----------------------------------------------------------------------------+
void DrawLines(datetime dt, string no, string tb) {
  datetime t1;

  t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb);
  ObjectSet(no, OBJPROP_TIME1, t1);
}

//+----------------------------------------------------------------------------+
//|  Прорисовка объектов на графике                                            |
//|  Параметры:                                                                |
//|    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+1, b2)];
  p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2+1, b2)];
  ObjectSet(no, OBJPROP_TIME1 , t1);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_TIME2 , t2);
  ObjectSet(no, OBJPROP_PRICE2, p2);
}

//+----------------------------------------------------------------------------+
//|  Прорисовка ценовых меток на графике                                       |
//|  Параметры:                                                                |
//|    dt - дата торгового дня                                                 |
//|    no - наименование объекта                                               |
//|    tb - время начала сессии                                                |
//|    te - время окончания сессии                                             |
//+----------------------------------------------------------------------------+
void DrawPrices(datetime dt, string no, string tb, string te) {

  datetime t1, t2;
  double   p1, p2, p3;
  int      b1, b2;
  
  int digits = Digits();
  int coeff = 10000;
  
  if(digits == 4){
    
    coeff = coeff/10;
    
  }else if(digits == 3){
    
    coeff = coeff/100;
    
  }else if(digits == 2){
    
    coeff = coeff/1000;
  }

  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+1, b2)];
  p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2+1, b2)];
  p3=(p1-p2)*coeff;
  
  if (ObjectFind(no+"up")<0) ObjectCreate(no+"up", OBJ_TEXT, 0, 0,0);
  ObjectSet(no+"up", OBJPROP_TIME1   , t1+17000);
  ObjectSet(no+"up", OBJPROP_PRICE1  , p1+(OffSet+SizeFont)*Point);
  ObjectSet(no+"up", OBJPROP_COLOR   , clFont);
  ObjectSet(no+"up", OBJPROP_FONTSIZE, SizeFont);
  ObjectSetText(no+"up", DoubleToStr (p3, 0));
}
//+----------------------------------------------------------------------------+
