Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Multi Timer - библиотека для MetaTrader 5
- Просмотров:
- 2268
- Рейтинг:
- Опубликован:
- 2020.10.02 20:54
- Обновлен:
- 2020.11.25 02:10
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Данная библиотека Вам пригодится, когда Вам необходимы несколько таймеров с независимой обработкой и неконфликтующие между собой.
Для работы с данной библиотекой важно запомнить следующие правила:
- В теле вашей программы не должно быть функции 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 - экспоненциально взвешенная скользящая средняя (EWMA).
Opened PositionsУтилита: суммарная информация по позициям