#property library #include #include class TimeZones: public CObject{ protected: string dt_s; int len; string dt_string; datetime tC, tGMT, tNY, tLon, tFfm, tMosc, tSyd, tTok; datetime tz_time; string tz_date; datetime time_start; datetime time_end; bool is_time; datetime tGIVEN; datetime tREQ; datetime tzt; datetime tz_req; double ny_daily_close_protected(string symbol, int shift_days, bool print_data=false); double required_close; public: string get_date_string_from_datetime(datetime dt); datetime get_timezone_time(string time_zone, bool print_time); datetime timezone_conversions(string time_zone_known, datetime time_given, string time_zone_required); double ny_daily_close(string symbol, int shift_days, bool print_data=false); }; string TimeZones::get_date_string_from_datetime(datetime dt){ dt_s = TimeToString(dt); len = StringLen(dt_s); dt_string = StringSubstr(dt_s, 0, len-5); return dt_string; } // bool TimeZones::trading_window(string time_zone, string start_time, string end_time){ // // https://www.youtube.com/watch?v=V_qh7sTbl80 // // e.g: // // bool trade_window = trading_window(x,x,x); // // bool long_in = trade_window // // && close < ma[0]; // tz_time = get_timezone_time(time_zone, false); // Print(tz_time); // // Get the current date for the required time zone: // tz_date = get_date_string_from_datetime(tz_time); // // Define the start and end times on correct date: // time_start = StringToTime(tz_date + start_time); // time_end = StringToTime(tz_date + end_time); // if(time_start>time_end){ // time_start = time_start - PeriodSeconds(PERIOD_D1); // } // is_time = tz_time >= time_start && tz_time < time_end; // return is_time; // } datetime TimeZones::get_timezone_time(string time_zone, bool print_time){ // https://www.mql5.com/en/code/45287 // https://www.mql5.com/en/articles/9926 // https://www.mql5.com/en/articles/9929 checkTimeOffset(TimeCurrent()); // check changes of DST // cto(); tC = TimeCurrent(); tGMT = TimeCurrent() + OffsetBroker.actOffset; // GMT tNY = tGMT - (NYShift+DST_USD); // time in New York (EST) tLon = tGMT - (LondonShift+DST_EUR); // time in London tFfm = tGMT - (FfmShift+DST_EUR); // time in Frankfurt tSyd = tGMT - (SidneyShift+DST_AUD); // time in Sidney tMosc = tGMT - (MoskwaShift+DST_RUS); // time in Moscow tTok = tGMT - (TokyoShift); // time in Tokyo - no DST if(print_time==true){ Print("----------------------------------"); Print("Broker: ", tC); Print("GMT: ", tGMT); Print("time in New York: ", tNY); Print("time in London: ", tLon); Print("time in Frankfurt: ", tFfm); Print("time in Sidney: ", tSyd); Print("time in Moscow: ", tMosc); Print("time in Tokyo: ", tTok); } if(time_zone=="NY"){return tNY;} if(time_zone=="Lon"){return tLon;} if(time_zone=="Ffm"){return tFfm;} if(time_zone=="Syd"){return tSyd;} if(time_zone=="Mosc"){return tMosc;} if(time_zone=="Tok"){return tTok;} return NULL; } datetime TimeZones::timezone_conversions(string time_zone_known, datetime time_given, string time_zone_required){ // https://www.mql5.com/en/code/45287 // https://www.mql5.com/en/articles/9926 // https://www.mql5.com/en/articles/9929 tGIVEN = time_given; //StringToTime(time_given); checkTimeOffset(tGIVEN); // check changes of DST // Get GMT: if(time_zone_known=="GMT" ){tGMT = tGIVEN;} if(time_zone_known=="Broker" ){tGMT = tGIVEN + OffsetBroker.actOffset;} if(time_zone_known=="NY" ){tGMT = tGIVEN + (NYShift+DST_USD);} if(time_zone_known=="Lon" ){tGMT = tGIVEN + (LondonShift+DST_EUR);} if(time_zone_known=="Ffm" ){tGMT = tGIVEN + (FfmShift+DST_EUR);} if(time_zone_known=="Syd" ){tGMT = tGIVEN + (SidneyShift+DST_AUD);} if(time_zone_known=="Mosc" ){tGMT = tGIVEN + (MoskwaShift+DST_RUS);} if(time_zone_known=="Tok" ){tGMT = tGIVEN + (TokyoShift);} // define the required time: tREQ = NULL; if(time_zone_required=="GMT" ){tREQ = tGMT;} if(time_zone_required=="Broker" ){tREQ = tGMT - OffsetBroker.actOffset;} if(time_zone_required=="NY" ){tREQ = tGMT - (NYShift+DST_USD);} if(time_zone_required=="Lon" ){tREQ = tGMT - (LondonShift+DST_EUR);} if(time_zone_required=="Ffm" ){tREQ = tGMT - (FfmShift+DST_EUR);} if(time_zone_required=="Syd" ){tREQ = tGMT - (SidneyShift+DST_AUD) ;} if(time_zone_required=="Mosc" ){tREQ = tGMT - (MoskwaShift+DST_RUS);} if(time_zone_required=="Tok" ){tREQ = tGMT - (TokyoShift);} return tREQ; } // Calculte NY close time: double TimeZones::ny_daily_close(string symbol, int shift_days, bool print_data=false){ required_close = ny_daily_close_protected(symbol, shift_days, print_data); return required_close; } double TimeZones::ny_daily_close_protected(string symbol, int shift_days, bool print_data=false){ // Get the brokers times for when NY openend today and tomorrow: datetime time_5pm = iTime(symbol, PERIOD_D1 , 0) - (PeriodSeconds(PERIOD_H1) * 7); datetime ny_close_in_brokers_time = timezone_conversions("NY", time_5pm, "Broker"); datetime ny_close_time = ny_close_in_brokers_time + PeriodSeconds(PERIOD_D1); // ny close tomorrow if(TimeCurrent()