Time zones

//+----------------------------------------------------------------------------------------------------------------------+

//| TIME, forex sessions and trade hours monitor                                       MT4 indicator  TIME II (VBO).mq4  |

//| ©Vadim Baklanov, 2009                                                              (nickname gip on forum.mql4.com)  |

//| Èíäèêàòîð äëÿ îòîáðàæåíèÿ òîðãîâûõ ñåññèé è âñåìèðíîãî âðåìåíè                                       ispgip@mail.ru  |

//|                                                                                                      ICQ: 123372230  |

//| v2.0 Request updates and bug fixing on ICQ or skype                                                  Skype: adam_vb  |

//+----------------------------------------------------------------------------------------------------------------------+

// en

// Recommended:

// After indicator attached on chart, F8 -> "Common" tab -> Check box "Show object descriptions" and uncheck "Show grid"

// ru

// Ïðè óñòàíîâëåííîé ãàëî÷êå äîïîëíèòåëüíî îòîáðàæàåòñÿ øêàëà âðåìåíè UTC/GMT â íèæíåé ÷àñòè îêíà èíäèêàòîðà

// Îòîáðàæåíèå ñåòêè â îêíå ãðàôèêà öåíû (Ctrl-G) çàòðóäíÿåò âîñïðèÿòèå èíôîðìàöèè îòîáðàæàåìîé èíäèêàòîðîì

//

// Èíäèêàòîð áóäåò äîðàáàòûâàòüñÿ â äàëüíåéøåì, ïîýòîìó ïðîøó âñåõ îáðàùàòüñÿ ïî âîïðîñàì ïðàâèëüíîñòè,

// óäîáñòâà ðàáîòû è ñîñòàâà îòîáðàæàåìîé èíäèêàòîðîì èíôîðìàöèè. Ìîè êîíòàêòíûå äàííûå óêàçàíû âûøå.

// References:

// www.timeanddate.com

// http://en.wikipedia.org/wiki/List_of_stock_exchanges

// http://www.wikinvest.com/wiki/List_of_Stock_Exchanges (Market Hours reference)

// New York Stock Exchange (NYSE Euronext)      http://www.nyse.com/

// Tokyo Stock Exchange (TSE)                   http://www.tse.or.jp/english/   http://en.wikipedia.org/wiki/Tokyo_stock_exchange

// NASDAQ Stock market                          http://www.nasdaq.com/

// London Stock Exchange (LSE)                  http://www.londonstockexchange.com/home/homepage.htm   http://en.wikipedia.org/wiki/London_Stock_Exchange

// Hong Kong (HKEx)                             http://www.hkex.com.hk/index.htm   http://en.wikipedia.org/wiki/Hong_Kong_Stock_Exchange

// Toronto Stock Exchange                  

// Frankfurt (FSE) Borse Frankfurt, Deutsche Borse Group

//                                              http://www.boerse-frankfurt.de/EN/index.aspx   http://en.wikipedia.org/wiki/Frankfurt_Stock_Exchange

// Shanghai Stock Exchange (SSE)                http://www.sse.com.cn/sseportal/en_us/ps/home.shtml

// Bolsas y Mercados Espanoles (BME) Spanish Exchanges   

//                                              http://www.bolsamadrid.es/ing/portada.htm   http://en.wikipedia.org/wiki/Bolsa_de_Madrid

// Australian Securities Exchange (ASX)         http://www.asx.com.au/   http://en.wikipedia.org/wiki/Australian_Securities_Exchange

// Swiss Exchange, SWX — $1,318                 http://www.six-swiss-exchange.com/index.html

// Nordic Stock Exchange Group OMX  — $1,296    http://www.nasdaqomx.com/

// Borsa Italiana S.p. A., ISE  — $1,123        http://www.borsaitaliana.it/homepage/homepage.htm

// Bombay Stock Exchange Limited  — $1,005      http://www.bseindia.com/

// KRX Korea Exchange  — $1,001                 http://www.krx.co.kr/index.html

// BM&FBOVESPA                                  http://www.bovespa.com.br/indexi.asp

// NSE National Stock Exchange of India Ltd     http://www.nse-india.com/

// ÌÌÂÁ(Moscow) & MICEX                         http://www.micex.com/

// JSE Securities Exchange South Africa         http://www.jse.co.za/index.jsp

// TAIWAN Stock Exchange                        http://www.twse.com.tw/en/

#property copyright "©Vadim Baklanov(gip), 2009"

#property link      "ispgip@mail.ru"

#property indicator_separate_window

#property indicator_minimum 0

#property indicator_maximum 1

// Brokers standard time zone (EST):

extern int Broker_standard_time_zone = +1;

extern datetime Broker_DST_start     = D'01.01.2001 00:00:00';

extern datetime Broker_DST_end       = D'01.01.2001 00:00:00';

extern color Clock_color = DarkGray;

extern color font_color = DarkGray;

extern string font_name = "Tahoma";

extern int font_size = 8;

extern int Number_of_days_display_sessions = 10;

extern int Session_borders_line_style = STYLE_SOLID;

extern int Session_borders_line_width = 1;

extern string Customized_time_lines = ""; // Example: "12:34,21:43"

// Time of sessions and DST (Daylight saving time) - all in UTC

// south hemisphere

// Sydney. EDT (Eastern Daylight Time) UTC offset +10 DST +1 hour.

int SydneyTimeZone = +10;

datetime SydneyBegins      = D'01.01.2001 23:00:00'; //++

datetime SydneyEnds        = D'01.01.2001 07:00:00';

datetime SydneyDSTStarts   = D'04.10.2009 02:00:00';

datetime SydneyDSTEnds     = D'05.04.2009 03:00:00';

color SydneyColor = DarkSeaGreen;

color SydneyBackColor = C'12,0,60';

datetime ASXOpens         = D'01.01.2001 00:00:00';

string   ASXOpensText     = "+ASX";

string   ASXOpensDescr    = "+Australian SE";

datetime ASXCloses        = D'01.01.2001 06:00:00';

string   ASXClosesText    = "-ASX";

string   ASXClosesDescr   = "-Australian SE";

// north hemisphere

int TokyoTimeZone = +9;

datetime TokyoBegins       = D'01.01.2001 00:00:00'; //+

datetime TokyoEnds         = D'01.01.2001 08:00:00'; //+

color TokyoColor = DeepPink;

color TokyoBackColor = C'43,0,23';

datetime TokyoSEOpens      = D'01.01.2001 00:00:00';

string   TokyoSEOpensText  = "+TSE";

string   TokyoSEOpensDescr = "+Tokyo SE";

datetime TokyoSECloses     = D'01.01.2001 06:00:00';

string   TokyoSEClosesText = "-TSE";

string   TokyoSEClosesDescr= "-Tokyo SE";

// Hong Kong, Shanghai Standard time zone:    UTC +8 hours No DST in 2009

int HongKongTimeZone = +8;

datetime HongKongBegins    = D'01.01.2001 01:00:00';

datetime HongKongEnds      = D'01.01.2001 09:00:00';

color HongKongColor = Red;

color HongKongBackColor = C'43,0,0';

datetime HKExOpens         = D'01.01.2001 02:00:00'; // Pre-opening Session 9:30am to 10:00am, Morning Session    begins in 10:00am

string   HKExOpensText     = "+HKEx";

string   HKExOpensDescr    = "+Hong Kong HKEx";

datetime HKExCloses        = D'01.01.2001 08:00:00'; // 4:00pm

string   HKExClosesText    = "-HKEx";

string   HKExClosesDescr   = "-Hong Kong HKEx";

datetime SSEOpens          = D'01.01.2001 01:30:00'; // Pre-Market Session: 09:15 - 09:25 Normal Trading Session: 09:30 - 15:00

string   SSEOpensText      = "+SSE";

string   SSEOpensDescr     = "+Shanghai SE";

datetime SSECloses         = D'01.01.2001 07:00:00'; // The afternoon session is 13:00pm to 15:00pm

string   SSEClosesText     = "-SSE";

string   SSEClosesDescr    = "-Shanghai SE";

// Moscow, MSK (Moscow Standard Time) UTC +3 Daylight saving time:    +1 hour

int MoscowTimeZone = +3;

datetime MoscowDSTStarts   = D'29.03.2009 02:00:00';

datetime MoscowDSTEnds     = D'25.10.2009 03:00:00';

datetime RTSOpens          = D'01.01.2001 07:30:00';

string   RTSOpensText      = "+RTS";

string   RTSOpensDescr     = "+RTS áèðæà";

datetime RTSCloses         = D'01.01.2001 15:45:00';

string   RTSClosesText     = "-RTS";

string   RTSClosesDescr    = "-RTS áèðæà";

// CEST, UTC +1 Daylight saving time:    +1 hour

int FrankfurtTimeZone = +1;

datetime FrankfurtDSTStarts= D'29.03.2009 01:00:00';

datetime FrankfurtDSTEnds  = D'25.10.2009 02:00:00';

datetime FrankfurtBegins   = D'01.01.2001 07:00:00';

datetime FrankfurtEnds     = D'01.01.2001 16:00:00';

color FrankfurtColor = Gold;

color FrankfurtBackColor = C'51,33,0';

datetime FSEOpens          = D'01.01.2001 08:00:00'; // Trading runs from 09:00 to 17:30 with closing auction from 17:30-17:35

string   FSEOpensText      = "+FSE";

string   FSEOpensDescr     = "+Frankfurt SE";

datetime FSECloses         = D'01.01.2001 16:30:00';

string   FSEClosesText     = "-FSE";

string   FSEClosesDescr    = "-Frankfurt SE";

// Madrid, CET (Central European Time) UTC +1

int MadridTimeZone = +1;

datetime MadridDSTStarts= D'29.03.2009 02:00:00';

datetime MadridDSTEnds  = D'25.10.2009 03:00:00';

// Spanish Stock Market Interconnection System (SIBE), which handles more than 90% of transactions

datetime SIBEOpens         = D'01.01.2001 08:00:00'; // Trading on SIBE is conducted from 9am to 5:30pm; open outcry from 10am to 11:30am

string   SIBEOpensText     = "+SIBE";

string   SIBEOpensDescr    = "+Madrid SIBE";

datetime SIBECloses        = D'01.01.2001 16:30:00';

string   SIBEClosesText    = "-SIBE";

string   SIBEClosesDescr   = "-Madrid SIBE";

// GMT, UTC no offset Daylight saving time:    +1 hour

int LondonTimeZone = 0;

datetime LondonDSTStarts   = D'29.03.2009 01:00:00';

datetime LondonDSTEnds     = D'25.10.2009 02:00:00';

datetime LondonBegins      = D'01.01.2001 08:00:00';

datetime LondonEnds        = D'01.01.2001 17:00:00'; //+

color LondonColor = Orange;

color LondonBackColor = C'12,0,60';

datetime LSEOpens          = D'01.01.2001 08:00:00';

string   LSEOpensText      = "+LSE";

string   LSEOpensDescr     = "+London SE";

datetime LSECloses         = D'01.01.2001 16:30:00';

string   LSEClosesText     = "-LSE";

string   LSEClosesDescr    = "-London SE";

// EST, UTC -5 Daylight saving time:    +1 hour

int NewYorkTimeZone = -5;

datetime NewYorkBegins     = D'01.01.2001 13:00:00'; //+

datetime NewYorkEnds       = D'01.01.2001 21:00:00';

datetime NewYorkDSTStarts  = D'08.03.2009 02:00:00';

datetime NewYorkDSTEnds    = D'01.11.2009 02:00:00';

color NewYorkColor = CornflowerBlue;

color NewYorkBackColor = C'12,0,60';

datetime NYSEOpens         = D'01.01.2001 14:30:00'; //  The New York Stock Exchange opens Monday through Friday at 9:30 EST

string NYSEOpensText       = "+ NYSE, Toronto SE, NASDAQ, SP500";

string NYSEOpensDescr      = "+ NYSE, Toronto SE, NASDAQ, SP500";

datetime NYSECloses        = D'01.01.2001 21:00:00'; // 16:00 EST

string NYSEClosesText      = "- NYSE, Toronto SE, NASDAQ, SP500(+15min)";

string NYSEClosesDescr     = "- NYSE, Toronto SE, NASDAQ, SP500(+15min)";

// CDT, UTC -6 Daylight saving time:    +1 hour

int ChicagoTimeZone = -6;

datetime ChicagoBegins     = D'01.01.2001 14:00:00';

datetime ChicagoEnds       = D'01.01.2001 22:00:00';

datetime ChicagoDSTStarts  = D'08.03.2009 03:00:00';

datetime ChicagoDSTEnds    = D'01.11.2009 01:00:00';

color ChicagoColor = MediumSlateBlue;

color ChicagoBackColor = C'12,0,60';

datetime HistoryDownloadTime = 0;

datetime daily[];

int win = 0;

double open  = 0;

double high  = 0;

double low   = 0;

double close = 0;

bool SleepMode = false;

bool SessionBordersOn = false;

bool BriefModeOn = false;

int init()

{

   HistoryDownloadTime = 0;

  

   IndicatorShortName("TIME II (VBO)");

  

   // Ïðè ïåðâîì èñïîëüçîâàíèè èíäèêàòîð âêëþ÷åí:

   if (!GlobalVariableCheck("state " + Symbol() + " Sessions borders On"))

      GlobalVariableSet("state " + Symbol() + " Sessions borders On", 1);

 

   win = WindowOnDropped();

   if (win < 0)

      win = WindowFind(WindowExpertName());

   if (win < 0)

      return;

 

   AllDraw();

  

   return(0);

}

int deinit()

{

   ProcessOptions();

   ClockClose();

   SessionsClose();

  

   return(0);

}

int start()

{

   win = WindowOnDropped();

   if (win < 0)

      win = WindowFind(WindowExpertName());

   if (win < 0)

      return;

   AllDraw();

  

   return(0);

}

// Ñîçäàíèå ãðàôè÷åñêèõ îáúåêòîâ äëÿ îòîáðàæåíèÿ èíäèêàòîðà

//

void AllDraw()

{

   // Äîçàãðóçêà èñòîðèè èíñòðóìåíòà

   if (HistoryDownloadTime < TimeCurrent() - 3600)

   {

      CopySeries(daily, MODE_TIME, Symbol(), PERIOD_D1);

      HistoryDownloadTime = TimeCurrent();

   }

  

   ProcessOptions();

   ClockDraw();

   SessionsDraw(Number_of_days_display_sessions - 1, 0);

}

void ProcessOptions()

{

   // >> Drag and Drop íà ãðàôèêå èíäèêàòîðà

  

   SessionBordersOn = GlobalVariableGet("state " + Symbol() + " Sessions borders On");

   BriefModeOn = GlobalVariableGet("state " + Symbol() + " Sessions Brief mode On");

  

   string mousename = "Drag and Drop on Option"; // Drag and Drop

   int mouseX = ObjectGet(mousename, OBJPROP_XDISTANCE);

   int mouseY = ObjectGet(mousename, OBJPROP_YDISTANCE);

   string rectname = "Session borders On/Off";

   int rectX  = ObjectGet(rectname, OBJPROP_XDISTANCE);

   int rectY  = ObjectGet(rectname, OBJPROP_YDISTANCE);

  

   if (MathAbs(mouseX - rectX) < 12 && MathAbs(mouseY - rectY) < 8)

   {

      SessionBordersOn = !SessionBordersOn;

      GlobalVariableSet("state " + Symbol() + " Sessions borders On", SessionBordersOn);

   }

   string briefname = "Brief mode On/Off";

   int underX  = ObjectGet(briefname, OBJPROP_XDISTANCE);

   int underY  = ObjectGet(briefname, OBJPROP_YDISTANCE);

  

   if (MathAbs(mouseX - underX) < 12 && MathAbs(mouseY - underY) < 8)

   {

      BriefModeOn = !BriefModeOn;

      GlobalVariableSet("state " + Symbol() + " Sessions Brief mode On", BriefModeOn);

   }

  

   int obj_total = ObjectsTotal();

   for(int obj = obj_total - 1; obj >= 0; obj--)

   { 

      string objname = ObjectName(obj);

      if (objname == mousename

      || objname == rectname

      || objname == briefname)

         ObjectDelete(objname);

   }

   ObjectCreate(mousename, OBJ_LABEL, win, 0, 0);

   ObjectSet(mousename, OBJPROP_BACK, false);

   ObjectSet(mousename, OBJPROP_CORNER, 1);

   ObjectSet(mousename, OBJPROP_XDISTANCE, 5);

   ObjectSet(mousename, OBJPROP_YDISTANCE, 4);

   ObjectSetText(mousename, "8", 14, "Wingdings", DarkGray);

  

   ObjectCreate(rectname, OBJ_LABEL, win, 0, 0);

   ObjectSet(rectname, OBJPROP_BACK, true);

   ObjectSet(rectname, OBJPROP_CORNER, 1);

   ObjectSet(rectname, OBJPROP_XDISTANCE, 2);

   ObjectSet(rectname, OBJPROP_YDISTANCE, 26);

   if (SessionBordersOn)

      string char = CharToStr(164);

   else

      char = CharToStr(161);

   ObjectSetText(rectname, char, 14, "Wingdings", DarkGray);

  

   ObjectCreate(briefname, OBJ_LABEL, win, 0, 0);

   ObjectSet(briefname, OBJPROP_BACK, true);

   ObjectSet(briefname, OBJPROP_CORNER, 1);

   ObjectSet(briefname, OBJPROP_XDISTANCE, 2);

   ObjectSet(briefname, OBJPROP_YDISTANCE, 48);

   if (BriefModeOn)

      char = CharToStr(164);

   else

      char = CharToStr(161);

   ObjectSetText(briefname, char, 14, "Wingdings", DarkGray);

  

   // << Drag and Drop íà ãðàôèêå èíäèêàòîðà

}

// Îòîáðàæåíèå âðåìåíè

//

void ClockDraw()

{

   ClockClose();

 

   int minutelocal = TimeMinute(TimeLocal());

   int minuteserver = TimeMinute(TimeCurrent());

   bool nobacklog = MathAbs(minuteserver - minutelocal) < 3 || (MathAbs(minuteserver - minutelocal) > 57);

   if (nobacklog)

      color clockcolor = Clock_color;

   else

      clockcolor = Red;

  

   datetime UTC = LocalTimeToUTC(TimeCurrent(), Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

   string clockUTC = "Time UTC";

   ObjectCreate(clockUTC, OBJ_LABEL, win, 0, 0);

   ObjectSet(clockUTC, OBJPROP_BACK, false);

   ObjectSet(clockUTC, OBJPROP_CORNER, 1);

   ObjectSet(clockUTC, OBJPROP_XDISTANCE, 125);

   ObjectSet(clockUTC, OBJPROP_YDISTANCE, 3);

   ObjectSetText(clockUTC, TimeToStr(UTC, TIME_MINUTES), 12, "System", clockcolor);

   string clock = "Time Broker";

   ObjectCreate(clock, OBJ_LABEL, win, 0, 0);

   ObjectSet(clock, OBJPROP_BACK, false);

   ObjectSet(clock, OBJPROP_CORNER, 1);

   ObjectSet(clock, OBJPROP_XDISTANCE, 80); // 30

   ObjectSet(clock, OBJPROP_YDISTANCE, 3); // 23

   //ObjectSetText(clock, TimeToStr(TimeCurrent(), TIME_MINUTES), 14, "Terminal", clockcolor);

   ObjectSetText(clock, TimeToStr(TimeCurrent(), TIME_MINUTES), 12, "System", clockcolor);

   string local = "Time Local";

   ObjectCreate(local, OBJ_LABEL, win, 0, 0);

   ObjectSet(local, OBJPROP_BACK, false);

   ObjectSet(local, OBJPROP_CORNER, 1);

   ObjectSet(local, OBJPROP_XDISTANCE, 35); // 30

   ObjectSet(local, OBJPROP_YDISTANCE, 3); // 43

   ObjectSetText(local, TimeToStr(TimeLocal(), TIME_MINUTES), 12, "System", Clock_color);

  

   string cursor = "Current time";

   ObjectCreate(cursor, OBJ_VLINE, 0, TimeCurrent(), 0);

   ObjectSet(cursor, OBJPROP_BACK, true);

   ObjectSet(cursor, OBJPROP_COLOR, Green);

   ObjectSet(cursor, OBJPROP_STYLE, STYLE_DOT);

   ObjectSet(cursor, OBJPROP_WIDTH, 1);

  

}

// Óäàëèòü âñå ãðàôè÷åñêèå îáúåêòû ÷àñîâ

//

void ClockClose()

{

   int obj_total = ObjectsTotal();

   for(int obj = obj_total - 1; obj >= 0; obj--)

   { 

      string objname = ObjectName(obj);

      if (StringFind(objname, "Time UTC") >= 0

      || StringFind(objname, "Time Broker") >= 0

      || StringFind(objname, "Time Local") >= 0

      || StringFind(objname, "Current time") >= 0)

         ObjectDelete(objname);

   }

}

// Îòîáðàæåíèå òîðãîâûõ ñåññèé â çàäàííîì èíòåðâàëå âðåìåíè

//

// barshiftD1from - ñìåùåíèå äíåâíîãî áàðà íà÷àëà ïåðèîäà îòîáðàæåíèÿ

// barshiftD1to - ñìåùåíèå äíåâíîãî áàðà îêîí÷àíèÿ ïåðèîäà îòîáðàæåíèÿ

//

void SessionsDraw(int barshiftD1from, int barshiftD1to)

{

   SessionsClose();

  

   // Íà òàéìôðåéìå âûøå M30 îãðàíè÷åííîå îòîáðàæåíèå:

   SleepMode = Period() > PERIOD_M15;

   if (SleepMode)

   {

      string status = "Sleep mode";

      ObjectCreate(status, OBJ_LABEL, win, 0, 0);

      ObjectSet(status, OBJPROP_BACK, true);

      ObjectSet(status, OBJPROP_CORNER, 3);

      ObjectSet(status, OBJPROP_XDISTANCE, 2);

      ObjectSet(status, OBJPROP_YDISTANCE, 2);

      ObjectSetText(status, "© ispgip@mail.ru ICQ: 123372230 Skype: adam_vb", 8, "Tahoma", font_color);

   }

  

   // Íå ðèñîâàòü íà òàéìôðåéìå âûøå H4:

   if (Period() >= PERIOD_H4)

      return;

   barshiftD1from = MathMax(0, barshiftD1from);

   barshiftD1to = MathMax(0, barshiftD1to);

  

   for (int daybarshift = barshiftD1from; daybarshift >= barshiftD1to; daybarshift--)

   {

      // Äàòà îòðèñîâêè:

      datetime day = iTime(NULL, PERIOD_D1, daybarshift);

      string idstring = TimeToStr(day, TIME_DATE);

     

      if (day == 0)

         continue;

     

      // Çäåñü è äàëåå ïðèâîäèì âðåìÿ ê âðåìåíè áðîêåðà, äëÿ êîðåêòíîãî ïîçèöèîíèðîâàíèÿ íà ãðàôèêå öåíû.

     

      // Ñèäíåéñêàÿ ñåññèÿ

      datetime SydneySessionBeginUTC = TimeTableToUTC(day, SydneyBegins, SydneyDSTStarts, SydneyDSTEnds);

      datetime SydneySessionBegin = UTCToLocalTime(SydneySessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end) - 24*3600;

      datetime SydneySessionEndUTC = TimeTableToUTC(day, SydneyEnds, SydneyDSTStarts, SydneyDSTEnds);

      datetime SydneySessionEnd = UTCToLocalTime(SydneySessionEndUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      OHLC(SydneySessionBegin, SydneySessionEnd);

      PlaceRectangle("Sydney " + idstring, "Sydney", SydneySessionBeginUTC - SydneySessionBegin, SydneySessionBegin, low, SydneySessionEnd, high, SydneyColor, SydneyBackColor, 3);

     

      // Íà÷àëî ñëåäóþùåé ñèäíåéñêîé ñåññèè, èñêëþ÷àÿ ïÿòíèöó:

      if (TimeDayOfYear(day) == DayOfYear() && DayOfWeek() != 5)

      {

         SydneySessionBeginUTC = TimeTableToUTC(day, SydneyBegins, SydneyDSTStarts, SydneyDSTEnds);

         SydneySessionBegin = UTCToLocalTime(SydneySessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

         SydneySessionEndUTC = TimeTableToUTC(day, SydneyEnds, SydneyDSTStarts, SydneyDSTEnds) + 24*3600;

         SydneySessionEnd = UTCToLocalTime(SydneySessionEndUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

         OHLC(SydneySessionBegin, SydneySessionEnd);

         PlaceRectangle("Sydney " + idstring + ".", "Sydney", SydneySessionBeginUTC - SydneySessionBegin, SydneySessionBegin, low, SydneySessionEnd, high, SydneyColor, SydneyBackColor, 3);

      }

      // Òîêèéñêàÿ ñåññèÿ

      datetime TokyoSessionBeginUTC = TimeTableToUTC(day, TokyoBegins, 0, 0);

      datetime TokyoSessionBegin = UTCToLocalTime(TokyoSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime TokyoSessionEnd = TokyoSessionBegin + (TokyoEnds - TokyoBegins);

      OHLC(TokyoSessionBegin, TokyoSessionEnd);

      PlaceRectangle("Tokyo " + idstring, "Tokyo", TokyoSessionBeginUTC - TokyoSessionBegin, TokyoSessionBegin, low, TokyoSessionEnd, high, TokyoColor, TokyoBackColor, 0);

     

      // Ãîíêîíãñêàÿ ñåññèÿ

      datetime HongKongSessionBeginUTC = TimeTableToUTC(day, HongKongBegins, 0, 0);

      datetime HongKongSessionBegin = UTCToLocalTime(HongKongSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime HongKongSessionEnd = HongKongSessionBegin + (HongKongEnds - HongKongBegins);

      OHLC(HongKongSessionBegin, HongKongSessionEnd);

      PlaceRectangle("Hong Kong " + idstring, "Hong Kong", HongKongSessionBeginUTC - HongKongSessionBegin, HongKongSessionBegin, low, HongKongSessionEnd, high, HongKongColor, HongKongBackColor, 1);

     

      // Ôðàíêôóðò

      datetime FrankfurtSessionBeginUTC = TimeTableToUTC(day, FrankfurtBegins, FrankfurtDSTStarts, FrankfurtDSTEnds);

      datetime FrankfurtSessionBegin = UTCToLocalTime(FrankfurtSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime FrankfurtSessionEnd = FrankfurtSessionBegin + (FrankfurtEnds - FrankfurtBegins);

      OHLC(FrankfurtSessionBegin, FrankfurtSessionEnd);

      PlaceRectangle("Frankfurt " + idstring, "Frankfurt, Madrid", FrankfurtSessionBeginUTC - FrankfurtSessionBegin, FrankfurtSessionBegin, low, FrankfurtSessionEnd, high, FrankfurtColor, FrankfurtBackColor, 2);

      // Ëîíäîí

      datetime LondonSessionBeginUTC = TimeTableToUTC(day, LondonBegins, LondonDSTStarts, LondonDSTEnds);

      datetime LondonSessionBegin = UTCToLocalTime(LondonSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime LondonSessionEnd = LondonSessionBegin + (LondonEnds - LondonBegins);

      OHLC(LondonSessionBegin, LondonSessionEnd);

      PlaceRectangle("London " + idstring, "London", LondonSessionBeginUTC - LondonSessionBegin, LondonSessionBegin, low, LondonSessionEnd, high, LondonColor, LondonBackColor, 3);

      // Íüþ-Éîðê

      datetime NewYorkSessionBeginUTC = TimeTableToUTC(day, NewYorkBegins, NewYorkDSTStarts, NewYorkDSTEnds);

      datetime NewYorkSessionBegin = UTCToLocalTime(NewYorkSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime NewYorkSessionEnd = NewYorkSessionBegin + (NewYorkEnds - NewYorkBegins);

      OHLC(NewYorkSessionBegin, NewYorkSessionEnd);

      PlaceRectangle("NewYork " + idstring, "New York", NewYorkSessionBeginUTC - NewYorkSessionBegin, NewYorkSessionBegin, low, NewYorkSessionEnd, high, NewYorkColor, NewYorkBackColor, 0);

      // ×èêàãî

      datetime ChicagoSessionBeginUTC = TimeTableToUTC(day, ChicagoBegins, ChicagoDSTStarts, ChicagoDSTEnds);

      datetime ChicagoSessionBegin = UTCToLocalTime(ChicagoSessionBeginUTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

      datetime ChicagoSessionEnd = ChicagoSessionBegin + (ChicagoEnds - ChicagoBegins);

      OHLC(ChicagoSessionBegin, ChicagoSessionEnd);

      PlaceRectangle("Chicago " + idstring, "Chicago", ChicagoSessionBeginUTC - ChicagoSessionBegin, ChicagoSessionBegin, low, ChicagoSessionEnd, high, ChicagoColor, ChicagoBackColor, 1);

     

     

      // Customized line

      int fragments = FragmentsTotal(Customized_time_lines);

      for(int f = 0; f < fragments; f++)

      {

         string fragment = StringTrimRight(GetFragment(Customized_time_lines, f));

         if (!EmptyString(fragment))

         {

            datetime time = UTCToLocalTime(StrToTime(TimeToStr(day,TIME_DATE) + " " + fragment), Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

            if (time > 0)

            {

               string lineid = "Customized line " + idstring + " " + ShortestTime(time);

               ObjectCreate(lineid, OBJ_VLINE, 0, time, 0);

               ObjectSet(lineid, OBJPROP_COLOR, DeepPink);

               ObjectSet(lineid, OBJPROP_BACK, 1);

               ObjectSet(lineid, OBJPROP_STYLE, STYLE_DOT);

               ObjectSetText(lineid, fragment);

            }

         }

      }

      // Australian Securities Exchange (ASX)

      PlaceImportantPointsUTC(TimeTableToUTC(day, ASXOpens, 0, 0), ASXOpensText, ASXOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, ASXCloses, 0, 0), ASXClosesText, ASXClosesDescr);

      // Tokyo TSE

      PlaceImportantPointsUTC(TimeTableToUTC(day, TokyoSEOpens, 0, 0), TokyoSEOpensText, TokyoSEOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, TokyoSECloses, 0, 0), TokyoSEClosesText, TokyoSEClosesDescr);

      // Hong Kong HKEx

      PlaceImportantPointsUTC(TimeTableToUTC(day, HKExOpens, 0, 0), HKExOpensText, HKExOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, HKExCloses, 0, 0), HKExClosesText, HKExClosesDescr);

      // Shanghai SSE

      PlaceImportantPointsUTC(TimeTableToUTC(day, SSEOpens, 0, 0), SSEOpensText, SSEOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, SSECloses, 0, 0), SSEClosesText, SSEClosesDescr);

      // Moscow ÐÒÑ

      PlaceImportantPointsUTC(TimeTableToUTC(day, RTSOpens, MoscowDSTStarts, MoscowDSTEnds), RTSOpensText, RTSOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, RTSCloses, MoscowDSTStarts, MoscowDSTEnds), RTSClosesText, RTSClosesDescr);

      // Frankfurt FSE

      PlaceImportantPointsUTC(TimeTableToUTC(day, FSEOpens, FrankfurtDSTStarts, FrankfurtDSTEnds), FSEOpensText, FSEOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, FSECloses, FrankfurtDSTStarts, FrankfurtDSTEnds), FSEClosesText, FSEClosesDescr);

      // Madrid SIBE

      PlaceImportantPointsUTC(TimeTableToUTC(day, SIBEOpens, MadridDSTStarts, MadridDSTEnds), SIBEOpensText, SIBEOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, SIBECloses, MadridDSTStarts, MadridDSTEnds), SIBEClosesText, SIBEClosesDescr);

      // London LSE

      PlaceImportantPointsUTC(TimeTableToUTC(day, LSEOpens, LondonDSTStarts, LondonDSTEnds), LSEOpensText, LSEOpensDescr);

      PlaceImportantPointsUTC(TimeTableToUTC(day, LSECloses, LondonDSTStarts, LondonDSTEnds), LSEClosesText, LSEClosesDescr);

      // New York NYSE

      PlaceImportantPointsUTC(NewYorkSessionBeginUTC + (NYSEOpens - NewYorkBegins), NYSEOpensText, NYSEOpensDescr);

      PlaceImportantPointsUTC(NewYorkSessionBeginUTC + (NYSECloses - NewYorkBegins), NYSEClosesText, NYSEClosesDescr);

   }  

}

// Óäàëèòü âñå ãðàôè÷åñêèå îáúåêòû èíäèêàòîðà òîðãîâûõ ñåññèé

//

void SessionsClose()

{

   int obj_total = ObjectsTotal();

   for(int obj = obj_total - 1; obj >= 0; obj--)

   { 

      string objname = ObjectName(obj);

      if (StringFind(objname, " Session Begin") >= 0

      || StringFind(objname, " Session End") >= 0

      || StringFind(objname, " Session High") >= 0

      || StringFind(objname, " Session Low") >= 0

      || StringFind(objname, " Session label") >= 0

      || StringFind(objname, " Session line") >= 0

      || StringFind(objname, " UTC ") >= 0

      || StringFind(objname, "_UTC ") >= 0

      || StringFind(objname, " Session time") >= 0

      || StringFind(objname, "Customized line") >= 0

      || StringFind(objname, "Sleep mode") >= 0)

            ObjectDelete(objname);

   }

}

// Îòðèñîâàòü îäíó ñåññèþ

//

void PlaceRectangle(string session, string description, int toUTC, datetime time1, double price1, datetime time2, double price2, color session_color, color rect_color, int level)

{

   if (time2 < time1 || time2 > time1 + 12*3600)

      return;

  

   if (!BriefModeOn)

      double Y = WindowPriceMin(win) + (WindowPriceMax(win) - WindowPriceMin(win)) * (0.78 - level*0.15);

   else

      Y = WindowPriceMin(win) + (WindowPriceMax(win) - WindowPriceMin(win)) * (0.8 - level*0.2);

  

   if (SessionBordersOn)

   {

      // Ðàìêè ñåññèé íà ãðàôèêå öåíû

     

      string objname = session + " Session High";

      ObjectCreate(objname, OBJ_TREND, 0, time1, price2, time2, price2);

      ObjectSet(objname, OBJPROP_COLOR, session_color);

      ObjectSet(objname, OBJPROP_BACK, true);

      ObjectSet(objname, OBJPROP_STYLE, Session_borders_line_style);

      ObjectSet(objname, OBJPROP_WIDTH, Session_borders_line_width);

      ObjectSet(objname, OBJPROP_RAY, 0);

     

      //objname = session + " Session High label";

      //ObjectCreate(objname, OBJ_TEXT, 0, time2 - 1800, price2);

      //ObjectSet(objname, OBJPROP_BACK, false);

      //ObjectSetText(objname, DoubleToStr(price2, Digits), font_size - 1, "Tahoma", font_color);

      objname = session + " Session Low";

      ObjectCreate(objname, OBJ_TREND, 0, time1, price1, time2, price1);

      ObjectSet(objname, OBJPROP_COLOR, session_color);

      ObjectSet(objname, OBJPROP_BACK, true);

      ObjectSet(objname, OBJPROP_STYLE, Session_borders_line_style);

      ObjectSet(objname, OBJPROP_WIDTH, Session_borders_line_width);

      ObjectSet(objname, OBJPROP_RAY, 0);

     

      //objname = session + " Session Low label";

      //ObjectCreate(objname, OBJ_TEXT, 0, time2 - 1800, price1);

      //ObjectSet(objname, OBJPROP_BACK, false);

      //ObjectSetText(objname, DoubleToStr(price1, Digits), font_size - 1, "Tahoma", font_color);

      objname = session + " Session Begin";

      ObjectCreate(objname, OBJ_TREND, 0, time1, price2, time1, price1);

      ObjectSet(objname, OBJPROP_COLOR, session_color);

      ObjectSet(objname, OBJPROP_BACK, true);

      ObjectSet(objname, OBJPROP_STYLE, Session_borders_line_style);

      ObjectSet(objname, OBJPROP_WIDTH, Session_borders_line_width);

      ObjectSet(objname, OBJPROP_RAY, 0);

      //ObjectSetText(objname, session, font_size, font_name, font_color);

      objname = session + " Session End";

      ObjectCreate(objname, OBJ_TREND, 0, time2, price1, time2, price2);

      ObjectSet(objname, OBJPROP_COLOR, session_color);

      ObjectSet(objname, OBJPROP_BACK, true);

      ObjectSet(objname, OBJPROP_STYLE, Session_borders_line_style);

      ObjectSet(objname, OBJPROP_WIDTH, Session_borders_line_width);

      ObjectSet(objname, OBJPROP_RAY, 0);

   }

   if (!SleepMode)

   {

      // Äëèòåëüíîñòü ñåññèé â îêíå èíäèêàòîðà

      objname = session + " Session line";

      ObjectCreate(objname, OBJ_TREND, win, time1, Y, time2, Y);

      ObjectSet(objname, OBJPROP_COLOR, session_color);

      ObjectSet(objname, OBJPROP_BACK, true);

      ObjectSet(objname, OBJPROP_STYLE, STYLE_SOLID);

      ObjectSet(objname, OBJPROP_WIDTH, 2);

      ObjectSet(objname, OBJPROP_RAY, 0);

  

      if (!BriefModeOn)

      {

         objname = session + " Session label";

         ObjectCreate(objname, OBJ_TEXT, win, time1 + 40 * 60, Y);

         ObjectSet(objname, OBJPROP_BACK, false);

         ObjectSetText(objname, description, font_size, font_name, font_color);

         // UTC âðåìÿ ñåññèé

         objname = TimeToStr(time1 + toUTC, TIME_DATE | TIME_MINUTES) + " UTC ";

         ObjectCreate(objname, OBJ_VLINE, win, 0, 0);

         ObjectSet(objname, OBJPROP_TIME1, time1 + 220);

         ObjectSet(objname, OBJPROP_COLOR, -1);

         ObjectSet(objname, OBJPROP_BACK, true);

         ObjectSet(objname, OBJPROP_STYLE, STYLE_SOLID);

         ObjectSet(objname, OBJPROP_WIDTH, 0);

         ObjectSetText(objname, ShortestTime(time1 + toUTC));

         objname = TimeToStr(time2 + toUTC, TIME_DATE | TIME_MINUTES) + " UTC ";

         ObjectCreate(objname, OBJ_VLINE, win, 0, 0);

         ObjectSet(objname, OBJPROP_TIME1, time2 + 220);

         ObjectSet(objname, OBJPROP_COLOR, -1);

         ObjectSet(objname, OBJPROP_BACK, true);

         ObjectSet(objname, OBJPROP_STYLE, STYLE_SOLID);

         ObjectSet(objname, OBJPROP_WIDTH, 0);

         ObjectSetText(objname, ShortestTime(time2 + toUTC));

      }

   }  

}

void PlaceImportantPointsUTC(datetime UTC, string text, string description)

{

   if (SleepMode)

      return;

   datetime time = UTCToLocalTime(UTC, Broker_standard_time_zone, Broker_DST_start, Broker_DST_end);

   string search = TimeToStr(UTC, TIME_DATE | TIME_MINUTES) + " UTC ";

   string objname = "";

   // Ïîèñê óæå ðàçìåùåííîé ïî ýòîìó âðåìåíè ìåòêè:

   int obj_total = ObjectsTotal();

   for(int obj = obj_total - 1; obj >= 0; obj--)

   { 

      if (StringFind(ObjectName(obj), search) >= 0)

      {

         objname = ObjectName(obj);

         break;

      }

   }

   // Åñëè òåêñò âõîäèò â íàèìåíîâàíèå îáúåêòà, ïðîñòî äîáàâëÿåì åãî:

   if (objname == search || objname == "")

   {

      if (objname != "")

         ObjectDelete(objname);

      objname = StringSubstr(search + text, 0, 63);

   }

   else if (StringLen(objname) + StringLen(text) < 62)

   {

      ObjectDelete(objname);

      objname = StringSubstr(objname + ", " + text, 0, 63);

   }

   // Òåêñò íå âõîäèò, íåîáõîäèìî äîáàâèòü åù¸ îäíó ëèíèþ:

   else

   {

      datetime newtime = time + Period()*60;

      string newobjname = StringSubstr(TimeToStr(UTC + Period()*60, TIME_DATE | TIME_MINUTES) + " UTC " + text, 0, 63);

      if (!BriefModeOn)

      {

         ObjectCreate(newobjname, OBJ_VLINE, win, 0, 0);

         ObjectSet(newobjname, OBJPROP_TIME1, newtime);

         ObjectSet(newobjname, OBJPROP_COLOR, DarkGray);

         ObjectSet(newobjname, OBJPROP_BACK, false);

         ObjectSet(newobjname, OBJPROP_STYLE, STYLE_DOT);

         ObjectSet(newobjname, OBJPROP_WIDTH, 1);

         ObjectSetText(newobjname, "");

      }

   }

   if (!BriefModeOn)

   {

      ObjectCreate(objname, OBJ_VLINE, win, 0, 0);

      ObjectSet(objname, OBJPROP_TIME1, time);

      ObjectSet(objname, OBJPROP_COLOR, DarkGray);

      ObjectSet(objname, OBJPROP_BACK, false);

      ObjectSet(objname, OBJPROP_STYLE, STYLE_DOT);

      ObjectSet(objname, OBJPROP_WIDTH, 1);

      ObjectSetText(objname, ShortTime(UTC));

   }

  

   string markname = StringSetChar(objname, StringFind(objname, " UTC "), 95);

   int barshift = iBarShift(NULL, 0, time);

   low = MathMin(MathMin(Low[barshift], Low[barshift + 1]), Low[barshift - 1]);

   if (low < 0.1)

      low = Bid;

  

   if (ObjectFind(search) < 0)

   {

      ObjectCreate(search, OBJ_ARROW, 0, time, low - 8*Point);

      string settext = description;

   }

   else

      settext = ObjectDescription(search) + ", " + description;

   ObjectSet(search, OBJPROP_ARROWCODE, 191);

   ObjectSet(search, OBJPROP_BACK, true);

   ObjectSet(search, OBJPROP_COLOR, Gray);

   ObjectSetText(search, settext);

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//

//    ÏÐÎÖÅÄÓÐÛ È ÔÓÍÊÖÈÈ

//

bool EmptyString(string str)

{

   return(StringLen(StringTrimRight(str)) == 0);

}

int FragmentsTotal(string text)

{

   int strlen = StringLen(text);

   int total = 0;

   for(int i = 0; i < strlen; i++)

   if (StringFind(";,|/", StringSubstr(text, i, 1)) >= 0)

      total++;

   return(total+1);

}

string GetFragment(string text, int number)

{

   int start = 0;

   int strlen = StringLen(text);

  

   if (number != 0)

   {

     

      int curnumber = 0;

      for(int i = 0; i < strlen; i++)

         if (StringFind(";,|/", StringSubstr(text, i, 1)) >= 0)

         {

            curnumber++;

            if (curnumber >= number)

            {

               start = i+1;

               break;

            }

         }

   }

   int end = start;

   while(end < strlen && StringFind(";,|/", StringSubstr(text, end, 1)) < 0)

      end++;

   return(StringSubstr(text, start, end-start));

}

void CopySeries(datetime& array[], int MODE, string SYMBOL, int PERIOD)

{

   ArrayCopySeries(array, MODE, SYMBOL, PERIOD);

   int lasterror = GetLastError();

   if (lasterror == 4066) // ERR_HISTORY_WILL_UPDATED

   {

      int attempt = 0;

      while(lasterror == 4066 && attempt < 10)

      {

         Sleep(5000);

         ArrayCopySeries(array, MODE, SYMBOL, PERIOD);

         lasterror = GetLastError();

      }

   }

}

void OHLC(datetime fromtime, datetime totime)

{

   int barshiftfrom = iBarShift(NULL, PERIOD_H1, fromtime);

   int barshiftto = iBarShift(NULL, PERIOD_H1, totime-1);

   int highestbarshift = iHighest(NULL, PERIOD_H1, MODE_HIGH, barshiftfrom - barshiftto + 1, barshiftto);

   high = iHigh(NULL, PERIOD_H1, highestbarshift);

   int lowestbarshift = iLowest(NULL, PERIOD_H1, MODE_LOW, barshiftfrom - barshiftto + 1, barshiftto);

   low = iLow(NULL, PERIOD_H1, lowestbarshift);

}

datetime TimeTableToUTC(datetime date, datetime time, datetime DSTStarts, datetime DSTEnds)

{

   datetime UTC = StrToTime(TimeToStr(date, TIME_DATE) + " " + TimeHour(time) + ":" + TimeMinute(time) + ":" + TimeSeconds(time));

   if (DSTStarts <= DSTEnds)

   {

      if (UTC >= DSTStarts && UTC <= DSTEnds)

         UTC -= 3600;

   }

   else

   {

      if (!(UTC > DSTEnds && UTC < DSTStarts))

         UTC -= 3600;

   }

   return(UTC);

}

datetime LocalTimeToUTC(datetime time, int TimeZone, datetime DSTStarts, datetime DSTEnds)

{

   datetime UTC = time - TimeZone*3600;

  

   datetime timeyear = StrToTime("01.01." + TimeYear(UTC));

   datetime dstyear = StrToTime("01.01." + TimeYear(DSTStarts));

   datetime dststart = timeyear + DSTStarts - dstyear;

   datetime dstend = timeyear + DSTEnds - dstyear;

  

   if (DSTStarts <= DSTEnds && DSTStarts != 0)

   {

      if (UTC >= dststart && UTC <= dstend)

         UTC -= 3600;

   }

   else if (DSTStarts >= DSTEnds && DSTEnds != 0)

   {

      datetime endofyear = StrToTime("31.12." + TimeYear(dststart));

      if ((UTC >= timeyear && UTC <= dstend)

      || (UTC >= dststart && UTC <= endofyear))

         UTC -= 3600;

   }

   return(UTC);

}

datetime UTCToLocalTime(datetime UTC, int TimeZone, datetime DSTStarts, datetime DSTEnds)

{

  

   datetime timeyear = StrToTime("01.01." + TimeYear(UTC));

   datetime dstyear = StrToTime("01.01." + TimeYear(DSTStarts));

   datetime dststart = timeyear + DSTStarts - dstyear;

   datetime dstend = timeyear + DSTEnds - dstyear;

  

   if (DSTStarts <= DSTEnds && DSTStarts != 0)

   {

      if (UTC >= dststart && UTC <= dstend)

         UTC += 3600;

   }

   else if (DSTStarts >= DSTEnds && DSTEnds != 0)

   {

      datetime endofyear = StrToTime("31.12." + TimeYear(dststart));

     

      if ((UTC >= timeyear && UTC <= dstend)

      || (UTC >= dststart && UTC <= endofyear))

         UTC += 3600;

   }

   return(UTC + TimeZone*3600);

}

string ShortTime(datetime time)

{

   string short = TimeToStr(time, TIME_MINUTES);

   if (StringSubstr(short, 0, 1) == "0")

      return(StringSubstr(short, 1));

   else

      return(short);

}

string ShortestTime(datetime time)

{

   if (TimeMinute(time) == 0)

   {

      string short = "";

      short = TimeHour(time);

   }

   else

   {

      short = TimeToStr(time, TIME_MINUTES);

      if (StringSubstr(short, 0, 1) == "0")

         short = StringSubstr(short, 1);

   }

  

   return(short);

}