The MetaTrader 4/5 standard timer is based on the system timer call and can therefore work inaccurately. We can check this by running the following simple Expert Advisor:
input int Timer = 1000; // The number of milliseconds for the timer to trigger #define TOSTRING(A) #A + " = " + (string)(A) + " ms.\n" const bool Init = EventSetMillisecondTimer(Timer); // Shows the current timer error and its average value as a comment on a chart void OnTimer() { static ulong StartTime = 0; static int Count = 0; static int Sum = 0; if (StartTime) { const int RunTime = (int)(GetMicrosecondCount() - StartTime) / 1000; const int Error = RunTime - Timer * Count; Sum += Error; Comment(TOSTRING(Timer) + TimeToString(RunTime / 1000, TIME_SECONDS) + "\n" + TOSTRING(Error) + TOSTRING((double)Sum / Count)); } else StartTime = GetMicrosecondCount(); Count++; }
In the chart comment (the upper left corner) it shows how the timer lag grows:

The screenshot shows that in just a minute, the second timer creates a lag of more than a second. Moreover this lag grows over time!
This library allows increasing the accuracy of the standard timer for any Expert Advisor/indicator. For this purpose, the following line should be added at the beginning of the code:
#include <AccurateTimer.mqh> // Increasing the accuracy of the standard timer
After that the following comment will be shown:

After ten minutes of operation, the average deviation from the ideal (theoretical) timer is ~1 ms, and the error will not grow.
It is always good to have an accurate timer. But for some tasks it is a must. For example, a second timer synchronized with the trade server time.
This cross-platform library is compatible with all Expert Advisors/indicators, which use the standard timer (OnTimer). It does not affect the execution speed in the strategy tester.
Increase the accuracy of your existing and new programs in just one line!