//+------------------------------------------------------------------+ //| 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); }
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.....
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
- www.timeanddate.com
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
thanks