Графика в библиотеке DoEasy (Часть 85): Коллекция графических объектов - добавляем вновь создаваемые
Содержание
- Концепция
- Доработка классов библиотеки
- Дописываем остальные объекты-наследники абстрактного графического объекта
- Добавляем в коллекцию вновь создаваемые графические объекты
- Тестирование
- Что дальше
Концепция
У нас уже созданы некоторые классы объектов, наследуемых от класса абстрактного графического объекта. Такие объекты из групп "Линии", "Каналы", "Ганн", "Фибоначчи" и "Эллиотт" мы сделали в прошлой статье. Сегодня мы допишем классы объектов остальных групп стандартных графических объектов: "Фигуры", "Стрелки" и "Графические объекты". Помимо создания объектов перечисленных групп сделаем функционал в классе коллекции графических объектов для добавления в список-коллекцию вновь создаваемых вручную новых графических объектов на графике в клиентском терминале.
Доработка классов библиотеки
В первую очередь скажу, что мне указали на допущенную мной досадную ошибку в английском слове "Standard" — я писал его везде с окончанием на букву "t". Поэтому мной были внесены исправления во все файлы, где встречалось ошибочное написание этого слова. Соответственно, также были переименованы и папки библиотеки, которые были названы неправильно. Не буду здесь перечислять все файлы с вхождением этого слова — их можно все найти самостоятельно, осуществив поиск по всем папкам библиотеки, нажав Shift+Ctrl+F и выбрав искомое слово, папку библиотеки и поиск в подпапках:
Учитывать регистр и искать слово целиком не нужно — мы просто ищем вхождение в текстах файлов библиотеки слова "standart". И далее просто меняем последнюю букву.
Впрочем, всё это уже сделано, и при скачивании файлов библиотеки нужно будет сначала полностью удалить из папки "Include" терминала папку "DoEasy", а затем разместить её заново из архива, приложенного к статье.
В качестве примера таких правок рассмотрим файл \MQL5\Include\DoEasy\Defines.mqh. В нём исправлены ошибки в написании слова и исправлено наименование константы перечисления целочисленных свойств графического объекта:
//+------------------------------------------------------------------+ //| Данные для работы с индикаторами | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Статус абстрактного индикатора | //+------------------------------------------------------------------+ enum ENUM_INDICATOR_STATUS { INDICATOR_STATUS_STANDARD, // Стандартный индикатор INDICATOR_STATUS_CUSTOM, // Пользовательский индикатор }; //+------------------------------------------------------------------+ //| Группа индикатора | //+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+ //| Список принадлежностей графических объектов | //+------------------------------------------------------------------+ enum ENUM_GRAPH_OBJ_BELONG { GRAPH_OBJ_BELONG_PROGRAM, // Графический объект принадлежит программе GRAPH_OBJ_BELONG_NO_PROGRAM, // Графический объект не принадлежит программе }; //+------------------------------------------------------------------+ //| Список типов графических элементов | //+------------------------------------------------------------------+ enum ENUM_GRAPH_ELEMENT_TYPE { GRAPH_ELEMENT_TYPE_STANDARD, // Стандартный графический объект GRAPH_ELEMENT_TYPE_ELEMENT, // Элемент GRAPH_ELEMENT_TYPE_SHADOW_OBJ, // Объект тени GRAPH_ELEMENT_TYPE_FORM, // Форма GRAPH_ELEMENT_TYPE_WINDOW, // Окно }; //+------------------------------------------------------------------+ //| Группа графического объекта | //+------------------------------------------------------------------+
...
//--- Свойства, принадлежащие различным графическим объектам GRAPH_OBJ_PROP_TIME, // Координата времени GRAPH_OBJ_PROP_COLOR, // Цвет GRAPH_OBJ_PROP_STYLE, // Стиль GRAPH_OBJ_PROP_WIDTH, // Толщина линии GRAPH_OBJ_PROP_FILL, // Заливка объекта цветом GRAPH_OBJ_PROP_READONLY, // Возможность редактирования текста в объекте Edit GRAPH_OBJ_PROP_LEVELS, // Количество уровней GRAPH_OBJ_PROP_LEVELCOLOR, // Цвет линии-уровня GRAPH_OBJ_PROP_LEVELSTYLE, // Стиль линии-уровня GRAPH_OBJ_PROP_LEVELWIDTH, // Толщина линии-уровня GRAPH_OBJ_PROP_ALIGN, // Горизонтальное выравнивание текста в объекте "Поле ввода" (OBJ_EDIT) GRAPH_OBJ_PROP_FONTSIZE, // Размер шрифта GRAPH_OBJ_PROP_RAY_LEFT, // Луч продолжается влево GRAPH_OBJ_PROP_RAY_RIGHT, // Луч продолжается вправо GRAPH_OBJ_PROP_RAY, // Вертикальная линия продолжается на все окна графика GRAPH_OBJ_PROP_ELLIPSE, // Отображение полного эллипса для объекта "Дуги Фибоначчи" GRAPH_OBJ_PROP_ARROWCODE, // Код стрелки для объекта "Стрелка" GRAPH_OBJ_PROP_ANCHOR, // Положение точки привязки графического объекта GRAPH_OBJ_PROP_XDISTANCE, // Дистанция в пикселях по оси X от угла привязки GRAPH_OBJ_PROP_YDISTANCE, // Дистанция в пикселях по оси Y от угла привязки GRAPH_OBJ_PROP_DIRECTION, // Тренд объекта Ганна GRAPH_OBJ_PROP_DEGREE, // Уровень волновой разметки Эллиотта GRAPH_OBJ_PROP_DRAWLINES, // Отображение линий для волновой разметки Эллиотта GRAPH_OBJ_PROP_STATE, // Состояние кнопки (Нажата/Отжата) GRAPH_OBJ_PROP_CHART_OBJ_CHART_ID, // Идентификатор объекта "График" (OBJ_CHART). GRAPH_OBJ_PROP_CHART_OBJ_PERIOD, // Период для объекта "График" GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE, // Признак отображения шкалы времени для объекта "График" GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE, // Признак отображения ценовой шкалы для объекта "График" GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE, // Масштаб для объекта "График" GRAPH_OBJ_PROP_XSIZE, // Ширина объекта по оси X в пикселях. GRAPH_OBJ_PROP_YSIZE, // Высота объекта по оси Y в пикселях. GRAPH_OBJ_PROP_XOFFSET, // X-координата левого верхнего угла прямоугольной области видимости. GRAPH_OBJ_PROP_YOFFSET, // Y-координата левого верхнего угла прямоугольной области видимости. GRAPH_OBJ_PROP_BGCOLOR, // Цвет фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL GRAPH_OBJ_PROP_CORNER, // Угол графика для привязки графического объекта GRAPH_OBJ_PROP_BORDER_TYPE, // Тип рамки для объекта "Прямоугольная рамка" GRAPH_OBJ_PROP_BORDER_COLOR, // Цвет рамки для объекта OBJ_EDIT и OBJ_BUTTON }; #define GRAPH_OBJ_PROP_INTEGER_TOTAL (52) // Общее количество целочисленных свойств #define GRAPH_OBJ_PROP_INTEGER_SKIP (0) // Количество неиспользуемых в сортировке целочисленных свойств //+------------------------------------------------------------------+ //| Вещественные свойства стандартного графического объекта | //+------------------------------------------------------------------+
Ранее константа "Идентификатор объекта "График" (OBJ_CHART)" имела наименование "GRAPH_OBJ_PROP_OBJ_CHART_ID", что делало её выпадающей из списка констант перечисления, описывающих свойства объекта-чарта. Теперь все они приведены к одинаковому написанию.
Соответственно, любое упоминание ошибочно написанной константы "GRAPH_OBJ_PROP_OBJ_CHART_ID" теперь так же исправлено во всех файлах библиотеки на "GRAPH_OBJ_PROP_CHART_OBJ_CHART_ID".
В файле \MQL5\Include\DoEasy\Data.mqh впишем индексы новых сообщений библиотеки:
MSG_GRAPH_OBJ_PROP_GROUP, // Группа графического объекта MSG_GRAPH_OBJ_PROP_GROUP_LINES, // Линии MSG_GRAPH_OBJ_PROP_GROUP_CHANNELS, // Каналы MSG_GRAPH_OBJ_PROP_GROUP_GANN, // Ганн MSG_GRAPH_OBJ_PROP_GROUP_FIBO, // Фибоначчи MSG_GRAPH_OBJ_PROP_GROUP_ELLIOTT, // Эллиотт MSG_GRAPH_OBJ_PROP_GROUP_SHAPES, // Фигуры MSG_GRAPH_OBJ_PROP_GROUP_ARROWS, // Стрелки MSG_GRAPH_OBJ_PROP_GROUP_GRAPHICAL, // Графические объекты MSG_GRAPH_OBJ_TEXT_CLICK_COORD, // (Координата щелчка по графику) MSG_GRAPH_OBJ_TEXT_ANCHOR_TOP, // Точка привязки для стрелки находится сверху MSG_GRAPH_OBJ_TEXT_ANCHOR_BOTTOM, // Точка привязки для стрелки находится снизу MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_UPPER, // Точка привязки в левом верхнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT, // Точка привязки слева по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_LOWER, // Точка привязки в левом нижнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_LOWER, // Точка привязки снизу по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_LOWER, // Точка привязки в правом нижнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT, // Точка привязки справа по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_UPPER, // Точка привязки в правом верхнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_UPPER, // Точка привязки сверху по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_CENTER, // Точка привязки строго по центру объекта MSG_GRAPH_OBJ_FAILED_GET_ADDED_OBJ_LIST, // Не удалось получить список вновь добавленных объектов MSG_GRAPH_OBJ_FAILED_DETACH_OBJ_FROM_LIST, // Не удалось изъять графический объект из списка }; //+------------------------------------------------------------------+
и текстовые сообщения, соответствующие вновь добавленным индексам:
MSG_GRAPH_OBJ_PROP_GROUP, // Группа графического объекта MSG_GRAPH_OBJ_PROP_GROUP_LINES, // Линии MSG_GRAPH_OBJ_PROP_GROUP_CHANNELS, // Каналы MSG_GRAPH_OBJ_PROP_GROUP_GANN, // Ганн MSG_GRAPH_OBJ_PROP_GROUP_FIBO, // Фибоначчи MSG_GRAPH_OBJ_PROP_GROUP_ELLIOTT, // Эллиотт MSG_GRAPH_OBJ_PROP_GROUP_SHAPES, // Фигуры MSG_GRAPH_OBJ_PROP_GROUP_ARROWS, // Стрелки MSG_GRAPH_OBJ_PROP_GROUP_GRAPHICAL, // Графические объекты MSG_GRAPH_OBJ_TEXT_CLICK_COORD, // (Координата щелчка по графику) MSG_GRAPH_OBJ_TEXT_ANCHOR_TOP, // Точка привязки для стрелки находится сверху MSG_GRAPH_OBJ_TEXT_ANCHOR_BOTTOM, // Точка привязки для стрелки находится снизу MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_UPPER, // Точка привязки в левом верхнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT, // Точка привязки слева по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_LOWER, // Точка привязки в левом нижнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_LOWER, // Точка привязки снизу по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_LOWER, // Точка привязки в правом нижнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT, // Точка привязки справа по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_UPPER, // Точка привязки в правом верхнем углу MSG_GRAPH_OBJ_TEXT_ANCHOR_UPPER, // Точка привязки сверху по центру MSG_GRAPH_OBJ_TEXT_ANCHOR_CENTER, // Точка привязки строго по центру объекта MSG_GRAPH_OBJ_FAILED_GET_ADDED_OBJ_LIST, // Не удалось получить список вновь добавленных объектов MSG_GRAPH_OBJ_FAILED_DETACH_OBJ_FROM_LIST, // Не удалось изъять графический объект из списка }; //+------------------------------------------------------------------+
У разных графических объектов есть одинаковое свойство "Положение точки привязки графического объекта", но вот перечисления для указания способа привязки для разных объектов — разные. Для объектов Text, Label, Bitmap и Bitmap Label используется перечисление ENUM_ANCHOR_POINT, тогда как для объектов Arrow используется другое перечисление — ENUM_ARROW_ANCHOR.
Исходя из этого, мы в классе абстрактного графического объекта для этого свойства сделали метод, возвращающий точку привязки объекта не с типом одного из этих перечислений, а с типом int — так как мы не знаем какой из объектов будет наследоваться от этого класса, и тип какого именно перечисления нужно возвращать. В наследниках же мы создадим свои методы, возвращающие нужный тип перечисления способа привязки. Для вывода описания способа привязки в абстрактом классе у нас есть виртуальный метод
//--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return (string)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR);}
В каждом из наследуемых классов будет такой же виртуальный метод, но возвращающий нужный тип описания (либо способ привязки из перечисления ENUM_ARROW_ANCHOR, либо из перечисления ENUM_ANCHOR_POINT).
Для того, чтобы мы могли выбирать нужный способ вывода описания способа привязки, добавим функции для вывода описания значений этих перечислений в файл сервисных функций \MQL5\Include\DoEasy\Services\DELib.mqh:
//+------------------------------------------------------------------+ //| Возвращает описание точки привязки | //| для графического объекта "Стрелка" | //+------------------------------------------------------------------+ string AnchorForArrowObjDescription(const ENUM_ARROW_ANCHOR anchor) { return ( anchor==ANCHOR_TOP ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_TOP) : anchor==ANCHOR_BOTTOM ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_BOTTOM) : "Unknown" ); } //+------------------------------------------------------------------+ //| Возвращает описание точки привязки для графических объектов | //+------------------------------------------------------------------+ string AnchorForGraphicsObjDescription(const ENUM_ANCHOR_POINT anchor) { return ( anchor==ANCHOR_LEFT_UPPER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_UPPER) : anchor==ANCHOR_LEFT ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT) : anchor==ANCHOR_LEFT_LOWER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_LEFT_LOWER) : anchor==ANCHOR_LOWER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_LOWER) : anchor==ANCHOR_RIGHT_LOWER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_LOWER) : anchor==ANCHOR_RIGHT ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT) : anchor==ANCHOR_RIGHT_UPPER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_RIGHT_UPPER) : anchor==ANCHOR_UPPER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_UPPER) : anchor==ANCHOR_CENTER ? CMessage::Text(MSG_GRAPH_OBJ_TEXT_ANCHOR_CENTER) : "Unknown" ); } //+------------------------------------------------------------------+ //| Возвращает флаг отображения графического | //| объекта на указанном таймфрейме графика | //+------------------------------------------------------------------+
Здесь: в зависимости от переданного значения возвращается соответствующее текстовое описание.
Дописываем остальные объекты-наследники абстрактного графического объекта
В папке библиотеки \MQL5\Include\DoEasy\Objects\Graph\Standard\ допишем оставшиеся классы-наследники абстрактного графического объекта.
Все объекты должны быть унаследованы от класса CGStdGraphObj, и файл этого класса должен быть подключен к создаваемым файлам.
Класс графического объекта "Прямоугольник":
//+------------------------------------------------------------------+ //| GStdRectangleObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Прямоугольник" | //+------------------------------------------------------------------+ class CGStdRectangleObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdRectangleObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_RECTANGLE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_SHAPES,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FILL,::ObjectGetInteger(chart_id,name,OBJPROP_FILL)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_RECTANGLE); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_FILL : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdRectangleObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdRectangleObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
В каждом таком классе, в его конструкторе будем получать и сохранять только те свойства объекта, которые принадлежат типу графического объекта, описываемому этим классом. Точно так же, в методах, возвращающих флаги поддержания объектом его свойств, будут перечисляться только те свойства, которые данный графический объект поддерживает.
Остальные классы стандартных графических объектов просто просмотрим, добавляя при необходимости комментарии к кодам классов.
Класс графического объекта "Треугольник":
//+------------------------------------------------------------------+ //| CGStdTriangleObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Треугольник" | //+------------------------------------------------------------------+ class CGStdTriangleObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdTriangleObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_TRIANGLE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_SHAPES,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FILL,::ObjectGetInteger(chart_id,name,OBJPROP_FILL)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_TRIANGLE); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTriangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_FILL : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTriangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTriangleObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdTriangleObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdTriangleObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Эллипс":
//+------------------------------------------------------------------+ //| GStdEllipseObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Эллипс" | //+------------------------------------------------------------------+ class CGStdEllipseObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdEllipseObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ELLIPSE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_SHAPES,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FILL,::ObjectGetInteger(chart_id,name,OBJPROP_FILL)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ELLIPSE); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEllipseObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_FILL : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEllipseObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEllipseObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdEllipseObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdEllipseObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Хорошо":
//+------------------------------------------------------------------+ //| GStdArrowThumbUpObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Хорошо" | //+------------------------------------------------------------------+ class CGStdArrowThumbUpObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowThumbUpObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_THUMB_UP,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_THUMB_UP); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowThumbUpObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowThumbUpObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Здесь у нас, помимо записи нужных свойств объекта в конструкторе класса, ещё добавлен метод, возвращающий способ привязки, который возвращает тип перечисления ENUM_ARROW_ANCHOR, и виртуальный метод, возвращающий описание способа привязки при помощи значения, возвращаемого функцией AnchorForArrowObjDescription(), написанной нами сегодня в файле сервисных функций.
Класс графического объекта знак "Плохо":
//+------------------------------------------------------------------+ //| GStdArrowThumbDownObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Плохо" | //+------------------------------------------------------------------+ class CGStdArrowThumbDownObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowThumbDownObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_THUMB_DOWN,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_THUMB_DOWN); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowThumbDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowThumbDownObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowThumbDownObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Стрелка вверх":
//+------------------------------------------------------------------+ //| GStdArrowUpObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Стрелка вверх" | //+------------------------------------------------------------------+ class CGStdArrowUpObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowUpObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_UP,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_UP); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowUpObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowUpObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowUpObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Стрелка вниз":
//+------------------------------------------------------------------+ //| GStdArrowDownObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Стрелка вниз" | //+------------------------------------------------------------------+ class CGStdArrowDownObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowDownObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_DOWN,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_DOWN); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowDownObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowDownObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowDownObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Стоп":
//+------------------------------------------------------------------+ //| GStdArrowStopObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Стоп" | //+------------------------------------------------------------------+ class CGStdArrowStopObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowStopObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_STOP,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_STOP); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowStopObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowStopObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowStopObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowStopObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowStopObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Птичка":
//+------------------------------------------------------------------+ //| GStdArrowCheckObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Птичка" | //+------------------------------------------------------------------+ class CGStdArrowCheckObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowCheckObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_CHECK,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_CHECK); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowCheckObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowCheckObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowCheckObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowCheckObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowCheckObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Левая ценовая метка":
//+------------------------------------------------------------------+ //| GStdArrowLeftPriceObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Левая ценовая метка" | //+------------------------------------------------------------------+ class CGStdArrowLeftPriceObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowLeftPriceObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_LEFT_PRICE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_LEFT_PRICE); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowLeftPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowLeftPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowLeftPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowLeftPriceObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowLeftPriceObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Правая ценовая метка":
//+------------------------------------------------------------------+ //| GStdArrowRightPriceObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Правая ценовая метка" | //+------------------------------------------------------------------+ class CGStdArrowRightPriceObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowRightPriceObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_RIGHT_PRICE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_RIGHT_PRICE); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowRightPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowRightPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowRightPriceObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowRightPriceObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowRightPriceObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Buy":
//+------------------------------------------------------------------+ //| GStdArrowBuyObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Buy" | //+------------------------------------------------------------------+ class CGStdArrowBuyObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowBuyObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_BUY,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Укажем свойство объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_TOP); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_BUY); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowBuyObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowBuyObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowBuyObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowBuyObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowBuyObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта знак "Sell":
//+------------------------------------------------------------------+ //| GStdArrowSellObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект знак "Sell" | //+------------------------------------------------------------------+ class CGStdArrowSellObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowSellObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_SELL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Укажем свойство объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_BOTTOM); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW_SELL); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowSellObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowSellObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowSellObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowSellObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowSellObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Стрелка":
//+------------------------------------------------------------------+ //| GStdArrowObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Стрелка" | //+------------------------------------------------------------------+ class CGStdArrowObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdArrowObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ARROWS,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ARROWCODE,::ObjectGetInteger(chart_id,name,OBJPROP_ARROWCODE)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ARROW_ANCHOR Anchor(void) const { return (ENUM_ARROW_ANCHOR)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_ARROW); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForArrowObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STYLE : case GRAPH_OBJ_PROP_WIDTH : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_ARROWCODE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdArrowObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdArrowObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdArrowObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Текст":
//+------------------------------------------------------------------+ //| GStdTextObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Текст" | //+------------------------------------------------------------------+ class CGStdTextObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdTextObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_TEXT,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONTSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_FONTSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANGLE,::ObjectGetDouble(chart_id,name,OBJPROP_ANGLE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONT,::ObjectGetString(chart_id,name,OBJPROP_FONT)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_TEXT); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTextObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_FONTSIZE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTextObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ANGLE : case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdTextObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_FONT : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdTextObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdTextObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Текстовая метка":
//+------------------------------------------------------------------+ //| GStdLabelObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Текстовая метка" | //+------------------------------------------------------------------+ class CGStdLabelObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdLabelObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_LABEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANGLE,::ObjectGetDouble(chart_id,name,OBJPROP_ANGLE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONTSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_FONTSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONT,::ObjectGetString(chart_id,name,OBJPROP_FONT)); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_LABEL); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_FONTSIZE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ANGLE : case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_FONT : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdLabelObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdLabelObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Кнопка":
//+------------------------------------------------------------------+ //| GStdButtonObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Кнопка" | //+------------------------------------------------------------------+ class CGStdButtonObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdButtonObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_BUTTON,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_STATE,::ObjectGetInteger(chart_id,name,OBJPROP_STATE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BGCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_BGCOLOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BORDER_COLOR,::ObjectGetInteger(chart_id,name,OBJPROP_BORDER_COLOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONTSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_FONTSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONT,::ObjectGetString(chart_id,name,OBJPROP_FONT)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_LEFT_UPPER); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_BUTTON); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdButtonObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_STATE : case GRAPH_OBJ_PROP_BGCOLOR : case GRAPH_OBJ_PROP_BORDER_COLOR : case GRAPH_OBJ_PROP_FONTSIZE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdButtonObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdButtonObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_FONT : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdButtonObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdButtonObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Обратите внимание в конструкторе класса на установку свойства способа привязки объекта. У некоторых графических объектов привязка осуществляется жёстко в левом верхнем углу. Поэтому здесь мы не считываем это свойство с параметров объекта, а сразу же устанавливаем правильный угол. Строки кода классов, отмеченные цветом, прокомментируем позже.
Класс графического объекта "График":
//+------------------------------------------------------------------+ //| GStdChartObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "График" | //+------------------------------------------------------------------+ class CGStdChartObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdChartObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_CHART,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_CHART_ID,::ObjectGetInteger(chart_id,name,OBJPROP_CHART_ID)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_PERIOD,::ObjectGetInteger(chart_id,name,OBJPROP_PERIOD)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE,::ObjectGetInteger(chart_id,name,OBJPROP_DATE_SCALE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE,::ObjectGetInteger(chart_id,name,OBJPROP_PRICE_SCALE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE,::ObjectGetInteger(chart_id,name,OBJPROP_CHART_SCALE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL,::ObjectGetString(chart_id,name,OBJPROP_SYMBOL)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_LEFT_UPPER); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_CHART); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdChartObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_CHART_OBJ_CHART_ID : case GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE : case GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE : case GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE : case GRAPH_OBJ_PROP_CHART_OBJ_PERIOD : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdChartObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdChartObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL : case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdChartObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdChartObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Рисунок":
//+------------------------------------------------------------------+ //| GStdBitmapObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Рисунок" | //+------------------------------------------------------------------+ class CGStdBitmapObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdBitmapObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_BITMAP,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_XOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_YOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_BITMAP); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_XOFFSET : case GRAPH_OBJ_PROP_YOFFSET : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_BMPFILE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdBitmapObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdBitmapObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Графическая метка":
//+------------------------------------------------------------------+ //| GStdBitmapObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Графическая метка" | //+------------------------------------------------------------------+ class CGStdBitmapLabelObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdBitmapLabelObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_BITMAP_LABEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_XOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_YOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,::ObjectGetInteger(chart_id,name,OBJPROP_ANCHOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_STATE,::ObjectGetInteger(chart_id,name,OBJPROP_STATE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BMPFILE,::ObjectGetString(chart_id,name,OBJPROP_BMPFILE)); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_BITMAP_LABEL); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_STATE : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_XOFFSET : case GRAPH_OBJ_PROP_YOFFSET : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdBitmapLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_BMPFILE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdBitmapLabelObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdBitmapLabelObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Поле редактирования":
//+------------------------------------------------------------------+ //| GStdEditObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Поле редактирования" | //+------------------------------------------------------------------+ class CGStdEditObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdEditObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_EDIT,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_READONLY,::ObjectGetInteger(chart_id,name,OBJPROP_READONLY)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ALIGN,::ObjectGetInteger(chart_id,name,OBJPROP_ALIGN)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BGCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_BGCOLOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BORDER_COLOR,::ObjectGetInteger(chart_id,name,OBJPROP_BORDER_COLOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONTSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_FONTSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FONT,::ObjectGetString(chart_id,name,OBJPROP_FONT)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_LEFT_UPPER); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_EDIT); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEditObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : case GRAPH_OBJ_PROP_READONLY : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_ALIGN : case GRAPH_OBJ_PROP_BORDER_COLOR : case GRAPH_OBJ_PROP_FONTSIZE : case GRAPH_OBJ_PROP_BGCOLOR : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEditObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEditObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : case GRAPH_OBJ_PROP_FONT : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdEditObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdEditObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Событие календаря":
//+------------------------------------------------------------------+ //| GStdEventObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Событие календаря" | //+------------------------------------------------------------------+ class CGStdEventObj : public CGStdGraphObj { private: public: //--- Конструктор CGStdEventObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_EVENT,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание (1) типа (ENUM_OBJECT), (2) координаты цены графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_EVENT); } virtual string PriceDescription(void) const { return ::DoubleToString(this.GetProperty(GRAPH_OBJ_PROP_PRICE),this.m_digits)+" "+ CMessage::Text(MSG_GRAPH_OBJ_TEXT_CLICK_COORD); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEventObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_COLOR : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEventObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdEventObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdEventObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdEventObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Класс графического объекта "Прямоугольная метка":
//+------------------------------------------------------------------+ //| GStdRectangleLabelObj.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "GStdGraphObj.mqh" //+------------------------------------------------------------------+ //| Графический объект "Прямоугольная метка" | //+------------------------------------------------------------------+ class CGStdRectangleLabelObj : public CGStdGraphObj { private: void CoordsToTimePrice(void) { int subwnd; datetime time; double price; if(::ChartXYToTimePrice(m_chart_id,(int)this.XDistance(),(int)this.YDistance(),subwnd,time,price)) { this.SetTime(time); this.SetPrice(price); } } public: //--- Конструктор CGStdRectangleLabelObj(const long chart_id,const string name) : CGStdGraphObj(OBJECT_DE_TYPE_GSTD_RECTANGLE_LABEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GRAPHICAL,chart_id,name) { //--- Получим и сохраним свойства объекта CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_XDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YDISTANCE,::ObjectGetInteger(chart_id,name,OBJPROP_YDISTANCE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_XSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YSIZE,::ObjectGetInteger(chart_id,name,OBJPROP_YSIZE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_XOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_XOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_YOFFSET,::ObjectGetInteger(chart_id,name,OBJPROP_YOFFSET)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_CORNER,::ObjectGetInteger(chart_id,name,OBJPROP_CORNER)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BORDER_TYPE,::ObjectGetInteger(chart_id,name,OBJPROP_BORDER_TYPE)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_BORDER_COLOR,::ObjectGetInteger(chart_id,name,OBJPROP_BORDER_COLOR)); CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,ANCHOR_LEFT_UPPER); this.CoordsToTimePrice(); } //--- Поддерживаемые свойства объекта (1) вещественные, (2) целочисленные virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property); virtual bool SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает положение точки привязки графического объекта ENUM_ANCHOR_POINT Anchor(void) const { return (ENUM_ANCHOR_POINT)this.GetProperty(GRAPH_OBJ_PROP_ANCHOR); } //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Возвращает краткое наименование объекта virtual string Header(const bool symbol=false); //--- Возвращает описание типа (ENUM_OBJECT) графического объекта virtual string TypeDescription(void) const { return StdGraphObjectTypeDescription(OBJ_RECTANGLE_LABEL); } //--- Возвращает описание положения точки привязки графического объекта virtual string AnchorDescription(void) const { return AnchorForGraphicsObjDescription(this.Anchor()); } }; //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| целочисленное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_INTEGER property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_ID : case GRAPH_OBJ_PROP_TYPE : case GRAPH_OBJ_PROP_ELEMENT_TYPE : case GRAPH_OBJ_PROP_GROUP : case GRAPH_OBJ_PROP_BELONG : case GRAPH_OBJ_PROP_CHART_ID : case GRAPH_OBJ_PROP_WND_NUM : case GRAPH_OBJ_PROP_NUM : case GRAPH_OBJ_PROP_CREATETIME : case GRAPH_OBJ_PROP_TIMEFRAMES : case GRAPH_OBJ_PROP_BACK : case GRAPH_OBJ_PROP_ZORDER : case GRAPH_OBJ_PROP_HIDDEN : case GRAPH_OBJ_PROP_SELECTED : case GRAPH_OBJ_PROP_SELECTABLE : case GRAPH_OBJ_PROP_TIME : case GRAPH_OBJ_PROP_ANCHOR : case GRAPH_OBJ_PROP_CORNER : case GRAPH_OBJ_PROP_XDISTANCE : case GRAPH_OBJ_PROP_YDISTANCE : case GRAPH_OBJ_PROP_XOFFSET : case GRAPH_OBJ_PROP_YOFFSET : case GRAPH_OBJ_PROP_XSIZE : case GRAPH_OBJ_PROP_YSIZE : case GRAPH_OBJ_PROP_BORDER_COLOR : case GRAPH_OBJ_PROP_BORDER_TYPE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| вещественное свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_PRICE : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает истину, если объект поддерживает переданное | //| строковое свойство, возвращает ложь в противном случае | //+------------------------------------------------------------------+ bool CGStdRectangleLabelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_STRING property) { switch((int)property) { //--- Поддерживаемые свойства case GRAPH_OBJ_PROP_NAME : case GRAPH_OBJ_PROP_TEXT : case GRAPH_OBJ_PROP_TOOLTIP : return true; //--- Остальные свойства не поддерживаются //--- По умолчанию false default: break; } return false; } //+------------------------------------------------------------------+ //| Возвращает краткое наименование объекта | //+------------------------------------------------------------------+ string CGStdRectangleLabelObj::Header(const bool symbol=false) { return this.TypeDescription(); } //+------------------------------------------------------------------+ //| Выводит в журнал краткое описание объекта | //+------------------------------------------------------------------+ void CGStdRectangleLabelObj::PrintShort(const bool dash=false,const bool symbol=false) { ::Print ( this.Header(symbol)," \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID), " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS) ); } //+------------------------------------------------------------------+
Если внимательно посмотреть на устройство этих классов, то увидим, что все они идентичны, но каждый имеет свои уникальные особенности. Все свойства объектов считываются и сохраняются в переменных класса в конструкторе, а те объекты, у которых в свойствах нет цены или времени для их изменения, но они записываются терминалом в эти свойства (например, "Прямоугольная метка" — объект устанавливается на координаты графика в пикселях, но в его параметрах "цена/время" присутствуют значения, и эти значения равны координатам щелчка мышкой по графику во время установки объекта). В такие свойства мы записываем значения при помощи приватного метода CoordsToTimePrice().
Итак, теперь у нас готовы классы всех объектов, являющихся наследниками абстрактного графического объекта. Теперь нам нужно сделать возможность осуществлять поиск нужных нам графических объектов в списке по указанным параметрам.
Все эти объекты мы будем хранить в списке класса-коллекции графических объектов, и для осуществления поиска и фильтрации у нас есть специально созданный для этого класс CSelect в файле \MQL5\Include\DoEasy\Services\Select.mqh. Откроем файл и внесём в него необходимые доработки.
В первую очередь подключим файл класса абстрактного графического объекта:
//+------------------------------------------------------------------+ //| Select.mqh | //| Copyright 2020, MetaQuotes Software Corp. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include <Arrays\ArrayObj.mqh> #include "..\Objects\Orders\Order.mqh" #include "..\Objects\Events\Event.mqh" #include "..\Objects\Accounts\Account.mqh" #include "..\Objects\Symbols\Symbol.mqh" #include "..\Objects\PendRequest\PendRequest.mqh" #include "..\Objects\Series\SeriesDE.mqh" #include "..\Objects\Indicators\Buffer.mqh" #include "..\Objects\Indicators\IndicatorDE.mqh" #include "..\Objects\Indicators\DataInd.mqh" #include "..\Objects\Ticks\DataTick.mqh" #include "..\Objects\Book\MarketBookOrd.mqh" #include "..\Objects\MQLSignalBase\MQLSignal.mqh" #include "..\Objects\Chart\ChartObj.mqh" #include "..\Objects\Graph\GCnvElement.mqh" #include "..\Objects\Graph\Standard\GStdGraphObj.mqh" //+------------------------------------------------------------------+
В самом конце тела класса объявим методы для поиска и сортировки по свойствам стандартных графических объектов:
//+------------------------------------------------------------------+ //| Методы работы с данными стандартных графических объектов | //+------------------------------------------------------------------+ //--- Возвращает список объектов, где одно из (1) целочисленных, (2) вещественных и (3) строковых свойств удовлетворяет заданному критерию static CArrayObj *ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property,long value,ENUM_COMPARER_TYPE mode); static CArrayObj *ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property,double value,ENUM_COMPARER_TYPE mode); static CArrayObj *ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_STRING property,string value,ENUM_COMPARER_TYPE mode); //--- Возвращает индекс графического объекта в списке с максимальным значением (1) целочисленного, (2) вещественного и (3) строкового свойства static int FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property); static int FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property); static int FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_STRING property); //--- Возвращает индекс графического объекта в списке с минимальным значением (1) целочисленного, (2) вещественного и (3) строкового свойства static int FindGraphicStdObjectMin(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property); static int FindGraphicStdObjectMin(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property); static int FindGraphicStdObjectMin(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_STRING property); //--- }; //+------------------------------------------------------------------+
За пределами тела класса напишем их реализацию:
//+------------------------------------------------------------------+ //| Методы работы с данными графических элементов на канвасе | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Возвращает список объектов, где одно из целочисленных | //| свойств удовлетворяет заданному критерию | //+------------------------------------------------------------------+ CArrayObj *CSelect::ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property,long value,ENUM_COMPARER_TYPE mode) { if(list_source==NULL) return NULL; CArrayObj *list=new CArrayObj(); if(list==NULL) return NULL; list.FreeMode(false); ListStorage.Add(list); int total=list_source.Total(); for(int i=0; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); if(!obj.SupportProperty(property)) continue; long obj_prop=obj.GetProperty(property); if(CompareValues(obj_prop,value,mode)) list.Add(obj); } return list; } //+------------------------------------------------------------------+ //| Возвращает список объектов, где одно из вещественных | //| свойств удовлетворяет заданному критерию | //+------------------------------------------------------------------+ CArrayObj *CSelect::ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property,double value,ENUM_COMPARER_TYPE mode) { if(list_source==NULL) return NULL; CArrayObj *list=new CArrayObj(); if(list==NULL) return NULL; list.FreeMode(false); ListStorage.Add(list); for(int i=0; i<list_source.Total(); i++) { CGStdGraphObj *obj=list_source.At(i); if(!obj.SupportProperty(property)) continue; double obj_prop=obj.GetProperty(property); if(CompareValues(obj_prop,value,mode)) list.Add(obj); } return list; } //+------------------------------------------------------------------+ //| Возвращает список объектов, где одно из строковых | //| свойств удовлетворяет заданному критерию | //+------------------------------------------------------------------+ CArrayObj *CSelect::ByGraphicStdObjectProperty(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_STRING property,string value,ENUM_COMPARER_TYPE mode) { if(list_source==NULL) return NULL; CArrayObj *list=new CArrayObj(); if(list==NULL) return NULL; list.FreeMode(false); ListStorage.Add(list); for(int i=0; i<list_source.Total(); i++) { CGStdGraphObj *obj=list_source.At(i); if(!obj.SupportProperty(property)) continue; string obj_prop=obj.GetProperty(property); if(CompareValues(obj_prop,value,mode)) list.Add(obj); } return list; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с максимальным значением целочисленного свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property) { if(list_source==NULL) return WRONG_VALUE; int index=0; CGStdGraphObj *max_obj=NULL; int total=list_source.Total(); if(total==0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); long obj1_prop=obj.GetProperty(property); max_obj=list_source.At(index); long obj2_prop=max_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,MORE)) index=i; } return index; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с максимальным значением вещественного свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property) { if(list_source==NULL) return WRONG_VALUE; int index=0; CGStdGraphObj *max_obj=NULL; int total=list_source.Total(); if(total==0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); double obj1_prop=obj.GetProperty(property); max_obj=list_source.At(index); double obj2_prop=max_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,MORE)) index=i; } return index; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с максимальным значением строкового свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMax(CArrayObj *list_source,ENUM_GRAPH_OBJ_PROP_STRING property) { if(list_source==NULL) return WRONG_VALUE; int index=0; CGStdGraphObj *max_obj=NULL; int total=list_source.Total(); if(total==0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); string obj1_prop=obj.GetProperty(property); max_obj=list_source.At(index); string obj2_prop=max_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,MORE)) index=i; } return index; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с минимальным значением целочисленного свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMin(CArrayObj* list_source,ENUM_GRAPH_OBJ_PROP_INTEGER property) { int index=0; CGStdGraphObj *min_obj=NULL; int total=list_source.Total(); if(total==0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); long obj1_prop=obj.GetProperty(property); min_obj=list_source.At(index); long obj2_prop=min_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,LESS)) index=i; } return index; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с минимальным значением вещественного свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMin(CArrayObj* list_source,ENUM_GRAPH_OBJ_PROP_DOUBLE property) { int index=0; CGStdGraphObj *min_obj=NULL; int total=list_source.Total(); if(total== 0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); double obj1_prop=obj.GetProperty(property); min_obj=list_source.At(index); double obj2_prop=min_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,LESS)) index=i; } return index; } //+------------------------------------------------------------------+ //| Возвращает индекс объекта в списке | //| с минимальным значением строкового свойства | //+------------------------------------------------------------------+ int CSelect::FindGraphicStdObjectMin(CArrayObj* list_source,ENUM_GRAPH_OBJ_PROP_STRING property) { int index=0; CGStdGraphObj *min_obj=NULL; int total=list_source.Total(); if(total==0) return WRONG_VALUE; for(int i=1; i<total; i++) { CGStdGraphObj *obj=list_source.At(i); string obj1_prop=obj.GetProperty(property); min_obj=list_source.At(index); string obj2_prop=min_obj.GetProperty(property); if(CompareValues(obj1_prop,obj2_prop,LESS)) index=i; } return index; } //+------------------------------------------------------------------+
Подробно логику и назначение таких методов мы рассматривали в третьей статье описания библиотеки, и здесь повторяться не будем.
Добавляем в коллекцию вновь создаваемые графические объекты
Логика определения объектов на графиках у нас такая: для каждого открытого графика создаются объекты управления графическими объектами графика, в которых отслеживается изменение количества объектов на графике. При увеличении количества объектов мы можем посмотреть, что за объекты были добавлены, создать для них объекты графики и разместить их в список вновь добавленных объектов. Таким образом, для каждого из открытых графиков в терминале мы будем иметь свой список вновь добавленных графических объектов.
Далее, в классе-коллекции графических объектов получаем список всех созданных объектов управления графикой и для каждого из них смотрим списки вновь добавленных объектов. Если на графике появились новые графические объекты, то объекты, их описывающие, будут размещены в список. Из этого списка мы получаем указатели на каждый объект и извлекаем его из списка. При успешном извлечении объекта, он удаляется из списка вновь добавленных объектов класса управления графическими объектами и мы его сразу же размещаем в список-коллекцию. При неудачном размещении, этот объект удаляется с сообщением об ошибке. Таким образом мы избавимся от утечек памяти, так как изъятый из списка объект должен либо управляться вручную, либо быть размещён в другой список, которым управляет подсистема терминала. Что мы и делаем, размещая его в список-коллекцию, а при неудаче — просто удаляем этот объект.
Да, такая логика подразумевает потерю объекта, который был создан как описание графического объекта, и библиотека не сможет сообщить нам о добавлении графического объекта на график и далее управлять им. Но это лучше, чем оставить объект где-то в памяти, так сказать "в свободном плавании".
Вполне вероятно, далее продумаем логику сохранения таких объектов, но для этого придётся искать причину неудачного добавления в список-коллекцию изъятого объекта, и вероятнее всего — это нехватка памяти. В таком случае, любое сохранение где-либо этого объекта обернётся неудачей. Поэтому пока просто будем удалять такой объект.
В первую очередь подключим к файлу класса-коллекции графических объектов в \MQL5\Include\DoEasy\Collections\GraphElementsCollection.mqh все оставшиеся, созданные нами сегодня, классы стандартных графических объектов:
//+------------------------------------------------------------------+ //| GraphElementsCollection.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://mql5.com/ru/users/artmedia70" #property version "1.00" //+------------------------------------------------------------------+ //| Включаемые файлы | //+------------------------------------------------------------------+ #include "ListObj.mqh" #include "..\Services\Select.mqh" #include "..\Objects\Graph\Form.mqh" #include "..\Objects\Graph\Standard\GStdVLineObj.mqh" #include "..\Objects\Graph\Standard\GStdHLineObj.mqh" #include "..\Objects\Graph\Standard\GStdTrendObj.mqh" #include "..\Objects\Graph\Standard\GStdTrendByAngleObj.mqh" #include "..\Objects\Graph\Standard\GStdCiclesObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowedLineObj.mqh" #include "..\Objects\Graph\Standard\GStdChannelObj.mqh" #include "..\Objects\Graph\Standard\GStdStdDevChannelObj.mqh" #include "..\Objects\Graph\Standard\GStdRegressionObj.mqh" #include "..\Objects\Graph\Standard\GStdPitchforkObj.mqh" #include "..\Objects\Graph\Standard\GStdGannLineObj.mqh" #include "..\Objects\Graph\Standard\GStdGannFanObj.mqh" #include "..\Objects\Graph\Standard\GStdGannGridObj.mqh" #include "..\Objects\Graph\Standard\GStdFiboObj.mqh" #include "..\Objects\Graph\Standard\GStdFiboTimesObj.mqh" #include "..\Objects\Graph\Standard\GStdFiboFanObj.mqh" #include "..\Objects\Graph\Standard\GStdFiboArcObj.mqh" #include "..\Objects\Graph\Standard\GStdFiboChannelObj.mqh" #include "..\Objects\Graph\Standard\GStdExpansionObj.mqh" #include "..\Objects\Graph\Standard\GStdElliotWave5Obj.mqh" #include "..\Objects\Graph\Standard\GStdElliotWave3Obj.mqh" #include "..\Objects\Graph\Standard\GStdRectangleObj.mqh" #include "..\Objects\Graph\Standard\GStdTriangleObj.mqh" #include "..\Objects\Graph\Standard\GStdEllipseObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowThumbUpObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowThumbDownObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowUpObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowDownObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowStopObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowCheckObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowLeftPriceObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowRightPriceObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowBuyObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowSellObj.mqh" #include "..\Objects\Graph\Standard\GStdArrowObj.mqh" #include "..\Objects\Graph\Standard\GStdTextObj.mqh" #include "..\Objects\Graph\Standard\GStdLabelObj.mqh" #include "..\Objects\Graph\Standard\GStdButtonObj.mqh" #include "..\Objects\Graph\Standard\GStdChartObj.mqh" #include "..\Objects\Graph\Standard\GStdBitmapObj.mqh" #include "..\Objects\Graph\Standard\GStdBitmapLabelObj.mqh" #include "..\Objects\Graph\Standard\GStdEditObj.mqh" #include "..\Objects\Graph\Standard\GStdEventObj.mqh" #include "..\Objects\Graph\Standard\GStdRectangleLabelObj.mqh" //+------------------------------------------------------------------+ //| Класс управления объектами чарта | //+------------------------------------------------------------------+
В классе управления графическими объектами, в его приватной секции объявим список вновь добавленных графических объектов и объявим метод, возвращающий имя последнего добавленного на график графического объекта.
В публичной секции класса напишем метод, возвращающий список вновь добавленных объектов, а в конструкторах класса очистим список и установим ему флаг сортированного списка:
//+------------------------------------------------------------------+ //| Класс управления объектами чарта | //+------------------------------------------------------------------+ class CChartObjectsControl : public CObject { private: CArrayObj m_list_new_graph_obj; // Список добавленных графических объектов ENUM_TIMEFRAMES m_chart_timeframe; // Период графика long m_chart_id; // Идентификатор графика string m_chart_symbol; // Символ графика bool m_is_graph_obj_event; // Флаг события в списке графических объектов int m_total_objects; // Количество графических объектов int m_last_objects; // Количество графических объектов на прошлой проверке int m_delta_graph_obj; // Разница в количестве графических объектов по сравнению с прошлой проверкой //--- Возвращает имя последнего добавленного на график графического объекта string LastAddedGraphObjName(void); public: //--- Возврат значений переменных ENUM_TIMEFRAMES Timeframe(void) const { return this.m_chart_timeframe; } long ChartID(void) const { return this.m_chart_id; } string Symbol(void) const { return this.m_chart_symbol; } bool IsEvent(void) const { return this.m_is_graph_obj_event; } int TotalObjects(void) const { return this.m_total_objects; } int Delta(void) const { return this.m_delta_graph_obj; } //--- Создаёт новый объект стандартного графического объекта CGStdGraphObj *CreateNewGraphObj(const ENUM_OBJECT obj_type,const long chart_id, const string name); //--- Возвращает список вновь добавленных объектов CArrayObj *GetListNewAddedObj(void) { return &this.m_list_new_graph_obj;} //--- Проверяет объекты на чарте void Refresh(void); //--- Конструкторы CChartObjectsControl(void) { this.m_list_new_graph_obj.Clear(); this.m_list_new_graph_obj.Sort(); this.m_chart_id=::ChartID(); this.m_chart_timeframe=(ENUM_TIMEFRAMES)::ChartPeriod(this.m_chart_id); this.m_chart_symbol=::ChartSymbol(this.m_chart_id); this.m_is_graph_obj_event=false; this.m_total_objects=0; this.m_last_objects=0; this.m_delta_graph_obj=0; } CChartObjectsControl(const long chart_id) { this.m_list_new_graph_obj.Clear(); this.m_list_new_graph_obj.Sort(); this.m_chart_id=chart_id; this.m_chart_timeframe=(ENUM_TIMEFRAMES)::ChartPeriod(this.m_chart_id); this.m_chart_symbol=::ChartSymbol(this.m_chart_id); this.m_is_graph_obj_event=false; this.m_total_objects=0; this.m_last_objects=0; this.m_delta_graph_obj=0; } //--- Сравнивает объекты CChartObjectsControl между собой по идентификатору графика (для сортировки списка по свойству объекта) virtual int Compare(const CObject *node,const int mode=0) const { const CChartObjectsControl *obj_compared=node; return(this.ChartID()>obj_compared.ChartID() ? 1 : this.ChartID()<obj_compared.ChartID() ? -1 : 0); } }; //+------------------------------------------------------------------+
Ранее в методе Refresh() класса управления графическими объектами, мы искали последний добавленный на график графический объект так:
//--- Если добавлен объект на график if(this.m_delta_graph_obj>0) { int index=0; datetime time=0; string name=""; //--- находим последний добавленный графический объект и записываем его индекс for(int j=0;j<this.m_total_objects;j++) { name=::ObjectName(this.ChartID(),j); datetime tm=(datetime)::ObjectGetInteger(this.ChartID(),name,OBJPROP_CREATETIME); if(tm>time) { time=tm; index=j; } } //--- Выбираем последний графический объект по его индексу name=::ObjectName(this.ChartID(),index); if(name!="") {
Теперь весь этот код вынесен в отдельный метод, и сейчас этот же блок кода выглядит таким образом:
//--- Если добавлен объект на график if(this.m_delta_graph_obj>0) { //--- находим последний добавленный графический объект, выбираем его и записываем его имя string name=this.LastAddedGraphObjName(); if(name!="") {
Если имя последнего добавленного на график объекта было получено, то мы создавали объект, его описывающий, устанавливали ему свойства, выводили их в журнал и сразу же удаляли этот объект:
//--- Выбираем последний графический объект по его индексу name=::ObjectName(this.ChartID(),index); if(name!="") { //--- Создаём объект класса графического объекта, соответствующий типу добавленного графического объекта ENUM_OBJECT type=(ENUM_OBJECT)::ObjectGetInteger(this.ChartID(),name,OBJPROP_TYPE); ENUM_OBJECT_DE_TYPE obj_type=ENUM_OBJECT_DE_TYPE(type+OBJECT_DE_TYPE_GSTD_OBJ+1); CGStdGraphObj *obj=this.CreateNewGraphObj(type,this.ChartID(),name); if(obj!=NULL) { //--- Устанавливаем объекту индекс объекта и принадлежность, выводим его краткое описание и удаляем созданный объект obj.SetObjectID(this.m_total_objects); obj.SetBelong(GRAPH_OBJ_BELONG_NO_PROGRAM); obj.Print(); delete obj; } }
Теперь же будем этот объект сохранять в списке вновь добавленных объектов:
//+------------------------------------------------------------------+ //| CChartObjectsControl Проверяет объекты на чарте | //+------------------------------------------------------------------+ void CChartObjectsControl::Refresh(void) { //--- Графические объекты на чарте this.m_total_objects=::ObjectsTotal(this.ChartID()); this.m_delta_graph_obj=this.m_total_objects-this.m_last_objects; //--- Если количество объектов изменилось if(this.m_delta_graph_obj!=0) { //--- Создадим строку и выведем её в журнал с указание идентификатора графика, его символа и периода string txt=", "+(m_delta_graph_obj>0 ? "Added: " : "Deleted: ")+(string)fabs(m_delta_graph_obj)+" obj"; Print(DFUN,"ChartID=",this.ChartID(),", ",this.Symbol(),", ",TimeframeDescription(this.Timeframe()),txt); } //--- Если добавлен объект на график if(this.m_delta_graph_obj>0) { //--- находим последний добавленный графический объект, выбираем его и записываем его имя string name=this.LastAddedGraphObjName(); if(name!="") { //--- Создаём объект класса графического объекта, соответствующий типу добавленного графического объекта ENUM_OBJECT type=(ENUM_OBJECT)::ObjectGetInteger(this.ChartID(),name,OBJPROP_TYPE); ENUM_OBJECT_DE_TYPE obj_type=ENUM_OBJECT_DE_TYPE(type+OBJECT_DE_TYPE_GSTD_OBJ+1); CGStdGraphObj *obj=this.CreateNewGraphObj(type,this.ChartID(),name); if(obj==NULL) return; //--- Устанавливаем объекту его принадлежность и добавляем созданный объект в список новых объектов obj.SetBelong(GRAPH_OBJ_BELONG_NO_PROGRAM); if(this.m_list_new_graph_obj.Search(obj)==WRONG_VALUE) { this.m_list_new_graph_obj.Add(obj); } } } //--- сохранение индекса последнего добавленного графического объекта и разницы по сравнению с прошлой проверкой this.m_last_objects=this.m_total_objects; this.m_is_graph_obj_event=(bool)this.m_delta_graph_obj; } //+------------------------------------------------------------------+
Теперь после каждого вновь добавленного объекта на график, в каждом объекте класса управления графическими объектами у нас будет создаваться список добавленных на график графических объектов. И так — для каждого открытого графика в терминале. Затем в классе-коллекции графических объектов мы сможем просмотреть каждый объект управления графическими объектами и извлечь из его списков все имеющиеся объекты, описывающие созданные графические объекты, и разместить их в список-коллекцию.
В методе для создания нового объекта стандартного графического объекта раскомментируем все оставшиеся строки создания объектов, которые мы сегодня сделали:
//+------------------------------------------------------------------+ //| CChartObjectsControl | //| Создаёт новый объект стандартного графического объекта | //+------------------------------------------------------------------+ CGStdGraphObj *CChartObjectsControl::CreateNewGraphObj(const ENUM_OBJECT obj_type,const long chart_id,const string name) { CGStdGraphObj *obj=NULL; switch((int)obj_type) { //--- Линии case OBJ_VLINE : return new CGStdVLineObj(chart_id,name); case OBJ_HLINE : return new CGStdHLineObj(chart_id,name); case OBJ_TREND : return new CGStdTrendObj(chart_id,name); case OBJ_TRENDBYANGLE : return new CGStdTrendByAngleObj(chart_id,name); case OBJ_CYCLES : return new CGStdCyclesObj(chart_id,name); case OBJ_ARROWED_LINE : return new CGStdArrowedLineObj(chart_id,name); //--- Каналы case OBJ_CHANNEL : return new CGStdChannelObj(chart_id,name); case OBJ_STDDEVCHANNEL : return new CGStdStdDevChannelObj(chart_id,name); case OBJ_REGRESSION : return new CGStdRegressionObj(chart_id,name); case OBJ_PITCHFORK : return new CGStdPitchforkObj(chart_id,name); //--- Ганн case OBJ_GANNLINE : return new CGStdGannLineObj(chart_id,name); case OBJ_GANNFAN : return new CGStdGannFanObj(chart_id,name); case OBJ_GANNGRID : return new CGStdGannGridObj(chart_id,name); //--- Фибоначчи case OBJ_FIBO : return new CGStdFiboObj(chart_id,name); case OBJ_FIBOTIMES : return new CGStdFiboTimesObj(chart_id,name); case OBJ_FIBOFAN : return new CGStdFiboFanObj(chart_id,name); case OBJ_FIBOARC : return new CGStdFiboArcObj(chart_id,name); case OBJ_FIBOCHANNEL : return new CGStdFiboChannelObj(chart_id,name); case OBJ_EXPANSION : return new CGStdExpansionObj(chart_id,name); //--- Эллиотт case OBJ_ELLIOTWAVE5 : return new CGStdElliotWave5Obj(chart_id,name); case OBJ_ELLIOTWAVE3 : return new CGStdElliotWave3Obj(chart_id,name); //--- Фигуры case OBJ_RECTANGLE : return new CGStdRectangleObj(chart_id,name); case OBJ_TRIANGLE : return new CGStdTriangleObj(chart_id,name); case OBJ_ELLIPSE : return new CGStdEllipseObj(chart_id,name); //--- Стрелки case OBJ_ARROW_THUMB_UP : return new CGStdArrowThumbUpObj(chart_id,name); case OBJ_ARROW_THUMB_DOWN : return new CGStdArrowThumbDownObj(chart_id,name); case OBJ_ARROW_UP : return new CGStdArrowUpObj(chart_id,name); case OBJ_ARROW_DOWN : return new CGStdArrowDownObj(chart_id,name); case OBJ_ARROW_STOP : return new CGStdArrowStopObj(chart_id,name); case OBJ_ARROW_CHECK : return new CGStdArrowCheckObj(chart_id,name); case OBJ_ARROW_LEFT_PRICE : return new CGStdArrowLeftPriceObj(chart_id,name); case OBJ_ARROW_RIGHT_PRICE : return new CGStdArrowRightPriceObj(chart_id,name); case OBJ_ARROW_BUY : return new CGStdArrowBuyObj(chart_id,name); case OBJ_ARROW_SELL : return new CGStdArrowSellObj(chart_id,name); case OBJ_ARROW : return new CGStdArrowObj(chart_id,name); //--- Графические объекты case OBJ_TEXT : return new CGStdTextObj(chart_id,name); case OBJ_LABEL : return new CGStdLabelObj(chart_id,name); case OBJ_BUTTON : return new CGStdButtonObj(chart_id,name); case OBJ_CHART : return new CGStdChartObj(chart_id,name); case OBJ_BITMAP : return new CGStdBitmapObj(chart_id,name); case OBJ_BITMAP_LABEL : return new CGStdBitmapLabelObj(chart_id,name); case OBJ_EDIT : return new CGStdEditObj(chart_id,name); case OBJ_EVENT : return new CGStdEventObj(chart_id,name); case OBJ_RECTANGLE_LABEL : return new CGStdRectangleLabelObj(chart_id,name); default : return NULL; } } //+------------------------------------------------------------------+
За пределами тела класса напишем метод, возвращающий имя последнего добавленного на график графического объекта:
//+------------------------------------------------------------------+ //| CChartObjectsControl | //| Возвращает имя последнего добавленного | //| на график графического объекта (объект становится выбранным) | //+------------------------------------------------------------------+ string CChartObjectsControl::LastAddedGraphObjName(void) { int index=0; datetime time=0; for(int i=0;i<this.m_total_objects;i++) { string name=::ObjectName(this.ChartID(),i); datetime tm=(datetime)::ObjectGetInteger(this.ChartID(),name,OBJPROP_CREATETIME); if(tm>time) { time=tm; index=i; } } return ::ObjectName(this.ChartID(),index); } //+------------------------------------------------------------------+
Здесь мы просто в цикле по всем объектам графика ищем максимальное время создания графического объекта, выбираем этот объект по найденному индексу (индекс может не быть максимальным, так как графические объекты в списке терминала хранятся по имени) и возвращаем его имя.
Так как у нас есть два типа графических объектов, которые может создавать и отслеживать библиотека — стандартные графические объекты и объекты, созданные с использованием класса CCanvas, то и в коллекции графических объектов будем вести два списка — список стандартных графических объектов и список объектов на канвасе. По причине, что их свойства достаточно сильно отличаются, и хранить для двух разных типов объектов их параметры в одних и тех же перечислениях свойств объектов мне кажется нецелесообразным.
В приватной секции класса объявим новый список — список всех графических элементов на канвасе — в него впоследствии будем добавлять все создаваемые графические объекты на канвасе. А так как ранее у нас уже был объявлен список всех графических объектов, то его-то мы и будем использовать для хранения стандартных графических объектов:
//+------------------------------------------------------------------+ //| Коллекция графических объектов | //+------------------------------------------------------------------+ class CGraphElementsCollection : public CBaseObj { private: CArrayObj m_list_charts_control; // Список объектов управления чартами CListObj m_list_all_canv_elm_obj; // Список всех графических элементов на канвасе CListObj m_list_all_graph_obj; // Список всех графических объектов bool m_is_graph_obj_event; // Флаг события в списке графических объектов int m_total_objects; // Количество графических объектов int m_delta_graph_obj; // Разница в количестве графических объектов по сравнению с прошлой проверкой //--- Возвращает флаг наличия объекта-графического элемента в списке графических объектов bool IsPresentGraphElmInList(const int id,const ENUM_GRAPH_ELEMENT_TYPE type_obj); //--- Возвращает указатель на объект управления объектами указанного чарта CChartObjectsControl *GetChartObjectCtrlObj(const long chart_id); //--- Создаёт новый объект управления графическими объектами указанного чарта и добавляет его в список CChartObjectsControl *CreateChartObjectCtrlObj(const long chart_id); //--- Обновляет список графических объектов по идентификатору чарта CChartObjectsControl *RefreshByChartID(const long chart_id); //--- Возвращает первый свободный идентификатор графического (1) объекта, (2) элемента на канвасе long GetFreeGraphObjID(void); long GetFreeCanvElmID(void); //--- Добавляет графический объект в коллекцию bool AddGraphObjToCollection(const string source,CChartObjectsControl *obj_control); public:
Приватный метод, обновляющий список графических объектов по идентификатору чарта, теперь у нас будет возвращать указатель на объект управления графическими объектами — это нам потребуется для получения доступа к спискам вновь создаваемых объектов.
Также у нас здесь объявлены ещё три метода: метод, возвращающий первый свободный идентификатор графического объекта и элемента на канвасе, и метод, добавляющий графический объект в коллекцию.
В публичной секции класса вместо метода GetList() сделаем два метода — для возврата списка-коллекции стандартных графических объектов и для возврата списка-коллекции графических элементов на канвасе:
public: //--- Возвращает себя CGraphElementsCollection *GetObject(void) { return &this; } //--- Возвращает полный список-коллекцию стандартных графических объектов "как есть" CArrayObj *GetListGraphObj(void) { return &this.m_list_all_graph_obj; } //--- Возвращает полный список-коллекцию графических элеменов на канвасе "как есть" CArrayObj *GetListCanvElm(void) { return &this.m_list_all_canv_elm_obj;} //--- Возвращает список по выбранному (1) целочисленному, (2) вещественному и (3) строковому свойству, удовлетворяющему сравниваемому критерию CArrayObj *GetList(ENUM_CANV_ELEMENT_PROP_INTEGER property,long value,ENUM_COMPARER_TYPE mode=EQUAL) { return CSelect::ByGraphCanvElementProperty(this.GetListCanvElm(),property,value,mode); } CArrayObj *GetList(ENUM_CANV_ELEMENT_PROP_DOUBLE property,double value,ENUM_COMPARER_TYPE mode=EQUAL){ return CSelect::ByGraphCanvElementProperty(this.GetListCanvElm(),property,value,mode); } CArrayObj *GetList(ENUM_CANV_ELEMENT_PROP_STRING property,string value,ENUM_COMPARER_TYPE mode=EQUAL){ return CSelect::ByGraphCanvElementProperty(this.GetListCanvElm(),property,value,mode); } CArrayObj *GetList(ENUM_GRAPH_OBJ_PROP_INTEGER property,long value,ENUM_COMPARER_TYPE mode=EQUAL) { return CSelect::ByGraphicStdObjectProperty(this.GetListGraphObj(),property,value,mode); } CArrayObj *GetList(ENUM_GRAPH_OBJ_PROP_DOUBLE property,double value,ENUM_COMPARER_TYPE mode=EQUAL) { return CSelect::ByGraphicStdObjectProperty(this.GetListGraphObj(),property,value,mode); } CArrayObj *GetList(ENUM_GRAPH_OBJ_PROP_STRING property,string value,ENUM_COMPARER_TYPE mode=EQUAL) { return CSelect::ByGraphicStdObjectProperty(this.GetListGraphObj(),property,value,mode); } //--- Возвращает количество новых графических объектов, (3) флаг произошедшего изменения в списке графических объектов int NewObjects(void) const { return this.m_delta_graph_obj; } bool IsEvent(void) const { return this.m_is_graph_obj_event; } //--- Конструктор CGraphElementsCollection(); //--- Выводит в журнал описание свойств объекта (full_prop=true - все свойства, false - только поддерживаемые - реализуется в наследниках класса) virtual void Print(const bool full_prop=false,const bool dash=false); //--- Выводит в журнал краткое описание объекта virtual void PrintShort(const bool dash=false,const bool symbol=false); //--- Создаёт список объектов управления чартами, возвращает количество чартов int CreateChartControlList(void); //--- Обновляет список (1) всех графических объектов, (2) на указанном чарте, заполняет данные о количестве новых и устанавливает флаг события void Refresh(void); void Refresh(const long chart_id); }; //+------------------------------------------------------------------+
Соответственно, так как у нас теперь в одном классе находятся два списка-коллекции, то для стандартных графических объектов добавим методы, возвращающие списки по выбранным свойствам объектов.
Приватный метод, обновляющий список графических объектов по идентификатору чарта, теперь возвращает указатель на объект управления графическими объектами:
//+------------------------------------------------------------------+ //| Обновляет список графических объектов по идентификатору чарта | //+------------------------------------------------------------------+ CChartObjectsControl *CGraphElementsCollection::RefreshByChartID(const long chart_id) { //--- Получаем указатель на объект управления графическими объектами CChartObjectsControl *obj=GetChartObjectCtrlObj(chart_id); //--- Если такого объекта нет в списке - создаём новый и добавляем его в список if(obj==NULL) obj=this.CreateChartObjectCtrlObj(chart_id); //--- Если указатель на объект не валидный - уходим из метода if(obj==NULL) return NULL; //--- Обновляем список графических объектов на указанном графике obj.Refresh(); return obj; } //+------------------------------------------------------------------+
В методе, обновляющем список всех графических объектов, теперь будем получать списки вновь добавленных объектов из класса управления графическими объектам и при условии, что есть событие, извлекать объекты из списка и добавлять их в список-коллекцию:
//+------------------------------------------------------------------+ //| Обновляет список всех графических объектов | //+------------------------------------------------------------------+ void CGraphElementsCollection::Refresh(void) { //--- Объявим переменные для поиска графиков long chart_id=0; int i=0; //--- В цикле по всем открытым графикам терминала (не более 100) while(i<CHARTS_MAX) { //--- Получим идентификатор графика chart_id=::ChartNext(chart_id); if(chart_id<0) break; //--- Получаем указатель на объект управления графическими объектами //--- и обновляем список графических объектов по идентификатору чарта CChartObjectsControl *obj_ctrl=this.RefreshByChartID(chart_id); //--- Если указатель получить не удалось - идём к следующему графику if(obj_ctrl==NULL) continue; //--- Если есть событие изменения количества объектов на графике if(obj_ctrl.IsEvent()) { //--- Если добавлен графический объект на график if(obj_ctrl.Delta()>0) { //--- Получаем список добавленных графических объектов и перемещаем их в список-коллекцию //--- (если объект поместить в коллекцию не удалось - идём к следующему объекту) if(!AddGraphObjToCollection(DFUN_ERR_LINE,obj_ctrl)) continue; } //--- Если удалён графический объект else if(obj_ctrl.Delta()<0) { } //--- иначе else { } } //--- Увеличиваем индекс цикла i++; } } //+------------------------------------------------------------------+
Вкратце логика метода расписана в комментариях к коду, и никаких сложностей с её пониманием вызывать не должна.
Методы, возвращающие первый свободный идентификатор графического объекта и графического элемента на канвасе:
//+------------------------------------------------------------------+ //| Возвращает первый свободный идентификатор графического объекта | //+------------------------------------------------------------------+ long CGraphElementsCollection::GetFreeGraphObjID(void) { int index=CSelect::FindGraphicStdObjectMax(this.GetListGraphObj(),GRAPH_OBJ_PROP_ID); CGStdGraphObj *obj=this.m_list_all_graph_obj.At(index); return(obj!=NULL ? obj.ObjectID()+1 : 1); } //+------------------------------------------------------------------+ //| Возвращает первый свободный идентификатор | //| графического элемента на канвасе | //+------------------------------------------------------------------+ long CGraphElementsCollection::GetFreeCanvElmID(void) { int index=CSelect::FindGraphCanvElementMax(this.GetListCanvElm(),CANV_ELEMENT_PROP_ID); CGCnvElement *obj=this.m_list_all_canv_elm_obj.At(index); return(obj!=NULL ? obj.ID()+1 : 1); } //+------------------------------------------------------------------+
Здесь: получаем индекс объекта, имеющего наибольший идентификатор, получаем объект с таким идентификатором из списка по найденному индексу и возвращаем значение его иднтификатора+1. Если объект не найден в списке — возвращаем значение 1, так как пока ещё нет никаких объектов в коллекции, и самому первому будет присвоен идентификатор со значением 1.
Метод, добавляющий графический объект в коллекцию:
//+------------------------------------------------------------------+ //| Добавляет графический объект в коллекцию | //+------------------------------------------------------------------+ bool CGraphElementsCollection::AddGraphObjToCollection(const string source,CChartObjectsControl *obj_control) { //--- Из класса управления графическими объектами получаем список последних добавленных графических объектов CArrayObj *list=obj_control.GetListNewAddedObj(); //--- Если список получить не удалось - сообщаем об этом и возвращаем false if(list==NULL) { CMessage::ToLog(DFUN_ERR_LINE,MSG_GRAPH_OBJ_FAILED_GET_ADDED_OBJ_LIST); return false; } //--- Если список пустой - возвращаем false if(list.Total()==0) return false; //--- Объявляем переменную для хранения результата bool res=true; //--- В цикле по списку вновь добавленных стандартных графических объектов for(int i=0;i<list.Total();i++) { //--- извлекаем из списка очередной объект и CGStdGraphObj *obj=list.Detach(i); //--- если объект получить не удалось - сообщаем об этом, добавляем в результирующую переменную false и идём к следующему if(obj==NULL) { CMessage::ToLog(source,MSG_GRAPH_OBJ_FAILED_DETACH_OBJ_FROM_LIST); res &=false; continue; } //--- если объект не удалось добавить в список-коллекцию - сообщаем об этом, //--- удаляем объект, добавляем в результирующую переменную false и идём к следующему if(!this.m_list_all_graph_obj.Add(obj)) { CMessage::ToLog(source,MSG_LIB_SYS_FAILED_OBJ_ADD_TO_LIST); delete obj; res &=false; continue; } //--- Успешно извлекли объект из списка вновь добавленных графических объектов и добавили его в коллекцию - //--- находим очередной свободный идентификатор объекта, записываем его в свойство и вывоим краткое описание объекта в журнал else { obj.SetObjectID(this.GetFreeGraphObjID()); obj.PrintShort(); } } //--- Возвращаем результат добавления объекта в коллекцию return res; } //+------------------------------------------------------------------+
Логика метода подробно расписана в комментариях к коду и в дополнительных пояснениях не нуждается. В любом случае, все вопросы можно задать в обсуждении к статье. Временно для теста будем выводить в журнал краткое описание добавленного в коллекцию объекта.
На этом создание функционала, добавляющего стандартные графические объекты в коллекцию, завершено.
Тестирование
Для тестирования возьмём советник из прошлой статьи и сохраним его в новой папке \MQL5\Experts\TestDoEasy\Part85\ под новым именем TestDoEasyPart85.mq5. Никаких изменений в советнике делать не будем.
Просто скомпилируем советник, запустим его на графике и будем добавлять на разные графики терминала разные графические объекты — об их создании будут выводиться краткие сообщения в журнал:
Вполне вероятно, что для краткого описания вновь добавленного графического объекта может не хватать каких-либо его данных.
Впоследствии скорее всего немного расширим информацию, выводимую в кратких описаниях разных графических объектов.
Что дальше
В следующей статье продолжим развитие класса-коллекции графических объектов и объектов, описывающих стандартные графические объекты.
При возникновении вопросов, замечаний и пожеланий вы можете озвучить их в комментариях к статье.
*Статьи этой серии:
Графика в библиотеке DoEasy (Часть 73): Объект-форма графического элемента
Графика в библиотеке DoEasy (Часть 74): Базовый графический элемент на основе класса CCanvas
Графика в библиотеке DoEasy (Часть 75): Методы работы с примитивами и текстом в базовом графическом элементе
Графика в библиотеке DoEasy (Часть 76): Объект Форма и предопределённые цветовые темы
Графика в библиотеке DoEasy (Часть 77): Класс объекта Тень
Графика в библиотеке DoEasy (Часть 78): Принципы анимации в библиотеке. Нарезка изображений
Графика в библиотеке DoEasy (Часть 79): Класс объекта "Кадр анимации" и его объекты-наследники
Графика в библиотеке DoEasy (Часть 80): Класс объекта "Кадр геометрической анимации"
Графика в библиотеке DoEasy (Часть 81): Интегрируем графику в объекты библиотеки
Графика в библиотеке DoEasy (Часть 82): Рефакторинг объектов библиотеки и коллекция графических объектов
Графика в библиотеке DoEasy (Часть 83): Класс абстрактного стандартного графического объекта
Графика в библиотеке DoEasy (Часть 84): Классы-наследники абстрактного стандартного графического объекта
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования