Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 2459
- Рейтинг:
- Опубликован:
- 2018.02.02 12:07
- Обновлен:
- 2018.02.27 14:04
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Штатный таймер в MetaTrader 4/5 основан на вызове системного таймера, и поэтому может работать с погрешностью. Чтобы в этом убедиться, достаточно запустить простой советник:
input int Timer = 1000; // Через сколько миллисекунд срабатывает таймер #define TOSTRING(A) #A + " = " + (string)(A) + " ms.\n" const bool Init = EventSetMillisecondTimer(Timer); // Выводит в комментарий чарта текущую ошибку таймера и ее среднюю величину 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++; }
В комментарии чарта (левый-верхний угол) он показывает, как растет лаг таймера:
На скриншоте видно, что всего за минуту работы секундный таймер создает лаг больше секунды. И со временем он только растет!
Данная библиотека позволяет повысить точность штатного таймера любого советника/индикатора. Для этого нужно в начале кода прописать только одну строку:
#include <AccurateTimer.mqh> // Повышение точности штатного таймера
После такого действия в вышеприведенном советнике можно наблюдать следующую картину:
После десятка минут работы среднее отклонение от идеального (теоретического) таймера составляет ~1 мс, и ошибка не будет расти.
Иметь точный таймер, конечно, всегда хорошо. Но есть задачи, в которых без него просто не обойтись. Например, секундный таймер, синхронизированный со временем Торгового сервера.
Данная кросс-платформенная библиотека совместима со всеми советниками/индикаторами, где используется штатный таймер (OnTimer). Не влияет на скорость выполнения в тестере.
Повышайте точность уже готовых и новых программ всего одной строкой!
Frame-режим
Советники в режиме сбора фреймов результатов Оптимизации игнорируют следующие штатные события обычной работы советника: Init, Deinit, NewTick, Trade, TradeTransaction, BookEvent и Timer. Рабочим событием остается только ChartEvent.
Однако, данная библиотека может включить таймер и в этом режиме работы советника. Для этого перед вызовом библиотеки нужно прописать следующую строку:
#define ACCURATETIMER_FRAME_MODE // Делает рабочим таймер советников, работающих во Frame-режиме
Учитывайте, что в исходном советнике должен быть прописан OnChartEvent (даже пустой), и на OnTimer начинает распространяться соответствующая Frame-уязвимость.
Пример такого советника приложен
// Демонстрация работы таймера советника во Frame-режиме #define ACCURATETIMER_FRAME_MODE // Делает рабочим таймер советников, работающих во Frame-режиме #include <AccurateTimer.mqh> // Повышение точности штатного таймера sinput uint Range = 1; // Входной параметр для Оптимизации #define SETRANGE(A, START, STEP, END) ParameterSetRange(#A, true, A, START, STEP, END) void OnTesterInit() { SETRANGE(Range, 0, 1, Range); } void OnTesterDeinit() { EventSetTimer(1); } // В конце Оптимизации установили таймер // Учитывайте Frame-уязвимость! - https://www.mql5.com/ru/forum/170952/page71#comment_6626688 void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam ) {} void OnTimer() { static const bool IsFrame = MQLInfoInteger(MQL_FRAME_MODE); if (IsFrame) Print("Hello World!"); }

ZeroLagMACD- версия MACD, имеющая гораздо меньшую задержку по сравнению с классическим MACD.

VMA - динамическая MA от волатильности.