Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

AccurateTimer - библиотека для MetaTrader 5

Просмотров:
2260
Рейтинг:
(25)
Опубликован:
2018.02.02 12:07
Обновлен:
2018.02.27 14:04
\MQL5\Experts\fxsaber\AccurateTimer\ \MQL5\Include\
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Штатный таймер в 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 ZeroLagMACD

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

VMA VMA

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

TimeEA TimeEA

Простой советник. Открывает позицию заданного типа в заданное в настройках время. Закрывает ее точно так же - по времени, указанному в настройках.

RndTrade RndTrade

Открытие позиций случайным образом через определенный интервал времени.