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

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

Просмотров:
2229
Рейтинг:
(22)
Опубликован:
2020.10.02 20:54
Обновлен:
2020.11.25 02:10
\MQL5\Indicators\ \MQL5\Include\
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Данная библиотека Вам пригодится, когда Вам необходимы несколько таймеров с независимой обработкой и неконфликтующие между собой.

Для работы с данной библиотекой важно запомнить следующие правила:

  • В теле вашей программы не должно быть функции OnTimer, т.к. эта функция уже присутствует в файле Timer.mhq
  • Не надо создавать никаких экземпляров класса CTimer, т.к. один экземпляр уже создан с именем "timers". Этого будет достаточно.
  • Время периодичности каждого таймера задается в миллисекундах, а не в секундах.
  • Каждому таймеру задается собственная функция обработки.
  • Одна функция обработки событий таймера может принадлежать разным таймерам с разной периодичностью.
  • Если у вас до использования этой библиотеки была уже настроенный таймер и Вы его хотите сохранить в виде одного из таймеров, то :

1. Переименуйте функцию OnTimer , например, в OnTimer1
2. Функцию EventSetMillisecondTimer или EventSetTimer замените на:
                    -  EventSetMillisecondTimer(500);  ->  timers.NewTimer(500,  OnTimer1);
                    -   EventSetTimer(2);  ->  timers.NewTimer(2000,  OnTimer1);    // 2 сек = 2000 микросекунд
3. Функцию EventKillTimer(); замените на timers.KillTimer(OnTimer1);


Если Вам нужны несколько независимых безконфликтных таймеров, то необходимо сделать следующее:

1. Включите в свою программу класс CTimer:

#include <Timer.mqh> 

2. Создайте функции-обработчики необходимых таймеров формата void AnyNameFunction() {....}
например с такими именами(функции OnTimer не должно быть):

void Timer1() {x1++;} // функция для таймера например 500 мс
void Timer2() {x2++;} // функция для таймера например 1000 мс
void Timer3() {x3++;} // функция для таймера например 2000 мс

3. Когда вам необходимо создать и запустить таймер, сделайте так из любого места:

timers.NewTimer(500,  Timer1); // создаем новый таймер с периодом обновления 500   миллисекунд и функцией-обраточником Timer1()
timers.NewTimer(1000, Timer2); // создаем новый таймер с периодом обновления 1000  миллисекунд и функцией-обраточником Timer2()
timers.NewTimer(2000, Timer3); // создаем новый таймер с периодом обновления 2000  миллисекунд и функцией-обраточником Timer3()

4. Когда вам таймер больше не нужен, убейте его:

timers.KillTimer(Timer1);      // убивает все таймеры с функцией обработчиком Timer1
или
timers.KillTimer(500, Timer1); // если существует несколько таймеров с функцией Timer1, но с разными периодами, и требуется удалить только таймер определенного периода (в данном случае 500)

Вы можете узнать сколько запущено таймеров в данный момент с помощью функции 

timers.GetN()

Все доступные функции:

   void KillTimer(TFunc fun);                   // Удаляет все таймеры с функцией обработки fun
   void KillTimer(int milliseconds, TFunc fun); // Удаляет таймер с функцией обработки fun и периодичностью milliseconds
   void NewTimer(int milliseconds, TFunc fun);  // Создает таймер с периодичностью milliseconds и фукцией обработки fun
   uint GetN() {return N;};                     // Получаем текущее количество работающих таймеров
   void NewPeriod(int old_milliseconds, TFunc fun, int new_milliseconds); // Меняет периодичность данного таймера. Это позволяет 
                                                // создавать таймеры с динамическим периодом обращения, или автоподстройкой.
   int  GetLost(int milliseconds, TFunc fun);   // Получаем количество пропущенных событий таймера для контроля стабильности работы.
                                                // Если ноль, то пропусков нет. Если -1, то не найден такой таймер.



Пример тестового кода:

#property indicator_chart_window
#include <Semko\Timer.mqh> 


class CTestTimer { // простой класс для теста с внутренним обработчиком таймера 
 private:
   int x;
 public: 
   int GetX()   {return x;};
   CTestTimer() {x=0;};
  ~CTestTimer() {};
   void Timer() {x++;};
};


int x1=0;
int x2=0;
int x3=0;
CTestTimer X; // пример, если обработчик таймера - это метод класса.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit() {
   timers.NewTimer(500, Timer1);   // создаем новый таймер с периодом обновления 500   миллисекунд и функцией-обраточником Timer1()
   timers.NewTimer(700, Timer2);   // создаем новый таймер с периодом обновления 700   миллисекунд и функцией-обраточником Timer2()
   timers.NewTimer(900, Timer3);   // создаем новый таймер с периодом обновления 900   миллисекунд и функцией-обраточником Timer3()
   timers.NewTimer(1100,Timer4);   // создаем новый таймер с периодом обновления 1100  миллисекунд и функцией-обраточником Timer4(), в которой запускаем обработчик класса 
   timers.NewTimer(100, Timer5);   // создаем новый таймер с периодом обновления 100   миллисекунд и функцией-обраточником Timer5()
   return(INIT_SUCCEEDED); 
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   Comment("");
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return(rates_total);
}
//+------------------------------------------------------------------+
void Timer1() {  // данная функция вызывается каждые 500 миллисекунд
   x1++;
   if (x1==10) timers.KillTimer(Timer1); // удаляем этот таймер
}
//+------------------------------------------------------------------+
void Timer2() {  // данная функция вызывается каждые 700 миллисекунд
   x2++;
   if (x2==10) timers.KillTimer(Timer2); // удаляем этот таймер
}
//+------------------------------------------------------------------+
void Timer3() {  // данная функция вызывается каждые 900 миллисекунд
   x3++;
   if (x3==10) timers.KillTimer(Timer3); // удаляем этот таймер
}
//+------------------------------------------------------------------+
void Timer4() {  // данная функция вызывается каждые 1100 миллисекунд
   X.Timer();
   if (X.GetX()==10) timers.KillTimer(Timer4); // удаляем этот таймер
}
//+------------------------------------------------------------------+
void Timer5() {  // данная функция вызывается каждые 100 миллисекунд
   if (X.GetX()==10) timers.KillTimer(Timer5); // удаляем этот таймер
   Comment("x1=" +string(x1)+"\nx2="+string(x2)+"\nx3="+string(x3)+"\nx4="+string(X.GetX())+"\nВсего таймеров - "+string(timers.GetN()));
}

Важно помнить, что хоть таймер и задается в миллисекундах, минимальный шаг таймера это 15.625 миллисекунды (1/64 секунды). 
Т.е. если Вы задали таймер 1 миллисекунду, реально событие таймера будет происходить не 1000 раз в секунду, а 64 раза в секунду.

Exponential Weighted Moving Average Exponential Weighted Moving Average

Exponential Weighted Moving Average - экспоненциально взвешенная скользящая средняя (EWMA).

Opened Positions Opened Positions

Утилита: суммарная информация по позициям

Area Chart Area Chart

Индикатор меняет вид графика

Candle closed at the High Candle closed at the High

Анализируем цену закрытия бара #1