103 lines
8.6 KiB
MQL5
103 lines
8.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| VirtualInterface.mqh |
|
|
//| Copyright 2022-2025, Yuriy Bykov |
|
|
//| https://www.mql5.com/ru/users/antekov |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2022-2025, Yuriy Bykov"
|
|
#property link "https://www.mql5.com/ru/users/antekov"
|
|
#property version "1.00"
|
|
|
|
class CVirtualChartOrder;
|
|
|
|
#include "../Base/Interface.mqh"
|
|
#include "VirtualChartOrder.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Класс графического интерфейса советника |
|
|
//+------------------------------------------------------------------+
|
|
class CVirtualInterface : public CInterface {
|
|
protected:
|
|
// Статический указатель на единственный экземпляр данного класса
|
|
static CVirtualInterface *s_instance;
|
|
|
|
CVirtualChartOrder *m_chartOrders[]; // Массив графических виртуальных позиций
|
|
|
|
//--- Частные методы
|
|
CVirtualInterface(); // Закрытый конструктор
|
|
|
|
public:
|
|
~CVirtualInterface(); // Деструктор
|
|
|
|
//--- Статические методы
|
|
static
|
|
CVirtualInterface *Instance(ulong p_magic = 0); // Синглтон - создание и получение единственного экземпляра
|
|
|
|
//--- Публичные методы
|
|
void Changed(CVirtualOrder *p_order); // Обработка изменений виртуальной позиции
|
|
void Add(CVirtualOrder *p_order); // Добавление виртуальной позиции
|
|
|
|
virtual void Redraw() override; // Отрисовка на графике изменённых объектов
|
|
};
|
|
|
|
// Инициализация статического указателя на единственный экземпляр данного класса
|
|
CVirtualInterface *CVirtualInterface::s_instance = NULL;
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Закрытый конструктор |
|
|
//+------------------------------------------------------------------+
|
|
CVirtualInterface::CVirtualInterface() {}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Деструктор |
|
|
//+------------------------------------------------------------------+
|
|
CVirtualInterface::~CVirtualInterface() {
|
|
// Удаляем все созданные объекты графических виртуальных позиций
|
|
FOREACH(m_chartOrders) delete m_chartOrders[i];
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Синглтон - создание и получение единственного экземпляра |
|
|
//+------------------------------------------------------------------+
|
|
CVirtualInterface* CVirtualInterface::Instance(ulong p_magic = 0) {
|
|
if(!s_instance) {
|
|
s_instance = new CVirtualInterface();
|
|
}
|
|
if(s_magic == 0 && p_magic != 0) {
|
|
s_magic = p_magic;
|
|
}
|
|
return s_instance;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Добавление виртуальной позиции |
|
|
//+------------------------------------------------------------------+
|
|
void CVirtualInterface::Add(CVirtualOrder *p_order) {
|
|
// Добавляем новую графичкскую виртуальную позицию,
|
|
// созданную из виртуальной позиции
|
|
APPEND(m_chartOrders, new CVirtualChartOrder(p_order));
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Обработка изменения виртуальной позиции |
|
|
//+------------------------------------------------------------------+
|
|
void CVirtualInterface::Changed(CVirtualOrder *p_order) {
|
|
// Запомним, что изменения есть у данной позиции
|
|
int i;
|
|
FIND(m_chartOrders, p_order.Id(), i);
|
|
if(i != -1) {
|
|
m_chartOrders[i].Changed();
|
|
m_isChanged = true;
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Отрисовка на графике изменённых объектов |
|
|
//+------------------------------------------------------------------+
|
|
void CVirtualInterface::Redraw() {
|
|
if(m_isActive && m_isChanged) { // Если интерфейс активен и есть изменения
|
|
// Запускаем перерисовку графических виртуальных позиций
|
|
FOREACH(m_chartOrders) m_chartOrders[i].Redraw();
|
|
m_isChanged = false; // Сбрасываем флаг изменений
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|