forked from airat77786/MQL5Book
88 lines
3.4 KiB
MQL5
88 lines
3.4 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| TimeCheck.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "..\..\Include\PRTF.mqh"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Server time exact approximation |
| |||
//| (keeps minutes and seconds in the shift) |
| |||
//+------------------------------------------------------------------+
| |||
datetime TimeTradeServerExact()
| |||
{
| |||
enum LOCATION
| |||
{
| |||
LOCAL,
| |||
SERVER,
| |||
};
| |||
static datetime now[2] = {};
| |||
static datetime then[2] = {};
| |||
static int shiftInHours = 0;
| |||
static long shiftInSeconds = 0;
| |||
// keep track of 2 last execution times: now and then
| |||
then[LOCAL] = now[LOCAL];
| |||
then[SERVER] = now[SERVER];
| |||
now[LOCAL] = TimeLocal();
| |||
now[SERVER] = TimeCurrent();
| |||
// during first call we don't have 2 time marks yet
| |||
if(then[LOCAL] == 0 && then[SERVER] == 0) return 0;
| |||
// when time marks differs equally on local and server computer
| |||
// and server time is not paused due to weekend/holidays,
| |||
// we can calculate the shift between them
| |||
if(now[LOCAL] - now[SERVER] == then[LOCAL] - then[SERVER] && now[SERVER] != then[SERVER])
| |||
{
| |||
shiftInSeconds = now[LOCAL] - now[SERVER];
| |||
shiftInHours = (int)MathRound(shiftInSeconds / 3600.0);
| |||
PrintFormat("Shift update: hours: %d; seconds: %lld", shiftInHours, shiftInSeconds);
| |||
}
| |||
// NB: built-in TimeTradeServer function calculates:
| |||
// TimeLocal() - shiftInHours * 3600
| |||
return (datetime)(TimeLocal() - shiftInSeconds);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
// infinite loop until user interrupt it
| |||
// to show all kinds of time
| |||
while(!IsStopped())
| |||
{
| |||
Print("\n");
| |||
PRTF(TimeLocal());
| |||
PRTF(TimeCurrent());
| |||
PRTF(TimeTradeServer());
| |||
PRTF(TimeTradeServerExact());
| |||
Sleep(1000);
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
example output
| |||
| |||
TimeLocal()=2021.09.02 16:03:34 / ok
| |||
TimeCurrent()=2021.09.02 15:59:39 / ok
| |||
TimeTradeServer()=2021.09.02 16:03:34 / ok
| |||
TimeTradeServerExact()=1970.01.01 00:00:00 / ok
| |||
TimeLocal()=2021.09.02 16:03:35 / ok
| |||
TimeCurrent()=2021.09.02 15:59:40 / ok
| |||
TimeTradeServer()=2021.09.02 16:03:35 / ok
| |||
Shift update: hours: 0; seconds: 235
| |||
TimeTradeServerExact()=2021.09.02 15:59:40 / ok
| |||
TimeLocal()=2021.09.02 16:03:36 / ok
| |||
TimeCurrent()=2021.09.02 15:59:41 / ok
| |||
TimeTradeServer()=2021.09.02 16:03:36 / ok
| |||
Shift update: hours: 0; seconds: 235
| |||
TimeTradeServerExact()=2021.09.02 15:59:41 / ok
| |||
TimeLocal()=2021.09.02 16:03:37 / ok
| |||
TimeCurrent()=2021.09.02 15:59:41 / ok
| |||
TimeTradeServer()=2021.09.02 16:03:37 / ok
| |||
TimeTradeServerExact()=2021.09.02 15:59:42 / ok
| |||
TimeLocal()=2021.09.02 16:03:38 / ok
| |||
TimeCurrent()=2021.09.02 15:59:43 / ok
| |||
TimeTradeServer()=2021.09.02 16:03:38 / ok
| |||
TimeTradeServerExact()=2021.09.02 15:59:43 / ok
| |||
*/
| |||
//+------------------------------------------------------------------+
|