//+----------------------------------------------------------------------------+
//|                                                            i-Sessions.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    = "02:00";       // Открытие азиатской сессии
extern string AsiaEnd      = "11:00";       // Закрытие азиатской сессии
extern color  AsiaColor    = C'159,0,0';     // Цвет азиатской сессии
extern string EurBegin     = "08:00";       // Открытие европейской сессии
extern string EurEnd       = "17:00";       // Закрытие европейской сессии
extern color  EurColor     = C'36,113,40';           // Цвет европейской сессии
extern string USABegin     = "14:00";       // Открытие американской сессии
extern string USAEnd       = "23:00";       // Закрытие американской сессии
extern color  USAColor     = C'37,39,137';          // Цвет американской сессии
extern int    Style        = 2;             // Стиль линий объектов
extern bool   FillBack     = True;          // Заливать объекты
extern bool   ShowPrice    = True;          // Показывать ценовые уровни
extern color  clFont       = Yellow;          // Цвет шрифта
extern int    SizeFont     = 8;             // Размер шрифта
extern int    OffSet       = -10;            // Смещение


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

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

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

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

  ObjectDelete("AS"+i+"up");
  ObjectDelete("ASdn");
  ObjectDelete("EU"+i+"up");
  ObjectDelete("EUdn");
  ObjectDelete("US"+i+"up");
  ObjectDelete("USdn");
}}

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  datetime dt=CurTime();

  for (int i=0; i<NumberOfDays; i++) {
    if (ShowPrice && i==0) {
      DrawPrices(dt, "AS", AsiaBegin, AsiaEnd);
      DrawPrices(dt, "EU", EurBegin, EurEnd);
      DrawPrices(dt, "US", USABegin, USAEnd);
    }
    DrawObjects(dt, "AS"+i, AsiaBegin, AsiaEnd);
    DrawObjects(dt, "EU"+i, EurBegin, EurEnd);
    DrawObjects(dt, "US"+i, USABegin, USAEnd);
    dt-=24*60*60;
    while (TimeDayOfWeek(dt)<1 || TimeDayOfWeek(dt)>5) dt-=24*60*60;
  }
}

//+----------------------------------------------------------------------------+
//|  Прорисовка объектов на графике                                            |
//|  Параметры:                                                                |
//|    dt - дата торгового дня                                                 |
//|    no - наименование объекта                                               |
//|    tb - время начала сессии                                                |
//|    te - время окончания сессии                                             |
//+----------------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te) {
  datetime t1, t2;
  double   p1, p2, p3;
  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)]; 
  p3=(p1-p2)*10000;
  ObjectSet(no, OBJPROP_TIME1 , t1);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_TIME2 , t2);
  ObjectSet(no, OBJPROP_PRICE2, p2);
//+----------------------------------------------------------------------------+
//|  Прорисовка ценовых меток на графике                                       |
//|  Параметры:                                                                |
//|    dt - дата торгового дня                                                 |
//|    no - наименование объекта                                               |
//|    tb - время начала сессии                                                |
//|    te - время окончания сессии                                             |
//+----------------------------------------------------------------------------+
  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));
}
void DrawPrices(datetime dt, string no, string tb, string te) {
}
//+----------------------------------------------------------------------------+

