forked from rosh/MQL5Book
97 lines
2.7 KiB
MQL5
97 lines
2.7 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| MultiSymbolMonitor.mqh |
| |||
//| Copyright (c) 2019-2021, Marketeer |
| |||
//| https://www.mql5.com/en/users/marketeer |
| |||
//+------------------------------------------------------------------+
| |||
#include "MapArray.mqh"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Detect opening time of latest bars for list of symbols |
| |||
//+------------------------------------------------------------------+
| |||
class MultiSymbolMonitor
| |||
{
| |||
protected:
| |||
ENUM_TIMEFRAMES period;
| |||
MapArray<string,datetime> lastTime;
| |||
| |||
public:
| |||
MultiSymbolMonitor(): period(_Period) {}
| |||
MultiSymbolMonitor(const ENUM_TIMEFRAMES p): period(p) {}
| |||
| |||
// add new symbol to monitor
| |||
bool attach(const string symbol)
| |||
{
| |||
if(lastTime.getSize() < sizeof(ulong) * 8) // 64
| |||
{
| |||
lastTime.put(symbol, NULL);
| |||
return true;
| |||
}
| |||
return false;
| |||
}
| |||
| |||
// calculate new state of timestamps
| |||
void refresh()
| |||
{
| |||
for(int i = 0; i < lastTime.getSize(); i++)
| |||
{
| |||
const string symbol = lastTime.getKey(i);
| |||
const datetime dt = iTime(symbol, period, 0);
| |||
lastTime.put(symbol, dt);
| |||
}
| |||
}
| |||
| |||
// construct and return bitmask of changes
| |||
ulong check(const bool refresh = false)
| |||
{
| |||
ulong flags = 0;
| |||
for(int i = 0; i < lastTime.getSize(); i++)
| |||
{
| |||
const string symbol = lastTime.getKey(i);
| |||
const datetime dt = iTime(symbol, period, 0);
| |||
| |||
if(dt != lastTime[symbol])
| |||
{
| |||
flags |= 1 << i;
| |||
}
| |||
| |||
if(refresh) // update timestamp
| |||
{
| |||
lastTime.put(symbol, dt);
| |||
}
| |||
}
| |||
return flags;
| |||
}
| |||
| |||
// return a list of symbol names in the bitmask of changes
| |||
string describe(ulong flags = 0)
| |||
{
| |||
string message = "";
| |||
if(flags == 0) flags = check();
| |||
for(int i = 0; i < lastTime.getSize(); i++)
| |||
{
| |||
if((flags & (1 << i)) != 0)
| |||
{
| |||
message += lastTime.getKey(i) + "\t";
| |||
}
| |||
}
| |||
return message;
| |||
}
| |||
| |||
// check if all bars have the same timestamp
| |||
bool inSync() const
| |||
{
| |||
if(lastTime.getSize() == 0) return false;
| |||
const datetime first = lastTime[0];
| |||
for(int i = 1; i < lastTime.getSize(); i++)
| |||
{
| |||
if(first != lastTime[i]) return false;
| |||
}
| |||
return true;
| |||
}
| |||
| |||
void reset()
| |||
{
| |||
lastTime.reset();
| |||
}
| |||
};
| |||
//+------------------------------------------------------------------+
|