English 中文 Español Deutsch 日本語 Português
Графика в библиотеке DoEasy (Часть 85): Коллекция графических объектов - добавляем вновь создаваемые

Графика в библиотеке DoEasy (Часть 85): Коллекция графических объектов - добавляем вновь создаваемые

MetaTrader 5Примеры | 15 октября 2021, 13:57
1 745 0
Artyom Trishkin
Artyom Trishkin

Содержание


Концепция

У нас уже созданы некоторые классы объектов, наследуемых от класса абстрактного графического объекта. Такие объекты из групп "Линии", "Каналы", "Ганн", "Фибоначчи" и "Эллиотт" мы сделали в прошлой статье. Сегодня мы допишем классы объектов остальных групп стандартных графических объектов: "Фигуры", "Стрелки" и "Графические объекты". Помимо создания объектов перечисленных групп сделаем функционал в классе коллекции графических объектов для добавления в список-коллекцию вновь создаваемых вручную новых графических объектов на графике в клиентском терминале.


Доработка классов библиотеки

В первую очередь скажу, что мне указали на допущенную мной досадную ошибку в английском слове "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. Никаких изменений в советнике делать не будем.
Просто скомпилируем советник, запустим его на графике и будем добавлять на разные графики терминала разные графические объекты — об их создании будут выводиться краткие сообщения в журнал:


Вполне вероятно, что для краткого описания вновь добавленного графического объекта может не хватать каких-либо его данных.
Впоследствии скорее всего немного расширим информацию, выводимую в кратких описаниях разных графических объектов.


Что дальше

В следующей статье продолжим развитие класса-коллекции графических объектов и объектов, описывающих стандартные графические объекты.

Ниже прикреплены все файлы текущей версии библиотеки и файл тестового советника для MQL5. Их можно скачать и протестировать всё самостоятельно.

При возникновении вопросов, замечаний и пожеланий вы можете озвучить их в комментариях к статье.

К содержанию

*Статьи этой серии:

Графика в библиотеке 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): Классы-наследники абстрактного стандартного графического объекта

Прикрепленные файлы |
MQL5.zip (4210.27 KB)
Анализ спреда по ценам Bid и Ask в MetaTrader 5 Анализ спреда по ценам Bid и Ask в MetaTrader 5
В статье рассказываю об инструменте, который позволит увидеть уровни спреда, т.е. разницу между ценами бид и аск у вашего брокера. Тиковые данные в MetaTrader 5 позволяют проанализировать, какие же исторические значения спредов по ценам бид и аск были на самом деле. При этом не нужно искать текущее значение спреда, потому что его можно получить через отображение линий цен бид и аск.
Многослойный перцептрон и алгоритм обратного распространения ошибки (Часть II): Реализация на Python и интеграция с MQL5 Многослойный перцептрон и алгоритм обратного распространения ошибки (Часть II): Реализация на Python и интеграция с MQL5
Уже доступен пакет Python для разработки интеграции с MQL, что открывает двери для многих возможностей, таких как изучение данных и создание и использование моделей машинного обучения. Эта встроенная интеграция MQL5 в Python открывает для нас много возможностей, которые позволяют построить от простой линейной регрессии до моделей глубокого обучения. Давайте разберемся, как установить и подготовить среду разработки и использовать некоторые библиотеки машинного обучения.
Изучаем возможности создания разноцветных свечных графиков Изучаем возможности создания разноцветных свечных графиков
В этой статье мы рассмотрим возможности создания кастомных свечных индикаторов, а также поговорим об их преимуществах и недостатках.
Стать хорошим программистом (Часть 4): повышаем скорость программирования Стать хорошим программистом (Часть 4): повышаем скорость программирования
Я полагаю, каждый разработчик хочет писать код быстрее. При этом возможность быстро и эффективно писать код — это не какая-то особая врожденная способность, доступная только избранным. Это навык, которым может овладеть любой программист, независимо от предыдущего опыта и объема набранных на клавиатуре текстов.