Adwizard/Utils/SymbolsMonitor.mqh
2025-04-11 13:28:40 +03:00

109 lines
8.2 KiB
MQL5

//+------------------------------------------------------------------+
//| SymbolsMonitor.mqh |
//| Copyright 2022-2024, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022-2024, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.00"
#include <Trade\SymbolInfo.mqh>
#include "Macros.mqh"
#include "NewBarEvent.mqh"
//+------------------------------------------------------------------+
//| Класс получения информации о торговых инструментах (символах) |
//+------------------------------------------------------------------+
class CSymbolsMonitor {
protected:
// Статический указатель на единственный экземпляр данного класса
static CSymbolsMonitor *s_instance;
// Массив информационных объектов для разных символов
CSymbolInfo *m_symbols[];
//--- Частные методы
CSymbolsMonitor() {} // Закрытый конструктор
public:
~CSymbolsMonitor(); // Деструктор
//--- Статические методы
static
CSymbolsMonitor *Instance(); // Синглтон - создание и получение единственного экземпляра
// Обработка тика для объектов разных символов
void Tick();
// Оператор получения объекта с информацией о конкретном символе
CSymbolInfo* operator[](const string &symbol);
};
// Инициализация статического указателя на единственный экземпляр данного класса
CSymbolsMonitor *CSymbolsMonitor::s_instance = NULL;
//+------------------------------------------------------------------+
//| Синглтон - создание и получение единственного экземпляра |
//+------------------------------------------------------------------+
CSymbolsMonitor* CSymbolsMonitor::Instance() {
if(!s_instance) {
s_instance = new CSymbolsMonitor();
}
return s_instance;
}
//+------------------------------------------------------------------+
//| Деструктор |
//+------------------------------------------------------------------+
CSymbolsMonitor::~CSymbolsMonitor() {
// Удаляем все созданные информационные объекты для символов
FOREACH(m_symbols) if(!!m_symbols[i]) delete m_symbols[i];
}
//+------------------------------------------------------------------+
//| Обработка тика для массива виртуальных ордеров (позиций) |
//+------------------------------------------------------------------+
void CSymbolsMonitor::Tick() {
// Обновляем котировки каждую минуту и спецификацию раз в день
FOREACH(m_symbols) {
if(IsNewBar(m_symbols[i].Name(), PERIOD_D1)) {
m_symbols[i].Refresh();
}
if(IsNewBar(m_symbols[i].Name(), PERIOD_M1)) {
m_symbols[i].RefreshRates();
}
}
}
//+------------------------------------------------------------------+
//| Оператор получения объекта с информацией о конкретном символе |
//+------------------------------------------------------------------+
CSymbolInfo* CSymbolsMonitor::operator[](const string &name) {
// Ищем информационный объект для данного символа в массиве
int i;
SEARCH(m_symbols, m_symbols[i].Name() == name, i);
// Если нашли, то возвращаем его
if(i != -1) {
return m_symbols[i];
} else {
// Иначе создаём новый информационный объект
CSymbolInfo *s = new CSymbolInfo();
// Выбираем для него нужный символ
if(s.Name(name)) {
// Если выбрали успешно, то обновляем спецификацию
s.RefreshRates();
// Добавляем в массив информационных объектов и возвращаем его
APPEND(m_symbols, s);
// Регистрируем обработчик события нового бара на минимальном таймфрейме
IsNewBar(name, PERIOD_M1);
return s;
} else {
PrintFormat(__FUNCTION__" | ERROR: can't create symbol with name [%s]", name);
}
}
return NULL;
}
//+------------------------------------------------------------------+