forked from airat77786/MQL5Book
166 lines
6 KiB
MQL5
166 lines
6 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| MultipleTimers.mq5 |
| |||
//| Copyright © 2016-2021, Marketeer |
| |||
//| https://www.mql5.com/en/users/marketeer |
| |||
//| Multiple timers with publisher/subscriber design pattern |
| |||
//+------------------------------------------------------------------+
| |||
#property indicator_chart_window
| |||
#property indicator_buffers 0
| |||
#property indicator_plots 0
| |||
| |||
#include "..\..\Include\MultiTimer.mqh"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Enum to choose base (system) timer granularity |
| |||
//+------------------------------------------------------------------+
| |||
enum TIMER_TYPE
| |||
{
| |||
Seconds,
| |||
Milliseconds
| |||
};
| |||
| |||
input TIMER_TYPE TimerType = Seconds;
| |||
input int BaseTimerPeriod = 1;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Specific timer class |
| |||
//+------------------------------------------------------------------+
| |||
class MyCountableTimer: public CountableTimer
| |||
{
| |||
public:
| |||
MyCountableTimer(const int s, const uint r = UINT_MAX):
| |||
CountableTimer(s, r) { }
| |||
| |||
virtual void notify() override
| |||
{
| |||
Print(__FUNCSIG__, multiplier, " ", count);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Another specfic timer class (created in suspended state) |
| |||
//+------------------------------------------------------------------+
| |||
class MySuspendedTimer: public CountableTimer
| |||
{
| |||
public:
| |||
MySuspendedTimer(const int s, const uint r = UINT_MAX):
| |||
CountableTimer(s, r, true) { }
| |||
| |||
virtual void notify() override
| |||
{
| |||
Print(__FUNCSIG__, multiplier, " ", count);
| |||
if(count == repeat - 1) // last time execution
| |||
{
| |||
Print("Forcing all timers to stop");
| |||
EventKillTimer();
| |||
}
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Timer objects with different periods (bind during global init) |
| |||
//+------------------------------------------------------------------+
| |||
MySuspendedTimer st(1, 5);
| |||
MyCountableTimer t1(2);
| |||
MyCountableTimer t2(4);
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Single-handler-function-alike timer define for 5 base periods |
| |||
//+------------------------------------------------------------------+
| |||
bool OnTimerCustom(5)
| |||
{
| |||
Print(__FUNCSIG__);
| |||
st.start(); // resume suspended timer
| |||
return false; // stop this timer
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Single-handler-function-alike timer define for 3 base periods |
| |||
//+------------------------------------------------------------------+
| |||
bool OnTimerCustom(3)
| |||
{
| |||
Print(__FUNCSIG__);
| |||
return true; // keep this timer running
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Custom indicator initialization function |
| |||
//+------------------------------------------------------------------+
| |||
void OnInit()
| |||
{
| |||
Print(__FUNCSIG__, " ", BaseTimerPeriod, " ", EnumToString(TimerType));
| |||
if(TimerType == Seconds)
| |||
{
| |||
EventSetTimer(BaseTimerPeriod);
| |||
}
| |||
else
| |||
{
| |||
EventSetMillisecondTimer(BaseTimerPeriod);
| |||
}
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Default timer handler |
| |||
//+------------------------------------------------------------------+
| |||
void OnTimer()
| |||
{
| |||
// invoke MultiTimer method to check and fire specific timers when appropriate
| |||
MultiTimer::onTimer();
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Custom indicator iteration function (dummy) |
| |||
//+------------------------------------------------------------------+
| |||
int OnCalculate(const int rates_total,
| |||
const int prev_calculated,
| |||
const int begin,
| |||
const double &data[])
| |||
{
| |||
return 0;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
Example output (seconds):
| |||
| |||
17:08:45.174 void OnInit() 1 Seconds
| |||
17:08:47.202 void MyCountableTimer::notify()2 0
| |||
17:08:48.216 bool OnTimer3()
| |||
17:08:49.230 void MyCountableTimer::notify()2 1
| |||
17:08:49.230 void MyCountableTimer::notify()4 0
| |||
17:08:50.244 bool OnTimer5()
| |||
17:08:51.258 void MyCountableTimer::notify()2 2
| |||
17:08:51.258 bool OnTimer3()
| |||
17:08:51.258 void MySuspendedTimer::notify()1 0
| |||
17:08:52.272 void MySuspendedTimer::notify()1 1
| |||
17:08:53.286 void MyCountableTimer::notify()2 3
| |||
17:08:53.286 void MyCountableTimer::notify()4 1
| |||
17:08:53.286 void MySuspendedTimer::notify()1 2
| |||
17:08:54.300 bool OnTimer3()
| |||
17:08:54.300 void MySuspendedTimer::notify()1 3
| |||
17:08:55.314 void MyCountableTimer::notify()2 4
| |||
17:08:55.314 void MySuspendedTimer::notify()1 4
| |||
17:08:55.314 Forcing all timers to stop
| |||
| |||
Example output (milliseconds):
| |||
| |||
17:27:54.483 void OnInit() 1 Milliseconds
| |||
17:27:54.514 void MyCountableTimer::notify()2 0
| |||
17:27:54.545 bool OnTimer3()
| |||
17:27:54.561 void MyCountableTimer::notify()2 1
| |||
17:27:54.561 void MyCountableTimer::notify()4 0
| |||
17:27:54.577 bool OnTimer5()
| |||
17:27:54.608 void MyCountableTimer::notify()2 2
| |||
17:27:54.608 bool OnTimer3()
| |||
17:27:54.608 void MySuspendedTimer::notify()1 0
| |||
17:27:54.623 void MySuspendedTimer::notify()1 1
| |||
17:27:54.655 void MyCountableTimer::notify()2 3
| |||
17:27:54.655 void MyCountableTimer::notify()4 1
| |||
17:27:54.655 void MySuspendedTimer::notify()1 2
| |||
17:27:54.670 bool OnTimer3()
| |||
17:27:54.670 void MySuspendedTimer::notify()1 3
| |||
17:27:54.686 void MyCountableTimer::notify()2 4
| |||
17:27:54.686 void MySuspendedTimer::notify()1 4
| |||
17:27:54.686 Forcing all timers to stop
| |||
| |||
*/
| |||
//+------------------------------------------------------------------+
|