Is it possible to know current UTC time inside of mql4?

 

thanks

 
I would like to know that too.
 
 
Here it:
//+------------------------------------------------------------------+
//|                                                        Clock.mq4 |
//|                                                           Jerome |
//|                                                4xCoder@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Jerome"
#property link      "4xCoder@gmail.com"
 
#import "kernel32.dll"
void GetLocalTime(int& TimeArray[]);
void GetSystemTime(int& TimeArray[]);
int  GetTimeZoneInformation(int& TZInfoArray[]);
#import
 
//------------------------------------------------------------------
// Instructions
//    This Version requires Allow DLL Imports be set in Common Tab when you add this to a chart.
//    You can also enable this by default in the Options>Expert Advisors Tab, but you may want
//    to turn off "Confirm DLL Function Calls"
//
//    ShowLocal - Set to tru to show your local time zone
//    corner    - 0 = top left, 1 = top right, 2 = bottom left, 3 = bottom right
//    topOff    - pixels from top to show the clock
//    labelColor- Color of label
//    clockColor- Color of clock
//    show12HourTime - true show 12 hour time, false, show 24 hour time
//
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
 
 
//---- input parameters
extern bool         ShowLocal=false;
extern int          corner=1;
extern int          topOff=120;
extern color        labelColor=Gray;
extern color        clockColor=White;
extern bool         show12HourTime=false;
extern bool           ShowTokyo=true;
extern bool           ShowLondon=true;
extern bool           ShowNewYork=true;
extern bool           ShowGMT=true;
 
//---- buffers
double ExtMapBuffer1[];
int LondonTZ = 0;
int TokyoTZ = 9;
int NewYorkTZ = -5;
 
string TimeToString( datetime when ) {
   if ( !show12HourTime )
      return (TimeToStr( when, TIME_MINUTES ));
      
   int hour = TimeHour( when );
   int minute = TimeMinute( when );
   
   string ampm = " AM";
   
   string timeStr;
   if ( hour >= 12 ) {
      hour = hour - 12;
      ampm = " PM";
   }
      
   if ( hour == 0 )
      hour = 12;
   timeStr = DoubleToStr( hour, 0 ) + ":";
   if ( minute < 10 )
      timeStr = timeStr + "0";
   timeStr = timeStr + DoubleToStr( minute, 0 );
   timeStr = timeStr + ampm;
   
   return (timeStr);
}
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  if ( !IsDllsAllowed() ) {
      Alert( "Clock V1_2: DLLs are disabled.  To enable tick the checkbox in the Common Tab of indicator" );
      return;
  }
   int    counted_bars=IndicatorCounted();
//----
      
   int    TimeArray[4];
   int    TZInfoArray[43];
   int    nYear,nMonth,nDay,nHour,nMin,nSec,nMilliSec;
   string sMilliSec;
   
   GetLocalTime(TimeArray);
//---- parse date and time from array
   nYear=TimeArray[0]&0x0000FFFF;
   nMonth=TimeArray[0]>>16;
   nDay=TimeArray[1]>>16;
   nHour=TimeArray[2]&0x0000FFFF;
   nMin=TimeArray[2]>>16;
   nSec=TimeArray[3]&0x0000FFFF;
   nMilliSec=TimeArray[3]>>16;
   string LocalTimeS = FormatDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
   datetime localTime = StrToTime( LocalTimeS );
 
   int gmt_shift=0;
   int dst=GetTimeZoneInformation(TZInfoArray);
   if(dst!=0) gmt_shift=TZInfoArray[0];
   //Print("Difference between your local time and GMT is: ",gmt_shift," minutes");
   if(dst==2) gmt_shift+=TZInfoArray[42];
   
 
   datetime brokerTime = CurTime();
   datetime GMT = localTime + gmt_shift * 60;
   datetime london = GMT + (LondonTZ + (dst - 1)) * 3600;
   datetime tokyo = GMT + (TokyoTZ) * 3600;
   datetime newyork = GMT + (NewYorkTZ + (dst - 1)) * 3600;
   
   //Print( brokerTime, " ", GMT, " ", local, " ", london, " ", tokyo, " ", newyork  );
   string GMTs = TimeToString( GMT );
   string locals = TimeToString( localTime  );
   string londons = TimeToString( london  );
   string tokyos = TimeToString( tokyo  );
   string newyorks = TimeToString( newyork  );
   string brokers = TimeToString( CurTime() );
   string bars = TimeToStr( CurTime() - Time[0], TIME_MINUTES );
   
   if ( ShowLocal ) {
      ObjectSetText( "locl", "Local:", 10, "Arial", labelColor );
      ObjectSetText( "loct", locals, 10, "Arial", clockColor );
   }
   if(ShowGMT)
   {
       ObjectSetText( "gmtl", "GMT", 10, "Arial", labelColor );
       ObjectSetText( "gmtt", GMTs, 10, "Arial", clockColor );
   }
   if(ShowNewYork)
   {
       ObjectSetText( "nyl", "New York:", 10, "Arial", labelColor );
       ObjectSetText( "nyt", newyorks, 10, "Arial", clockColor );
   }
   if(ShowLondon)
   {
       ObjectSetText( "lonl", "London:", 10, "Arial", labelColor );
       ObjectSetText( "lont", londons, 10, "Arial", clockColor );
   }
   if(ShowTokyo)
   {
       ObjectSetText( "tokl", "Tokyo:", 10, "Arial", labelColor );
       ObjectSetText( "tokt", tokyos, 10, "Arial", clockColor );
   }
   ObjectSetText( "brol", "Broker:", 10, "Arial", labelColor );
   ObjectSetText( "brot", brokers, 10, "Arial", clockColor );
   ObjectSetText( "barl", "Bar:", 10, "Arial", labelColor );
   ObjectSetText( "bart", bars, 10, "Arial", clockColor );
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int ObjectMakeLabel( string n, int xoff, int yoff ) {
   ObjectCreate( n, OBJ_LABEL, 0, 0, 0 );
   ObjectSet( n, OBJPROP_CORNER, corner );
   ObjectSet( n, OBJPROP_XDISTANCE, xoff );
   ObjectSet( n, OBJPROP_YDISTANCE, yoff );
   ObjectSet( n, OBJPROP_BACK, true );
}
 
string FormatDateTime(int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec)
  {
   string sMonth,sDay,sHour,sMin,sSec;
//----
   sMonth=100+nMonth;
   sMonth=StringSubstr(sMonth,1);
   sDay=100+nDay;
   sDay=StringSubstr(sDay,1);
   sHour=100+nHour;
   sHour=StringSubstr(sHour,1);
   sMin=100+nMin;
   sMin=StringSubstr(sMin,1);
   sSec=100+nSec;
   sSec=StringSubstr(sSec,1);
//----
   return(StringConcatenate(nYear,".",sMonth,".",sDay," ",sHour,":",sMin,":",sSec));
  }
 
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   
   int top=topOff;
   int left = 90;
   if ( show12HourTime )
      left = 102;
   if ( ShowLocal ) {
      ObjectMakeLabel( "locl", left, top );
      ObjectMakeLabel( "loct", 45, top );
   }
   int offset=15;
   if(ShowGMT)
   {
       ObjectMakeLabel( "gmtl", left, top-offset );
       ObjectMakeLabel( "gmtt", 45, top-offset );
       offset+=15;
   }
   if(ShowNewYork)
   {
       ObjectMakeLabel( "nyl", left, top-offset );
       ObjectMakeLabel( "nyt", 45, top-offset );
       offset+=15;
   }
   if(ShowLondon)
   {
       ObjectMakeLabel( "lonl", left, top-offset );
       ObjectMakeLabel( "lont", 45, top-offset );
       offset+=15;
   }
   if(ShowTokyo)
   {
       ObjectMakeLabel( "tokl", left, top-offset );
       ObjectMakeLabel( "tokt", 45, top-offset );
       offset+=15;
   }
   ObjectMakeLabel( "brol", left, top-offset );
   ObjectMakeLabel( "brot", 45, top-offset );
      offset+=15;
   ObjectMakeLabel( "barl", left, top-offset );
   ObjectMakeLabel( "bart", 45, top-offset );
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete( "locl" );
   ObjectDelete( "loct" );
   if(ShowNewYork)
   {
       ObjectDelete( "nyl" );
       ObjectDelete( "nyt" );
   }
   if(ShowGMT)
   {
       ObjectDelete( "gmtl" );
       ObjectDelete( "gmtt" );
   }
   if(ShowLondon)
   {
       ObjectDelete( "lonl" );
       ObjectDelete( "lont" );
   }
   if(ShowTokyo)
   {
       ObjectDelete( "tokl" );
       ObjectDelete( "tokt" );
   }
   ObjectDelete( "brol" );
   ObjectDelete( "brot" );
   ObjectDelete( "barl" );
   ObjectDelete( "bart" );
//----
   return(0);
  }



See also Specification
 

There is a mistake on this line:

if(dst==2) gmt_shift+=TZInfoArray[42];

In some timezones it would result in GMT 0 result like it did in mine timezone. (I am in GMT +8). So the corrected code should be:

if(dst==2 || dst==0) gmt_shift+=TZInfoArray[42];

Julius

 

Hi

Does this code work well when starting and finishing DST periods?

Thanks

 
extern bool     Srvr.To.UTC.Auto                = true;
extern int      Srvr.To.UTC.Hours               =   0;
int init(){
    if (Srvr.To.UTC.Auto && IsTesting()){   Srvr.To.UTC.Auto = false;
        Alert("Warning, use manual GMToffsets only on backtest.",
            " Automatic GMT offset calculation works only on live/demo trading",
            " and should be set as FALSE for backtests - strategy testing.");
    }
}
//+------------------------------------------------------------------+
//| GMT Time                                                         |
//+------------------------------------------------------------------+
datetime TimeGMT(){ // TimeCurrent to GMT
    datetime    serverTime = TimeCurrent();
    if (Srvr.To.UTC.Auto)
        Srvr.To.UTC.Hours = (LocalTimeGMT() - serverTime +1800)/3600;
    return (serverTime + Srvr.To.UTC.Hours*3600);
}
#import "kernel32.dll"
int  GetTimeZoneInformation(int& TZInfoArray[]);
#import
datetime LocalTimeGMT(){    // TimeLocal to GMT Unk: forum.mql4.com/12057#522900
    int TZInfoArray[43];                                #define UNKNOWN  0
    int tz  = GetTimeZoneInformation(TZInfoArray);      #define DAYLIGHT 2
    int GMTshift    = TZInfoArray[0];   /* GetTimeZoneInformation will return
                                         * the right Bias even when it returns
                                         * UNKNOWN==0 */
    if(tz == DAYLIGHT || tz == UNKNOWN) GMTshift+=TZInfoArray[42];
    return (TimeLocal() + GMTshift*60);
}
 
desert:

Does this code work well when starting and finishing DST periods?

Yes or no, depending on how strict your standards are. All the code above assumes that the computer's timezone settings are accurate. If you're one of the people who's adjusted their computer clock to the "correct" time without adjusting the timezone, then all the code above will break because it relies on the information from GetTimeZoneInformation() being accurate. It's notable that many commercial EAs do not make an assumption that any local settings are correct - for an example, see the link below.

The code timestamped 2008.03.26 10:46 appears to be very dangerous because it appears to assume that London and New York move to and from DST on the same dates which, off the top of my head, simply isn't correct.

The code timestamped 2011.10.13 00:29 is better, because it appears to adjust the broker's timestamp based on the GMT offset currently in effect on the local machine. As above, this will fail if the computer's timezone settings are incorrect, and it's up to you whether you consider that important. It will also potentially start failing if an MT4 broker ever launches in India, using servers set to local time, because "(LocalTimeGMT() - serverTime +1800)/3600" appears to assume that a timezone will be offset by 60 minutes from GMT whereas India operates at +05:30.

There's been substantial previous discussion of this subject, addressing all the above points, in topics such as https://www.mql5.com/en/forum/124979

 

You can find at this page http://www.forexfactory.com/showthread.php?t=109305 a nice clock indicator Look to the code of that indicator and you find another way to get GMT time. Also you see ways to find DST times in other parts of the world. Governments can change every year the dates of starting and ending DST time So this indicator is updated time by time.....

 
William Roeder #:
Thank you for this solution. UTC time = TimeGMT() - LocalTimeGMT()? is this correct?.  is the statement of JC ".......India operates at +05:30." true?
 
ArchRaphael #: Thank you for this solution. UTC time = TimeGMT() - LocalTimeGMT()? is this correct?.  is the statement of JC ".......India operates at +05:30." true?

No!

UTC time = TimeGMT()

UTC and GMT have different concepts and meanings, but they share the same time. They are essentially the same thing in practice, but different in theory.

GMT = UTC + 0

UTC & GMT – Same Difference?
UTC & GMT – Same Difference?
  • www.timeanddate.com
Although GMT and UTC share the same current time in practice, there is a basic difference between the two: GMT is a time zone officially used in some European and African countries. The time can be displayed using both the 24-hour format (0 - 24) or the 12-hour format (1 - 12 am/pm). UTC is not a time zone , but a time standard that is the...