Графика в библиотеке DoEasy (Часть 84): Классы-наследники абстрактного стандартного графического объекта

1 октября 2021, 18:38
Artyom Trishkin
0
1 072

Содержание


Концепция

В прошлой статье мы создали класс объекта абстрактного стандартного графического объекта терминала. Объект этого класса описывает общие для всех графических объектов свойства. Т.е. это просто некий графический объект. Для уточнения его принадлежности к реальному графическому объекту нам необходимо унаследоваться от него, и в классе объекта-наследника прописать свойства, присущие этому конкретному графическому объекту. А какие-то свойства наоборот — ограничить к ним доступ, так как они не являются параметрами данного конкретного графического объекта, но имеются в наборе свойств абстрактного объекта.

Такая концепция построения объектов принята для практически всех объектов библиотеки, и классы объектов графики не будут исключением.
Для указания принадлежности создаваемых сегодня объектов к группе графических объектов мы возьмём набор групп стандартных графических объектов из терминала и добавим новое свойство абстрактному графическому объекту — группа, к которой принадлежит описываемый классом-наследником графический объект:


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

Здесь речь идёт о, например, точках привязки графического объекта. Свойства, хранящиеся в абстрактном графическом объекте, находятся в массивах свойств объекта, где каждое поле массива описывает одно какое-либо свойство. Например, время. И это время по умолчанию берётся от первой точки привязки графического объекта. Все остальные точки привязки можно получить из функции ObjectGetInteger(), указав индекс нужной точки модификатором свойства. А наш класс может хранить только одно значение. Соответственно, здесь нам нужно будет создать, например, массив однотипных свойств и обращаться к нужным свойствам точно так же, как и по модификатору свойства.
Так как объём статьи всё-таки не безразмерен, поэтому мы разделим разработку на несколько этапов, где постепенно придём к законченному решению.


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

В файле \MQL5\Include\DoEasy\Defines.mqh впишем перечисление групп стандартных графических объектов:

//+------------------------------------------------------------------+
//| Список типов графических элементов                               |
//+------------------------------------------------------------------+
enum ENUM_GRAPH_ELEMENT_TYPE
  {
   GRAPH_ELEMENT_TYPE_STANDART,                       // Стандартный графический объект
   GRAPH_ELEMENT_TYPE_ELEMENT,                        // Элемент
   GRAPH_ELEMENT_TYPE_SHADOW_OBJ,                     // Объект тени
   GRAPH_ELEMENT_TYPE_FORM,                           // Форма
   GRAPH_ELEMENT_TYPE_WINDOW,                         // Окно
  };
//+------------------------------------------------------------------+
//| Группа графического объекта                                      |
//+------------------------------------------------------------------+
enum ENUM_GRAPH_OBJ_GROUP
  {
   GRAPH_OBJ_GROUP_LINES,                             // Линии
   GRAPH_OBJ_GROUP_CHANNELS,                          // Каналы
   GRAPH_OBJ_GROUP_GANN,                              // Ганн
   GRAPH_OBJ_GROUP_FIBO,                              // Фибоначчи
   GRAPH_OBJ_GROUP_ELLIOTT,                           // Эллиотт
   GRAPH_OBJ_GROUP_SHAPES,                            // Фигуры
   GRAPH_OBJ_GROUP_ARROWS,                            // Стрелки
   GRAPH_OBJ_GROUP_GRAPHICAL,                         // Графические объекты
  };
//+------------------------------------------------------------------+
//| Целочисленные свойства стандартного графического объекта         |
//+------------------------------------------------------------------+

Добавим это новое свойство в список целочисленных свойств объекта и увеличим количество целочисленных свойств на 1 (с 51 до 52):

//+------------------------------------------------------------------+
//| Целочисленные свойства стандартного графического объекта         |
//+------------------------------------------------------------------+
enum ENUM_GRAPH_OBJ_PROP_INTEGER
  {
   //--- Дополнительные свойства
   GRAPH_OBJ_PROP_ID = 0,                             // Идентификатор объекта
   GRAPH_OBJ_PROP_TYPE,                               // Тип графичесеого объекта (ENUM_OBJECT)
   GRAPH_OBJ_PROP_ELEMENT_TYPE,                       // Тип графического элемента (ENUM_GRAPH_ELEMENT_TYPE)
   GRAPH_OBJ_PROP_GROUP,                              // Группа графического объекта (ENUM_GRAPH_OBJ_GROUP)
   GRAPH_OBJ_PROP_BELONG,                             // Принадлежность графического объекта
   GRAPH_OBJ_PROP_CHART_ID,                           // Идентификатор графика
   GRAPH_OBJ_PROP_WND_NUM,                            // Номер подокна графика
   GRAPH_OBJ_PROP_NUM,                                // Номер объекта в списке
   //--- Общие свойства всех графических объектов
   GRAPH_OBJ_PROP_CREATETIME,                         // Время создания объекта
   GRAPH_OBJ_PROP_TIMEFRAMES,                         // Видимость объекта на таймфреймах
   GRAPH_OBJ_PROP_BACK,                               // Объект на заднем плане
   GRAPH_OBJ_PROP_ZORDER,                             // Приоритет графического объекта на получение события нажатия мышки на графике
   GRAPH_OBJ_PROP_HIDDEN,                             // Запрет на показ имени графического объекта в списке объектов терминала
   GRAPH_OBJ_PROP_SELECTED,                           // Выделенность объекта
   GRAPH_OBJ_PROP_SELECTABLE,                         // Доступность объекта
//--- Свойства, принадлежащие различным графическим объектам
   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_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)              // Количество неиспользуемых в сортировке целочисленных свойств
//+------------------------------------------------------------------+


В список возможных критериев сортировки графических объектов впишем сортировку по новому свойству:

//+------------------------------------------------------------------+
//| Возможные критерии сортировки графических объектов               |
//+------------------------------------------------------------------+
#define FIRST_GRAPH_OBJ_DBL_PROP  (GRAPH_OBJ_PROP_INTEGER_TOTAL-GRAPH_OBJ_PROP_INTEGER_SKIP)
#define FIRST_GRAPH_OBJ_STR_PROP  (GRAPH_OBJ_PROP_INTEGER_TOTAL-GRAPH_OBJ_PROP_INTEGER_SKIP+GRAPH_OBJ_PROP_DOUBLE_TOTAL-GRAPH_OBJ_PROP_DOUBLE_SKIP)
enum ENUM_SORT_GRAPH_OBJ_MODE
  {
//--- Сортировка по целочисленным свойствам
   SORT_BY_GRAPH_OBJ_ID = 0,                             // Сортировать по идентификатору объекта
   SORT_BY_GRAPH_OBJ_TYPE,                               // Сортировать по типу объекта
   SORT_BY_GRAPH_OBJ_ELEMENT_TYPE,                       // Сортировать по типу графического элемента
   SORT_BY_GRAPH_OBJ_GROUP,                              // Сортировать по группе графического объекта
   SORT_BY_GRAPH_OBJ_BELONG,                             // Сортировать по принадлежности графического объекта
   SORT_BY_GRAPH_OBJ_CHART_ID,                           // Сортировать по идентификатору графика
   SORT_BY_GRAPH_OBJ_WND_NUM,                            // Сортировать по номеру подокна графика
   SORT_BY_GRAPH_OBJ_NUM,                                // Сортировать по номеру объекта в списке
   SORT_BY_GRAPH_OBJ_CREATETIME,                         // Сортировать по времени создания объекта
   SORT_BY_GRAPH_OBJ_TIMEFRAMES,                         // Сортировать по видимости объекта на таймфреймах
   SORT_BY_GRAPH_OBJ_BACK,                               // Сортировать по свойству "Объект на заднем плане"
   SORT_BY_GRAPH_OBJ_ZORDER,                             // Сортировать по приоритету графического объекта на получение события нажатия мышки на графике
   SORT_BY_GRAPH_OBJ_HIDDEN,                             // Сортировать по запрету на показ имени графического объекта в списке объектов терминала
   SORT_BY_GRAPH_OBJ_SELECTED,                           // Сортировать по свойству"Выделенность объекта"
   SORT_BY_GRAPH_OBJ_SELECTABLE,                         // Сортировать по свойству "Доступность объекта"
   SORT_BY_GRAPH_OBJ_TIME,                               // Сортировать по координате времени
   SORT_BY_GRAPH_OBJ_COLOR,                              // Сортировать по цвету
   SORT_BY_GRAPH_OBJ_STYLE,                              // Сортировать по стилю
   SORT_BY_GRAPH_OBJ_WIDTH,                              // Сортировать по толщине линии
   SORT_BY_GRAPH_OBJ_FILL,                               // Сортировать по свойству"Заливка объекта цветом"
   SORT_BY_GRAPH_OBJ_READONLY,                           // Сортировать по возможности редактирования текста в объекте Edit
   SORT_BY_GRAPH_OBJ_LEVELS,                             // Сортировать по количеству уровней
   SORT_BY_GRAPH_OBJ_LEVELCOLOR,                         // Сортировать по цвету линии-уровня
   SORT_BY_GRAPH_OBJ_LEVELSTYLE,                         // Сортировать по стилю линии-уровня
   SORT_BY_GRAPH_OBJ_LEVELWIDTH,                         // Сортировать по толщине линии-уровня
   SORT_BY_GRAPH_OBJ_ALIGN,                              // Сортировать по свойству "Горизонтальное выравнивание текста в объекте "Поле ввода""
   SORT_BY_GRAPH_OBJ_FONTSIZE,                           // Сортировать по размеру шрифта
   SORT_BY_GRAPH_OBJ_RAY_LEFT,                           // Сортировать по свойству "Луч продолжается влево"
   SORT_BY_GRAPH_OBJ_RAY_RIGHT,                          // Сортировать по свойству"Луч продолжается вправо"
   SORT_BY_GRAPH_OBJ_RAY,                                // Сортировать по свойству "Вертикальная линия продолжается на все окна графика"
   SORT_BY_GRAPH_OBJ_ELLIPSE,                            // Сортировать по свойству "Отображение полного эллипса для объекта "Дуги Фибоначчи"
   SORT_BY_GRAPH_OBJ_ARROWCODE,                          // Сортировать по коду стрелки для объекта "Стрелка"
   SORT_BY_GRAPH_OBJ_ANCHOR,                             // Сортировать по положению точки привязки графического объекта
   SORT_BY_GRAPH_OBJ_XDISTANCE,                          // Сортировать по дистанции в пикселях по оси X от угла привязки
   SORT_BY_GRAPH_OBJ_YDISTANCE,                          // Сортировать по дистанции в пикселях по оси Y от угла привязки
   SORT_BY_GRAPH_OBJ_DIRECTION,                          // Сортировать по свойству "Тренд объекта Ганна"
   SORT_BY_GRAPH_OBJ_DEGREE,                             // Сортировать по свойству "Уровень волновой разметки Эллиотта"
   SORT_BY_GRAPH_OBJ_DRAWLINES,                          // Сортировать по свойству "Отображение линий для волновой разметки Эллиотта"
   SORT_BY_GRAPH_OBJ_STATE,                              // Сортировать по состоянию кнопки (Нажата/Отжата)
   SORT_BY_GRAPH_OBJ_OBJ_CHART_ID,                       // Сортировать по идентификатору объекта "График".
   SORT_BY_GRAPH_OBJ_CHART_OBJ_PERIOD,                   // Сортировать по периоду для объекта "График"
   SORT_BY_GRAPH_OBJ_CHART_OBJ_DATE_SCALE,               // Сортировать по признаку отображения шкалы времени для объекта "График"
   SORT_BY_GRAPH_OBJ_CHART_OBJ_PRICE_SCALE,              // Сортировать по признаку отображения ценовой шкалы для объекта "График"
   SORT_BY_GRAPH_OBJ_CHART_OBJ_CHART_SCALE,              // Сортировать по масштабу для объекта "График"
   SORT_BY_GRAPH_OBJ_XSIZE,                              // Сортировать по ширине объекта по оси X в пикселях
   SORT_BY_GRAPH_OBJ_YSIZE,                              // Сортировать по высоте объекта по оси Y в пикселях
   SORT_BY_GRAPH_OBJ_XOFFSET,                            // Сортировать по X-координате левого верхнего угла прямоугольной области видимости
   SORT_BY_GRAPH_OBJ_YOFFSET,                            // Сортировать по Y-координате левого верхнего угла прямоугольной области видимости
   SORT_BY_GRAPH_OBJ_BGCOLOR,                            // Сортировать по цвету фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL
   SORT_BY_GRAPH_OBJ_CORNER,                             // Сортировать по углу графика для привязки графического объекта
   SORT_BY_GRAPH_OBJ_BORDER_TYPE,                        // Сортировать по типу рамки для объекта "Прямоугольная рамка"
   SORT_BY_GRAPH_OBJ_BORDER_COLOR,                       // Сортировать по цвету рамки для объекта OBJ_EDIT и OBJ_BUTTON
//--- Сортировка по вещественным свойствам
   SORT_BY_GRAPH_OBJ_PRICE = FIRST_GRAPH_OBJ_DBL_PROP,   // Сортировать по координате цены
   SORT_BY_GRAPH_OBJ_LEVELVALUE,                         // Сортировать по значению уровня
   SORT_BY_GRAPH_OBJ_SCALE,                              // Сортировать по масштабу (свойство объектов Ганна и объекта "Дуги Фибоначчи")
   SORT_BY_GRAPH_OBJ_ANGLE,                              // Сортировать по углу
   SORT_BY_GRAPH_OBJ_DEVIATION,                          // Сортировать по отклонению для канала стандартного отклонения
//--- Сортировка по строковым свойствам
   SORT_BY_GRAPH_OBJ_NAME = FIRST_GRAPH_OBJ_STR_PROP,    // Сортировать по имени объекта
   SORT_BY_GRAPH_OBJ_TEXT,                               // Сортировать по описанию объекта
   SORT_BY_GRAPH_OBJ_TOOLTIP,                            // Сортировать по тексту всплывающей подсказки
   SORT_BY_GRAPH_OBJ_LEVELTEXT,                          // Сортировать по описанию уровня
   SORT_BY_GRAPH_OBJ_FONT,                               // Сортировать по шрифту
   SORT_BY_GRAPH_OBJ_BMPFILE,                            // Сортировать по имени BMP-файла для объекта "Графическая метка"
   SORT_BY_GRAPH_OBJ_CHART_OBJ_SYMBOL,                   // Сортировать по символу для объекта "График" 
  };
//+------------------------------------------------------------------+


В файле \MQL5\Include\DoEasy\Data.mqh впишем индексы новых сообщений библиотеки:

//+------------------------------------------------------------------+
//| Список индексов текстовых сообщений библиотеки                   |
//+------------------------------------------------------------------+
enum ENUM_MESSAGES_LIB
  {
   MSG_LIB_PARAMS_LIST_BEG=ERR_USER_ERROR_FIRST,      // Начало списка параметров
   MSG_LIB_PARAMS_LIST_END,                           // Конец списка параметров
   MSG_LIB_PROP_NOT_SUPPORTED,                        // Свойство не поддерживается
   MSG_LIB_PROP_NOT_SUPPORTED_MQL4,                   // Свойство не поддерживается в MQL4
   MSG_LIB_PROP_NOT_SUPPORTED_MT5_LESS_2155,          // Свойство не поддерживается в MetaTrader5 версии ниже 2155
   MSG_LIB_PROP_NOT_SUPPORTED_POSITION,               // Свойство не поддерживается у позиции
   MSG_LIB_PROP_NOT_SUPPORTED_PENDING,                // Свойство не поддерживается у отложенного ордера
   MSG_LIB_PROP_NOT_SUPPORTED_MARKET,                 // Свойство не поддерживается у маркет-ордера
   MSG_LIB_PROP_NOT_SUPPORTED_MARKET_HIST,            // Свойство не поддерживается у исторического маркет-ордера
   MSG_LIB_PROP_NOT_SET,                              // Значение не задано
   MSG_LIB_PROP_EMPTY,                                // Отсутствует
   MSG_LIB_PROP_AUTO,                                 // Формируется терминалом
   MSG_LIB_PROP_AS_IN_ORDER,                          // В соответствии с режимом истечения ордера

...

   MSG_LIB_TEXT_FAILED_ADD_TO_LIST,                   // не удалось добавить в список
   MSG_LIB_TEXT_TIME_UNTIL_THE_END_DAY,               // Будет использоваться время действия ордера до конца текущего дня
   MSG_LIB_TEXT_OBJ_NO_PERIODS,                       // Не показывается ни на одном таймфрейме
   MSG_LIB_TEXT_OBJ_ALL_PERIODS,                      // Рисуется на всех таймфреймах
   
   MSG_LIB_TEXT_JANUARY,                              // Январь
   MSG_LIB_TEXT_FEBRUARY,                             // Февраль

...

   MSG_GRAPH_OBJ_BELONG_PROGRAM,                      // Графический объект принадлежит программе
   MSG_GRAPH_OBJ_BELONG_NO_PROGRAM,                   // Графический объект не принадлежит программе
//---
   MSG_GRAPH_STD_OBJ_ANY,                             // Абстрактный графический объект
   MSG_GRAPH_STD_OBJ_VLINE,                           // Вертикальная линия
   MSG_GRAPH_STD_OBJ_HLINE,                           // Горизонтальная линия

...

   MSG_GRAPH_OBJ_PROP_BMPFILE,                        // Имя BMP-файла для объекта "Графическая метка"
   MSG_GRAPH_OBJ_PROP_SYMBOL,                         // Символ для объекта "График"
   
   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,                    // (Координата щелчка по графику)
   
  };
//+------------------------------------------------------------------+

и текстовые сообщения, соответствующие вновь добавленным индексам:

string messages_library[][TOTAL_LANG]=
  {
   {"Начало списка параметров","The beginning of the parameter list"},
   {"Конец списка параметров","End of the parameter list"},
   {"Свойство не поддерживается","Property is not support"},
   {"Свойство не поддерживается в MQL4","Property is not supported in MQL4"},
   {"Свойство не поддерживается в MetaTrader5 версии ниже 2155","The property is not supported in MetaTrader5, build lower than 2155"},
   {"Свойство не поддерживается у позиции","Property not supported for position"},
   {"Свойство не поддерживается у отложенного ордера","The property is not supported for a pending order"},
   {"Свойство не поддерживается у маркет-ордера","The property is not supported for a market-order"},
   {"Свойство не поддерживается у исторического маркет-ордера","The property is not supported for a history market-order"},
   {"Значение не задано","Value not set"},
   {"Отсутствует","Not set"},
   {"Формируется терминалом","Formed by the terminal"},
   {"В соответствии с режимом истечения ордера","In accordance with the order expiration mode"},

...

   {"не удалось добавить в список","failed to add to the list"},
   {"Будет использоваться время действия ордера до конца текущего дня","The order validity time until the end of the current day will be used"},
   {"Не показывается ни на одном таймфрейме","Not shown on any timeframe"},
   {"Рисуется на всех таймфреймах","Drawn on all timeframes"},

   {"Январь","January"},
   {"Февраль","February"},

...

   {"Графический объект принадлежит программе","The graphic object belongs to the program"},
   {"Графический объект не принадлежит программе","The graphic object does not belong to the program"},
   
   {"Абстрактный графический объект","Abstract graphic object"},
   {"Вертикальная линия","Vertical Line"},
   {"Горизонтальная линия","Horizontal Line"},

...

   {"Имя BMP-файла","BMP-file name"},
   {"Символ графика","Chart Symbol"},
   
   {"Группа графического объекта","Graphic object group"},
   {"Линии","Lines"},
   {"Каналы","Channels"},
   {"Ганн","Gann"},
   {"Фибоначчи","Fibonacci"},
   {"Эллиотт","Elliott"},
   {"Фигуры","Shapes"},
   {"Стрелки","Arrows"},
   {"Графические объекты","Graphical"},
   
   {"(Координата щелчка по графику)","(Chart click coordinate)"},

  };
//+---------------------------------------------------------------------+


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

Для того, чтобы мы могли вывести описание установленных флагов видимости для графического объекта, в файле сервисных функций
\MQL5\Include\DoEasy\Services\DELib.mqh напишем функцию, которая возвращает факт установленного или снятого флага для запрашиваемого таймфрейма:

//+------------------------------------------------------------------+
//| Возвращает флаг отображения графического                         |
//| объекта на указанном таймфрейме графика                          |
//+------------------------------------------------------------------+
bool IsVisibleOnTimeframe(const ENUM_TIMEFRAMES timeframe,const int flags)
  {
   if(flags==OBJ_ALL_PERIODS)
      return true;
   if(flags==OBJ_NO_PERIODS)
      return false;
   int flag=0;
   switch((int)timeframe)
     {
      case PERIOD_M1    :  flag=0x00000001;  break;
      case PERIOD_M2    :  flag=0x00000002;  break;
      case PERIOD_M3    :  flag=0x00000004;  break;
      case PERIOD_M4    :  flag=0x00000008;  break;
      case PERIOD_M5    :  flag=0x00000010;  break;
      case PERIOD_M6    :  flag=0x00000020;  break;
      case PERIOD_M10   :  flag=0x00000040;  break;
      case PERIOD_M12   :  flag=0x00000080;  break;
      case PERIOD_M15   :  flag=0x00000100;  break;
      case PERIOD_M20   :  flag=0x00000200;  break;
      case PERIOD_M30   :  flag=0x00000400;  break;
      case PERIOD_H1    :  flag=0x00000800;  break;
      case PERIOD_H2    :  flag=0x00001000;  break;
      case PERIOD_H3    :  flag=0x00002000;  break;
      case PERIOD_H4    :  flag=0x00004000;  break;
      case PERIOD_H6    :  flag=0x00008000;  break;
      case PERIOD_H8    :  flag=0x00010000;  break;
      case PERIOD_H12   :  flag=0x00020000;  break;
      case PERIOD_D1    :  flag=0x00040000;  break;
      case PERIOD_W1    :  flag=0x00080000;  break;
      case PERIOD_MN1   :  flag=0x00100000;  break;
      default:
        break;
     }
   return((flags & flag)==flag);
  }
//+------------------------------------------------------------------+

Если в переданном в функцию значении установлены флаги всех таймфреймов (OBJ_ALL_PERIODS), то однозначно объект видим на всех таймфреймах, и мы сразу же возвращаем true без проверки флагов.
Если все флаги всех таймфреймов сняты (OBJ_NO_PERIODS) — однозначно объект полностью скрыт для отображения на всех таймфреймах — сразу же возвращаем false.
Далее, в зависимости от переданного в функцию значения таймфрейма, устанавливаем переменной flag соответствующее значение, с которым затем будем сравнивать биты переменной flags.
После получения значения битовой маски, сравниваем её значение со значением, полученным при наложении битовой маски на значение переменной flags. И возвращаем результат этого побитового сравнения. Функция вернёт true только в том случае, если в переменной flags установлен проверяемый по маске бит.

Мы определили группы графических объектов. Теперь добавим это новое значение в свойства графического объекта.

В файле класса базового объекта всех графических объектов библиотеки \MQL5\Include\DoEasy\Objects\Graph\GBaseObj.mqh, в его защищённой секции, объявим переменную для хранения группы графического объекта:

//+------------------------------------------------------------------+
//| Класс базового объекта графических объектов библиотеки           |
//+------------------------------------------------------------------+
class CGBaseObj : public CObject
  {
private:

protected:
   ENUM_OBJECT       m_type_graph_obj;                   // Тип графического объекта
   ENUM_GRAPH_ELEMENT_TYPE m_type_element;               // Тип графического элемента
   ENUM_GRAPH_OBJ_BELONG m_belong;                       // Принадлежность программе
   ENUM_GRAPH_OBJ_GROUP m_group;                         // Группа графического объекта
   string            m_name_prefix;                      // Префикс имени объекта
   string            m_name;                             // Имя объекта
   long              m_chart_id;                         // Идентификатор графика объекта
   long              m_object_id;                        // Идентификатор объекта
   long              m_zorder;                           // Приоритет графического объекта на получение события нажатия мышки
   int               m_subwindow;                        // Номер подокна
   int               m_shift_y;                          // Смещение координаты Y для подокна
   int               m_type;                             // Тип объекта
   int               m_timeframes_visible;               // Видимость объекта на таймфреймах (набор флагов)
   int               m_digits;                           // Количество знаков после запятой в котировке символа чарта
   bool              m_visible;                          // Видимость объекта
   bool              m_back;                             // Флаг "Объект на заднем плане"
   bool              m_selected;                         // Флаг "Выделенность объекта"
   bool              m_selectable;                       // Флаг "Доступность объекта"
   bool              m_hidden;                           // Флаг "Запрет на показ имени графического объекта в списке объектов терминала"
   datetime          m_create_time;                      // Время создания объекта

В публичной секции напишем метод для установки группы графического объекта:

public:
//--- Установка значений переменных класса
   void              SetObjectID(const long value)             { this.m_object_id=value;           }
   void              SetBelong(const ENUM_GRAPH_OBJ_BELONG belong){ this.m_belong=belong;          }
   void              SetTypeGraphObject(const ENUM_OBJECT obj) { this.m_type_graph_obj=obj;        }
   void              SetTypeElement(const ENUM_GRAPH_ELEMENT_TYPE type) { this.m_type_element=type;}
   void              SetGroup(const ENUM_GRAPH_OBJ_GROUP group){ this.m_group=group;               }
   void              SetName(const string name)                { this.m_name=name;                 }
   void              SetChartID(const long chart_id)           { this.m_chart_id=chart_id;         }
   void              SetDigits(const int value)                { this.m_digits=value;              }

и метод для возврата группы:

//--- Возврат значений переменных класса
   ENUM_GRAPH_ELEMENT_TYPE TypeGraphElement(void)        const { return this.m_type_element;       }
   ENUM_GRAPH_OBJ_BELONG   Belong(void)                  const { return this.m_belong;             }
   ENUM_GRAPH_OBJ_GROUP    Group(void)                   const { return this.m_group;              }
   ENUM_OBJECT       TypeGraphObject(void)               const { return this.m_type_graph_obj;     }
   datetime          TimeCreate(void)                    const { return this.m_create_time;        }
   string            Name(void)                          const { return this.m_name;               }
   long              ChartID(void)                       const { return this.m_chart_id;           }
   long              ObjectID(void)                      const { return this.m_object_id;          }
   long              Zorder(void)                        const { return this.m_zorder;             }
   int               SubWindow(void)                     const { return this.m_subwindow;          }
   int               ShiftY(void)                        const { return this.m_shift_y;            }
   int               VisibleOnTimeframes(void)           const { return this.m_timeframes_visible; }
   int               Digits(void)                        const { return this.m_digits;             }
   bool              IsBack(void)                        const { return this.m_back;               }
   bool              IsSelected(void)                    const { return this.m_selected;           }
   bool              IsSelectable(void)                  const { return this.m_selectable;         }
   bool              IsHidden(void)                      const { return this.m_hidden;             }
   bool              IsVisible(void)                     const { return this.m_visible;            }

Ранее написанный метод, возвращающий флаг видимости объекта на указанном таймфрейме, удалим из публичной секции класса:

//--- Возвращает флаг видимости объекта на указанном таймфрейме
   bool              IsVisibleOnTimeframe(const ENUM_TIMEFRAMES timeframe) const
                       { return((this.m_timeframes_visible & timeframe)==timeframe);               }
//--- Возвращает тип графического объекта (ENUM_OBJECT), рассчитанного из значения типа объекта (ENUM_OBJECT_DE_TYPE), переданного в метод
   ENUM_OBJECT       GraphObjectType(const ENUM_OBJECT_DE_TYPE obj_type) const
                       { 
                        return ENUM_OBJECT(obj_type-OBJECT_DE_TYPE_GSTD_OBJ-1);
                       }

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

И далее объявим метод, возвращающий описание группы графического объекта:

//--- Возвращает тип графического объекта (ENUM_OBJECT), рассчитанного из значения типа объекта (ENUM_OBJECT_DE_TYPE), переданного в метод
   ENUM_OBJECT       GraphObjectType(const ENUM_OBJECT_DE_TYPE obj_type) const
                       { 
                        return ENUM_OBJECT(obj_type-OBJECT_DE_TYPE_GSTD_OBJ-1);
                       }
   
//--- Возвращает описание типа графического (1) объекта, (2) элемента, (3) принадлежности, (4) группы графического объекта
string               TypeGraphObjectDescription(void);
string               TypeElementDescription(void);
string               BelongDescription(void);
string               GroupDescription(void);

//--- Виртуальный метод, возвращающий тип объекта
   virtual int       Type(void)                          const { return this.m_type;               }

//--- Конструктор/деструктор
                     CGBaseObj();
                    ~CGBaseObj(){;}
  };
//+------------------------------------------------------------------+

За пределами тела класса напишем его реализацию:

//+------------------------------------------------------------------+
//| Возвращает описание группы графического объекта                  |
//+------------------------------------------------------------------+
string CGBaseObj::GroupDescription(void)
  {
   return
     (
      this.Group()==GRAPH_OBJ_GROUP_LINES    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_LINES)     :
      this.Group()==GRAPH_OBJ_GROUP_CHANNELS ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_CHANNELS)  :
      this.Group()==GRAPH_OBJ_GROUP_GANN     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_GANN)      :
      this.Group()==GRAPH_OBJ_GROUP_FIBO     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_FIBO)      :
      this.Group()==GRAPH_OBJ_GROUP_ELLIOTT  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_ELLIOTT)   :
      this.Group()==GRAPH_OBJ_GROUP_SHAPES   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_SHAPES)    :
      this.Group()==GRAPH_OBJ_GROUP_ARROWS   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_ARROWS)    :
      this.Group()==GRAPH_OBJ_GROUP_GRAPHICAL?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP_GRAPHICAL) :
      "Unknown"
     );
  }
//+------------------------------------------------------------------+

Здесь всё просто: в зависимости от значения, записанного в переменной m_group и возвращаемого методом Group(), возвращаем соответствующее текстовое сообщение.

Доработаем класс абстрактного графического объекта в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdGraphObj.mqh.

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

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

//--- Выводит в журнал описание свойств объекта (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);
//--- Возвращает краткое наименование объекта
   virtual string    Header(const bool symbol=false);
//--- Возвращает описание (1) типа (ENUM_OBJECT), координаты (2) цены, (3) времени графического объекта
   virtual string    TypeDescription(void)                                    const { return CMessage::Text(MSG_GRAPH_STD_OBJ_ANY);          }
   virtual string    PriceDescription(void)  const { return ::DoubleToString(this.GetProperty(GRAPH_OBJ_PROP_PRICE),this.m_digits); }
   virtual string    TimeDescription(void)   const { return ::TimeToString(this.GetProperty(GRAPH_OBJ_PROP_TIME),TIME_DATE|TIME_MINUTES);    }
   
//--- Сравнивает объекты CGStdGraphObj между собой по указанному свойству (для сортировки списка по свойству графического объекта)
   virtual int       Compare(const CObject *node,const int mode=0) const;
//--- Сравнивает объекты CGStdGraphObj между собой по всем свойствам (для поиска равных графических объектов)
   bool              IsEqual(CGStdGraphObj* compared_req) const;
   
//--- Конструктор по умолчанию

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

В защищённый параметрический конструктор класса добавим новый формальный параметр — группу стандартного графического объекта, а в конструкторе по умолчанию сразу впишем значение для группы, равное -1:

//--- Конструктор по умолчанию
                     CGStdGraphObj(){ this.m_type=OBJECT_DE_TYPE_GSTD_OBJ; m_group=WRONG_VALUE; }
protected:

//--- Защищённый параметрический конструктор
                     CGStdGraphObj(const ENUM_OBJECT_DE_TYPE obj_type,
                                   const ENUM_GRAPH_OBJ_BELONG belong,
                                   const ENUM_GRAPH_OBJ_GROUP group,
                                   const long chart_id, const string name);
                     
public:
//+-------------------------------------------------------------------+ 
//|Методы упрощённого доступа и установки свойств графического объекта|
//+-------------------------------------------------------------------+


В самом конце списка методов для упрощённого доступа к свойствам класса впишем методы, возвращающие флаги видимости объекта на указанном таймфрейме. Для каждого таймфрейма — свой метод. И объявим метод, возвращающий описание видимости объекта на всех таймфреймах:

//--- Символ для объекта "График" 
   string            Symbol(void)                  const { return this.GetProperty(GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL);                      }
   void              SetChartObjSymbol(const string symbol)
                       {
                        if(::ObjectSetString(CGBaseObj::ChartID(),CGBaseObj::Name(),OBJPROP_SYMBOL,symbol))
                           this.SetProperty(GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL,symbol);
                       }
//--- Возвращает флаги видимости объекта на таймфреймах
   bool              IsVisibleOnTimeframeM1(void)  const { return IsVisibleOnTimeframe(PERIOD_M1, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM2(void)  const { return IsVisibleOnTimeframe(PERIOD_M2, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM3(void)  const { return IsVisibleOnTimeframe(PERIOD_M3, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM4(void)  const { return IsVisibleOnTimeframe(PERIOD_M4, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM5(void)  const { return IsVisibleOnTimeframe(PERIOD_M5, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM6(void)  const { return IsVisibleOnTimeframe(PERIOD_M6, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM10(void) const { return IsVisibleOnTimeframe(PERIOD_M10,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM12(void) const { return IsVisibleOnTimeframe(PERIOD_M12,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM15(void) const { return IsVisibleOnTimeframe(PERIOD_M15,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM20(void) const { return IsVisibleOnTimeframe(PERIOD_M20,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeM30(void) const { return IsVisibleOnTimeframe(PERIOD_M30,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH1(void)  const { return IsVisibleOnTimeframe(PERIOD_H1, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH2(void)  const { return IsVisibleOnTimeframe(PERIOD_H2, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH3(void)  const { return IsVisibleOnTimeframe(PERIOD_H3, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH4(void)  const { return IsVisibleOnTimeframe(PERIOD_H4, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH6(void)  const { return IsVisibleOnTimeframe(PERIOD_H6, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH8(void)  const { return IsVisibleOnTimeframe(PERIOD_H8, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeH12(void) const { return IsVisibleOnTimeframe(PERIOD_H12,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeD1(void)  const { return IsVisibleOnTimeframe(PERIOD_D1, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeW1(void)  const { return IsVisibleOnTimeframe(PERIOD_W1, (int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
   bool              IsVisibleOnTimeframeMN1(void) const { return IsVisibleOnTimeframe(PERIOD_MN1,(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES)); }
//--- Возвращает описание видимости объекта на таймфреймах
   string            VisibleOnTimeframeDescription(void);
  };
//+------------------------------------------------------------------+


В защищённом параметрическом конструкторе — в коде его реализации, напишем установку в свойства объекта значения, передаваемого в параметрах группы, к которой принадлежит графический объект:

//+------------------------------------------------------------------+
//| Защищённый параметрический конструктор                           |
//+------------------------------------------------------------------+
CGStdGraphObj::CGStdGraphObj(const ENUM_OBJECT_DE_TYPE obj_type,
                             const ENUM_GRAPH_OBJ_BELONG belong,
                             const ENUM_GRAPH_OBJ_GROUP group,
                             const long chart_id,const string name)
  {
//--- Устанавливаем объекту (1) его тип, тип графического (2) объекта, (3) елемента, (4) принадлежность и (5) номер подокна, (6) Digits символа графика
   this.m_type=obj_type;
   CGBaseObj::SetChartID(chart_id);
   CGBaseObj::SetTypeGraphObject(CGBaseObj::GraphObjectType(obj_type));
   CGBaseObj::SetTypeElement(GRAPH_ELEMENT_TYPE_STANDART);
   CGBaseObj::SetBelong(belong);
   CGBaseObj::SetGroup(group);
   CGBaseObj::SetSubwindow(chart_id,name);
   CGBaseObj::SetDigits((int)::SymbolInfoInteger(::ChartSymbol(chart_id),SYMBOL_DIGITS));
   
//--- Сохранение целочисленных свойств
   //--- свойства, присущие всем графическим объектам, но не имеющиеся у графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_CHART_ID]    = CGBaseObj::ChartID();          // Идентификатор графика
   this.m_long_prop[GRAPH_OBJ_PROP_WND_NUM]     = CGBaseObj::SubWindow();        // Номер подокна графика
   this.m_long_prop[GRAPH_OBJ_PROP_TYPE]        = CGBaseObj::TypeGraphObject();  // Тип графического объекта (ENUM_OBJECT)
   this.m_long_prop[GRAPH_OBJ_PROP_ELEMENT_TYPE]= CGBaseObj::TypeGraphElement(); // Тип графического элемента (ENUM_GRAPH_ELEMENT_TYPE)
   this.m_long_prop[GRAPH_OBJ_PROP_BELONG]      = CGBaseObj::Belong();           // Принадлежность графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_GROUP]       = CGBaseObj::Group();            // Группа графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_ID]          = 0;                             // Идентификатор объекта
   this.m_long_prop[GRAPH_OBJ_PROP_NUM]         = 0;                             // Номер объекта в списке
   //--- Свойства, присущие всем графическим объектам, имеющиеся у графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_CREATETIME]  = ::ObjectGetInteger(chart_id,name,OBJPROP_CREATETIME);  // Время создания объекта
   this.m_long_prop[GRAPH_OBJ_PROP_TIMEFRAMES]  = ::ObjectGetInteger(chart_id,name,OBJPROP_TIMEFRAMES);  // Видимость объекта на таймфреймах
   this.m_long_prop[GRAPH_OBJ_PROP_BACK]        = ::ObjectGetInteger(chart_id,name,OBJPROP_BACK);        // Объект на заднем плане
   this.m_long_prop[GRAPH_OBJ_PROP_ZORDER]      = ::ObjectGetInteger(chart_id,name,OBJPROP_ZORDER);      // Приоритет графического объекта на получение события нажатия мышки на графике
   this.m_long_prop[GRAPH_OBJ_PROP_HIDDEN]      = ::ObjectGetInteger(chart_id,name,OBJPROP_HIDDEN);      // Запрет на показ имени графического объекта в списке объектов терминала
   this.m_long_prop[GRAPH_OBJ_PROP_SELECTED]    = ::ObjectGetInteger(chart_id,name,OBJPROP_SELECTED);    // Выделенность объекта
   this.m_long_prop[GRAPH_OBJ_PROP_SELECTABLE]  = ::ObjectGetInteger(chart_id,name,OBJPROP_SELECTABLE);  // Доступность объекта
   this.m_long_prop[GRAPH_OBJ_PROP_TIME]        = ::ObjectGetInteger(chart_id,name,OBJPROP_TIME);        // Координата времени первой точки
   this.m_long_prop[GRAPH_OBJ_PROP_COLOR]       = ::ObjectGetInteger(chart_id,name,OBJPROP_COLOR);       // Цвет
   this.m_long_prop[GRAPH_OBJ_PROP_STYLE]       = ::ObjectGetInteger(chart_id,name,OBJPROP_STYLE);       // Стиль
   this.m_long_prop[GRAPH_OBJ_PROP_WIDTH]       = ::ObjectGetInteger(chart_id,name,OBJPROP_WIDTH);       // Толщина линии
   //--- Свойства, принадлежащие разным графическим объектам
   this.m_long_prop[GRAPH_OBJ_PROP_FILL]                          = 0;  // Заливка объекта цветом
   this.m_long_prop[GRAPH_OBJ_PROP_READONLY]                      = 0;  // Возможность редактирования текста в объекте Edit
   this.m_long_prop[GRAPH_OBJ_PROP_LEVELS]                        = 0;  // Количество уровней
   this.m_long_prop[GRAPH_OBJ_PROP_LEVELCOLOR]                    = 0;  // Цвет линии-уровня
   this.m_long_prop[GRAPH_OBJ_PROP_LEVELSTYLE]                    = 0;  // Стиль линии-уровня
   this.m_long_prop[GRAPH_OBJ_PROP_LEVELWIDTH]                    = 0;  // Толщина линии-уровня
   this.m_long_prop[GRAPH_OBJ_PROP_ALIGN]                         = 0;  // Горизонтальное выравнивание текста в объекте "Поле ввода" (OBJ_EDIT)
   this.m_long_prop[GRAPH_OBJ_PROP_FONTSIZE]                      = 0;  // Размер шрифта
   this.m_long_prop[GRAPH_OBJ_PROP_RAY_LEFT]                      = 0;  // Луч продолжается влево
   this.m_long_prop[GRAPH_OBJ_PROP_RAY_RIGHT]                     = 0;  // Луч продолжается вправо
   this.m_long_prop[GRAPH_OBJ_PROP_RAY]                           = 0;  // Вертикальная линия продолжается на все окна графика
   this.m_long_prop[GRAPH_OBJ_PROP_ELLIPSE]                       = 0;  // Отображение полного эллипса для объекта "Дуги Фибоначчи"
   this.m_long_prop[GRAPH_OBJ_PROP_ARROWCODE]                     = 0;  // Код стрелки для объекта "Стрелка"
   this.m_long_prop[GRAPH_OBJ_PROP_ANCHOR]                        = 0;  // Положение точки привязки графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_XDISTANCE]                     = 0;  // Дистанция в пикселях по оси X от угла привязки
   this.m_long_prop[GRAPH_OBJ_PROP_YDISTANCE]                     = 0;  // Дистанция в пикселях по оси Y от угла привязки
   this.m_long_prop[GRAPH_OBJ_PROP_DIRECTION]                     = 0;  // Тренд объекта Ганна
   this.m_long_prop[GRAPH_OBJ_PROP_DEGREE]                        = 0;  // Уровень волновой разметки Эллиотта
   this.m_long_prop[GRAPH_OBJ_PROP_DRAWLINES]                     = 0;  // Отображение линий для волновой разметки Эллиотта
   this.m_long_prop[GRAPH_OBJ_PROP_STATE]                         = 0;  // Состояние кнопки (Нажата/Отжата)
   this.m_long_prop[GRAPH_OBJ_PROP_OBJ_CHART_ID]                  = 0;  // Идентификатор объекта "График" (OBJ_CHART).
   this.m_long_prop[GRAPH_OBJ_PROP_CHART_OBJ_PERIOD]              = 0;  // Период для объекта "График"
   this.m_long_prop[GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE]          = 0;  // Признак отображения шкалы времени для объекта "График"
   this.m_long_prop[GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE]         = 0;  // Признак отображения ценовой шкалы для объекта "График"
   this.m_long_prop[GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE]         = 0;  // Масштаб для объекта "График"
   this.m_long_prop[GRAPH_OBJ_PROP_XSIZE]                         = 0;  // Ширина объекта по оси X в пикселях.
   this.m_long_prop[GRAPH_OBJ_PROP_YSIZE]                         = 0;  // Высота объекта по оси Y в пикселях.
   this.m_long_prop[GRAPH_OBJ_PROP_XOFFSET]                       = 0;  // X-координата левого верхнего угла прямоугольной области видимости.
   this.m_long_prop[GRAPH_OBJ_PROP_YOFFSET]                       = 0;  // Y-координата левого верхнего угла прямоугольной области видимости.
   this.m_long_prop[GRAPH_OBJ_PROP_BGCOLOR]                       = 0;  // Цвет фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL
   this.m_long_prop[GRAPH_OBJ_PROP_CORNER]                        = 0;  // Угол графика для привязки графического объекта
   this.m_long_prop[GRAPH_OBJ_PROP_BORDER_TYPE]                   = 0;  // Тип рамки для объекта "Прямоугольная рамка"
   this.m_long_prop[GRAPH_OBJ_PROP_BORDER_COLOR]                  = 0;  // Цвет рамки для объекта OBJ_EDIT и OBJ_BUTTON
   
//--- Сохранение вещественных свойств
   this.m_double_prop[this.IndexProp(GRAPH_OBJ_PROP_PRICE)]       = ::ObjectGetDouble(chart_id,name,OBJPROP_PRICE);  // Координата цены
   this.m_double_prop[this.IndexProp(GRAPH_OBJ_PROP_LEVELVALUE)]  = 0;                                               // Значение уровня
   this.m_double_prop[this.IndexProp(GRAPH_OBJ_PROP_SCALE)]       = 0;                                               // Масштаб (свойство объектов Ганна и объекта "Дуги Фибоначчи")
   this.m_double_prop[this.IndexProp(GRAPH_OBJ_PROP_ANGLE)]       = 0;                                               // Угол
   this.m_double_prop[this.IndexProp(GRAPH_OBJ_PROP_DEVIATION)]   = 0;                                               // Отклонение для канала стандартного отклонения
   
//--- Сохранение строковых свойств
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_NAME)]        = name;                                            // Имя объекта
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_TEXT)]        = ::ObjectGetString(chart_id,name,OBJPROP_TEXT);   // Описание объекта (текст, содержащийся в объекте)
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_TOOLTIP)]     = ::ObjectGetString(chart_id,name,OBJPROP_TOOLTIP);// Текст всплывающей подсказки
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_LEVELTEXT)]   = "";                                              // Описание уровня
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_FONT)]        = "";                                              // Шрифт
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_BMPFILE)]     = "";                                              // Имя BMP-файла для объекта "Графическая метка"
   this.m_string_prop[this.IndexProp(GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL)]= "";                                          // Символ для объекта "График" 
   
//--- Сохранение базовых свойств в родительском объекте
   this.m_create_time=(datetime)this.GetProperty(GRAPH_OBJ_PROP_CREATETIME);
   this.m_back=(bool)this.GetProperty(GRAPH_OBJ_PROP_BACK);
   this.m_selected=(bool)this.GetProperty(GRAPH_OBJ_PROP_SELECTED);
   this.m_selectable=(bool)this.GetProperty(GRAPH_OBJ_PROP_SELECTABLE);
   this.m_hidden=(bool)this.GetProperty(GRAPH_OBJ_PROP_HIDDEN);
   this.m_name=this.GetProperty(GRAPH_OBJ_PROP_NAME);
   
  }
//+-------------------------------------------------------------------+


В методе, выводящем в журнал краткое описание объекта, сначала выведем что это стандартный графический объект:

//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdGraphObj::PrintShort(const bool dash=false,const bool symbol=false)
  {
   ::Print
     (
      CMessage::Text(MSG_GRAPH_ELEMENT_TYPE_STANDART),": ",
      " \"",CGBaseObj::Name(),"\": ID ",(string)this.GetProperty(GRAPH_OBJ_PROP_ID),
      " ",::TimeToString(CGBaseObj::TimeCreate(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)
     );
  }
//+------------------------------------------------------------------+


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

//+------------------------------------------------------------------+
//| Возвращает описание целочисленного свойства объекта              |
//+------------------------------------------------------------------+
string CGStdGraphObj::GetPropertyDescription(ENUM_GRAPH_OBJ_PROP_INTEGER property)
  {
   return
     (
      property==GRAPH_OBJ_PROP_ID         ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ID)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_TYPE       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_TYPE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.TypeDescription()
         )  :
      property==GRAPH_OBJ_PROP_ELEMENT_TYPE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ELEMENT_TYPE)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+CGBaseObj::TypeElementDescription()
         )  :
      property==GRAPH_OBJ_PROP_GROUP  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_GROUP)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+CGBaseObj::GroupDescription()
         )  :
      property==GRAPH_OBJ_PROP_BELONG     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BELONG)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+CGBaseObj::BelongDescription()
         )  :
      property==GRAPH_OBJ_PROP_CHART_ID   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CHART_ID)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_WND_NUM    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_WND_NUM)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_CREATETIME   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CREATETIME)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::TimeToString(this.GetProperty(property),TIME_DATE|TIME_MINUTES|TIME_SECONDS)
         )  :
      property==GRAPH_OBJ_PROP_TIMEFRAMES ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_TIMEFRAMES)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.VisibleOnTimeframeDescription()
         )  :
      property==GRAPH_OBJ_PROP_BACK       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BACK)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.IsBack() ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_ZORDER     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ZORDER)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_HIDDEN     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_HIDDEN)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.IsHidden() ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_SELECTED   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_SELECTED)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.IsSelected() ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_SELECTABLE ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_SELECTABLE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.IsSelectable() ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_NUM        ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_NUM)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_TIME       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_TIME)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.TimeDescription()
         )  :
      property==GRAPH_OBJ_PROP_COLOR      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_COLOR)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::ColorToString((color)this.GetProperty(property),true)
         )  :
      property==GRAPH_OBJ_PROP_STYLE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_STYLE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+LineStyleDescription((ENUM_LINE_STYLE)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_WIDTH     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_WIDTH)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_FILL       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_FILL)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_READONLY   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_READONLY)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_LEVELS     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELS)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_LEVELCOLOR ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELCOLOR)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::ColorToString((color)this.GetProperty(property),true)
         )  :
      property==GRAPH_OBJ_PROP_LEVELSTYLE ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELSTYLE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+LineStyleDescription((ENUM_LINE_STYLE)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_LEVELWIDTH ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELWIDTH)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_ALIGN      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ALIGN)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+AlignModeDescription((ENUM_ALIGN_MODE)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_FONTSIZE   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_FONTSIZE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_RAY_LEFT   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_RAY_LEFT)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_RAY_RIGHT  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_RAY_RIGHT)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_RAY        ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_RAY)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_ELLIPSE    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ELLIPSE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_ARROWCODE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ARROWCODE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_ANCHOR     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ANCHOR)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.AnchorDescription()
         )  :
      property==GRAPH_OBJ_PROP_XDISTANCE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_XDISTANCE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_YDISTANCE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_YDISTANCE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_DIRECTION  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_DIRECTION)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+GannDirectDescription((ENUM_GANN_DIRECTION)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_DEGREE     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_DEGREE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+ElliotWaveDegreeDescription((ENUM_ELLIOT_WAVE_DEGREE)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_DRAWLINES  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_DRAWLINES)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_STATE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_STATE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_BUTTON_STATE_PRESSED) : CMessage::Text(MSG_LIB_TEXT_BUTTON_STATE_DEPRESSED))
         )  :
      property==GRAPH_OBJ_PROP_OBJ_CHART_ID  ?  CMessage::Text(MSG_CHART_OBJ_ID)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_CHART_OBJ_PERIOD ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CHART_OBJ_PERIOD)+
         (!this.SupportProperty(property)       ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+TimeframeDescription((ENUM_TIMEFRAMES)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CHART_OBJ_DATE_SCALE)+
         (!this.SupportProperty(property)             ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CHART_OBJ_PRICE_SCALE)+
         (!this.SupportProperty(property)             ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property) ? CMessage::Text(MSG_LIB_TEXT_YES) : CMessage::Text(MSG_LIB_TEXT_NO))
         )  :
      property==GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CHART_OBJ_CHART_SCALE)+
         (!this.SupportProperty(property)             ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_XSIZE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_XSIZE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_YSIZE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_YSIZE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_XOFFSET    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_XOFFSET)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_YOFFSET    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_YOFFSET)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(string)this.GetProperty(property)
         )  :
      property==GRAPH_OBJ_PROP_BGCOLOR    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BGCOLOR)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::ColorToString((color)this.GetProperty(property),true)
         )  :
      property==GRAPH_OBJ_PROP_CORNER     ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_CORNER)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+BaseCornerDescription((ENUM_BASE_CORNER)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_BORDER_TYPE   ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BORDER_TYPE)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+BorderTypeDescription((ENUM_BORDER_TYPE)this.GetProperty(property))
         )  :
      property==GRAPH_OBJ_PROP_BORDER_COLOR  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BORDER_COLOR)+
         (!this.SupportProperty(property)    ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::ColorToString((color)this.GetProperty(property),true)
         )  :
      ""
     );
  }
//+------------------------------------------------------------------+


В методе, возвращающем описание вещественного свойства объекта, тоже заменим вывод описания цены точки привязки на вызов метода:

//+------------------------------------------------------------------+
//| Возвращает описание вещественного свойства объекта               |
//+------------------------------------------------------------------+
string CGStdGraphObj::GetPropertyDescription(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   int dg=(this.m_digits>0 ? this.m_digits : 1);
   return
     (
      property==GRAPH_OBJ_PROP_PRICE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_PRICE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.PriceDescription()
         )  :
      property==GRAPH_OBJ_PROP_LEVELVALUE ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELVALUE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::DoubleToString(this.GetProperty(property),dg)
         )  :
      property==GRAPH_OBJ_PROP_SCALE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_SCALE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::DoubleToString(this.GetProperty(property),2)
         )  :
      property==GRAPH_OBJ_PROP_ANGLE      ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_ANGLE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::DoubleToString(this.GetProperty(property),2)
         )  :
      property==GRAPH_OBJ_PROP_DEVIATION  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_DEVIATION)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+::DoubleToString(this.GetProperty(property),2)
         )  :
      ""
     );
  }
//+------------------------------------------------------------------+


В методе, возвращающем описание строкового свойства объекта, добавим вывод кавычек, в которые будут заключены выводимые строковые свойства, и для описания всплывающей подсказки выведем сообщение, что подсказка формируется автоматически терминалом в случае, если она не задана и не является управляющим символом "\n", который отключает всплывающую подсказку:

//+------------------------------------------------------------------+
//| Возвращает описание строкового свойства объекта                  |
//+------------------------------------------------------------------+
string CGStdGraphObj::GetPropertyDescription(ENUM_GRAPH_OBJ_PROP_STRING property)
  {
   return
     (
      property==GRAPH_OBJ_PROP_NAME       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_NAME)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+"\""+this.GetProperty(property)+"\""
         )  :
      property==GRAPH_OBJ_PROP_TEXT       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_TEXT)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property)=="" ? CMessage::Text(MSG_LIB_PROP_EMPTY) : "\""+this.GetProperty(property)+"\"")
         )  :
      property==GRAPH_OBJ_PROP_TOOLTIP    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_TOOLTIP)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+(this.GetProperty(property)=="" ? CMessage::Text(MSG_LIB_PROP_AUTO) : 
                this.GetProperty(property)=="\n" ? CMessage::Text(MSG_LIB_PROP_EMPTY) :
                "\""+this.GetProperty(property)+"\"")
         )  :
      property==GRAPH_OBJ_PROP_LEVELTEXT  ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_LEVELTEXT)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+"\""+this.GetProperty(property)+"\""
         )  :
      property==GRAPH_OBJ_PROP_FONT       ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_FONT)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+"\""+this.GetProperty(property)+"\""
         )  :
      property==GRAPH_OBJ_PROP_BMPFILE    ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_BMPFILE)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+"\""+this.GetProperty(property)+"\""
         )  :
      property==GRAPH_OBJ_PROP_CHART_OBJ_SYMBOL ?  CMessage::Text(MSG_GRAPH_OBJ_PROP_SYMBOL)+
         (!this.SupportProperty(property) ?  ": "+CMessage::Text(MSG_LIB_PROP_NOT_SUPPORTED) :
          ": "+this.GetProperty(property)
         )  :
      ""
     );
  }
//+------------------------------------------------------------------+


Метод, возвращающий описание видимости объекта на таймфреймах:

//+------------------------------------------------------------------+
//| Возвращает описание видимости объекта на таймфреймах             |
//+------------------------------------------------------------------+
string CGStdGraphObj::VisibleOnTimeframeDescription(void)
  {
   string res="";
   int flags=(int)this.GetProperty(GRAPH_OBJ_PROP_TIMEFRAMES);
   if(flags==OBJ_NO_PERIODS)
      return CMessage::Text(MSG_LIB_TEXT_OBJ_NO_PERIODS);
   if(flags==OBJ_ALL_PERIODS)
      return CMessage::Text(MSG_LIB_TEXT_OBJ_ALL_PERIODS);
   for(int i=1;i<=21;i++)
     {
      ENUM_TIMEFRAMES timeframe=TimeframeByEnumIndex((uchar)i);
      if(!IsVisibleOnTimeframe(timeframe,flags))
         continue;
      res+=TimeframeDescription(timeframe)+", ";
     }
   ::StringSetCharacter(res,::StringLen(res)-2,' ');
   ::StringTrimRight(res);
   return res;
  }
//+------------------------------------------------------------------+

Здесь: получаем битовые флаги видимости объекта на таймфреймах из свойства объекта.
Если не установлен ни один из флагов — возвращаем сообщение, что объект невидим ни на одном таймфрейме.
Если наоборот, установлены все флаги всех таймфреймов — возвращаем сообщение, что объект видим на всех таймфреймах
.
Если установлена только часть флагов, то в цикле от 1 до 21 включительно получаем таймфрейм по индексу при помощи сервисной функции TimeframeByEnumIndex(), уже давно нами написанной и лежащей в файле сервисных функций.
Если объект невидим на полученном таймфрейме — идём на следующую итерацию для получения следующего таймфрейма.
Если же объект видим, то прибавляем его короткое описание к значению переменной res с добавлением запятой и пробела в конце.
По прошествии цикла заменяем в конце получившейся строки символ запятой, добавленный на последней итерации цикла, на пробел и удаляем все пробелы и управляющие символы справа от строки. Полученную строку возвращаем из метода.

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


Классы-наследники абстрактного графического объекта

Сегодня сделаем классы нескольких групп графических объектов: "Линии", "Каналы", "Ганн", "Фибоначчи" и "Эллиотт".

В папке \MQL5\Include\DoEasy\Objects\Graph\Standart\ создадим новый файл GStdHLineObj.mqh класса горизонтальной линии StdHLineObj.
Класс должен быть унаследован от абстрактного графического объекта, а сам файл родительского класса должен быть подключен к создаваемому классу:

//+------------------------------------------------------------------+
//|                                                 GStdHLineObj.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 link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Включаемые файлы                                                 |
//+------------------------------------------------------------------+
#include "GStdGraphObj.mqh"
//+------------------------------------------------------------------+
//| Графический объект "Горизонтальная линия"                        |
//+------------------------------------------------------------------+
class CGStdHLineObj : public CGStdGraphObj
  {
  }


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

//+------------------------------------------------------------------+
//| Графический объект "Горизонтальная линия"                        |
//+------------------------------------------------------------------+
class CGStdHLineObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdHLineObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_HLINE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,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_HLINE); }
   virtual string    TimeDescription(void)  const
                       { 
                        return ::TimeToString(this.GetProperty(GRAPH_OBJ_PROP_TIME),TIME_DATE|TIME_MINUTES)+" "+
                                 CMessage::Text(MSG_GRAPH_OBJ_TEXT_CLICK_COORD);
                       }
  };
//+------------------------------------------------------------------+

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

В конструкторе класса в его списке инициализации передаём в закрытый параметрический конструктор родительского класса тип объекта — горизонтальная линия, принадлежность — не принадлежит программе, группа объектов — линии, и значения идентификатора графика и имени объекта, переданные в конструктор класса:

CGStdHLineObj(const long chart_id,const string name) :
   CGStdGraphObj(OBJECT_DE_TYPE_GSTD_HLINE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,chart_id,name) {}


Виртуальный метод TypeDescription() возвращает описание типа графического объекта, возвращаемого сервисной функцией StdGraphObjectTypeDescription(), написанной нами ранее, в которую передаём тип объекта — горизонтальная линия:

virtual string    TypeDescription(void)   const { return StdGraphObjectTypeDescription(OBJ_HLINE); }


Виртуальный метод TimeDescription(), возвращающий описание времени, выводит время, записанное в свойства горизонтальной линии. Но так как у горизонтальной линии нет привязки ко времени, то в это свойство вписывается координата курсора мышки при щелчке на графике во время установки объекта. И об этом выводится дополнительное сообщение в описании времени, выводимом в журнал:

virtual string    TimeDescription(void)  const
                       { 
                        return ::TimeToString(this.GetProperty(GRAPH_OBJ_PROP_TIME),TIME_DATE|TIME_MINUTES)+" "+
                                 CMessage::Text(MSG_GRAPH_OBJ_TEXT_CLICK_COORD);
                       }


Методы, возвращающие флаги поддержания объектом целочисленных, вещественных и строковых свойств:

//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdHLineObj::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 CGStdHLineObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdHLineObj::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;
  }
//+------------------------------------------------------------------+

В каждый метод передаётся свойство, а далее — если такое свойство находится в списке поддерживаемых свойств, то возвращаем true, иначе — false.

Для каждого класса списки поддерживаемых свойств будут своими — ведь каждый из графических объектов имеет свой набор свойств. Равно, как и конструкторы классов тоже будут уникальными для каждого из объектов-наследников абстрактного графического объекта.

Методы, возвращающие краткое наименование объекта и выводящие в журнал краткое описание объекта:

//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdHLineObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdHLineObj::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)
     );
  }
//+------------------------------------------------------------------+

Эти методы (1) возвращают строку с описанием типа графического объекта и (2) выводят в журнал тип графического объекта, его имя, идентификатор, назначаемый объекту при его создании, и время создания объекта.

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

Класс объекта "Вертикальная линия" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdVLineObj.mqh:

//+------------------------------------------------------------------+
//|                                                 GStdVLineObj.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 CGStdVLineObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdVLineObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_VLINE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY,::ObjectGetInteger(chart_id,name,OBJPROP_RAY));
                          }
   //--- Поддерживаемые свойства объекта (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_VLINE); }
   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 CGStdVLineObj::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_RAY          : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdVLineObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdVLineObj::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 CGStdVLineObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdVLineObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Трендовая линия" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdTrendObj.mqh:

//+------------------------------------------------------------------+
//|                                                 GStdTrendObj.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 CGStdTrendObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdTrendObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_TREND,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                          }
   //--- Поддерживаемые свойства объекта (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_TREND); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdTrendObj::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_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdTrendObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdTrendObj::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 CGStdTrendObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdTrendObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Трендовая линия по углу" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdTrendByAngleObj.mqh:

//+------------------------------------------------------------------+
//|                                          GStdTrendByAngleObj.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 CGStdTrendByAngleObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdTrendByAngleObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_TRENDBYANGLE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANGLE,::ObjectGetDouble(chart_id,name,OBJPROP_ANGLE));
                          }
   //--- Поддерживаемые свойства объекта (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_TRENDBYANGLE); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdTrendByAngleObj::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_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdTrendByAngleObj::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 CGStdTrendByAngleObj::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 CGStdTrendByAngleObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdTrendByAngleObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Циклические линии" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdCyclesObj.mqh:

//+------------------------------------------------------------------+
//|                                                GStdCyclesObj.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 CGStdCyclesObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdCyclesObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_CYCLES,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,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_CYCLES); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdCyclesObj::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 CGStdCyclesObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdCyclesObj::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 CGStdCyclesObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdCyclesObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Линия со стрелкой" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdArrowedLineObj.mqh:

//+------------------------------------------------------------------+
//|                                           GStdArrowedLineObj.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 CGStdArrowedLineObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdArrowedLineObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROWED_LINE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_LINES,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_ARROWED_LINE); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdArrowedLineObj::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 CGStdArrowedLineObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdArrowedLineObj::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 CGStdArrowedLineObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdArrowedLineObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Равноудаленный канал" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdChannelObj.mqh:

//+------------------------------------------------------------------+
//|                                               GStdChannelObj.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 CGStdChannelObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdChannelObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_CHANNEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_CHANNELS,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           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);
//--- Возвращает описание (1) типа (ENUM_OBJECT), (2) координаты цены графического объекта
   virtual string    TypeDescription(void)   const { return StdGraphObjectTypeDescription(OBJ_CHANNEL); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdChannelObj::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         :
      case GRAPH_OBJ_PROP_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdChannelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdChannelObj::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 CGStdChannelObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdChannelObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Канал стандартного отклонения" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdStdDevChannelObj.mqh:

//+------------------------------------------------------------------+
//|                                         GStdStdDevChannelObj.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 CGStdStdDevChannelObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdStdDevChannelObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_STDDEVCHANNEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_CHANNELS,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_FILL,::ObjectGetInteger(chart_id,name,OBJPROP_FILL));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_DEVIATION,::ObjectGetDouble(chart_id,name,OBJPROP_DEVIATION));
                          }
   //--- Поддерживаемые свойства объекта (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_STDDEVCHANNEL); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdStdDevChannelObj::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         :
      case GRAPH_OBJ_PROP_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdStdDevChannelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_DEVIATION    :
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdStdDevChannelObj::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 CGStdStdDevChannelObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdStdDevChannelObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Канал линейной регрессии" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdRegressionObj.mqh:

//+------------------------------------------------------------------+
//|                                            GStdRegressionObj.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 CGStdRegressionObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdRegressionObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_REGRESSION,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_CHANNELS,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           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);
//--- Возвращает описание (1) типа (ENUM_OBJECT), (2) координаты цены графического объекта
   virtual string    TypeDescription(void)   const { return StdGraphObjectTypeDescription(OBJ_REGRESSION); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdRegressionObj::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         :
      case GRAPH_OBJ_PROP_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdRegressionObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdRegressionObj::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 CGStdRegressionObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdRegressionObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Вилы Эндрюса" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdPitchforkObj.mqh:

//+------------------------------------------------------------------+
//|                                             GStdPitchforkObj.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 CGStdPitchforkObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdPitchforkObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_PITCHFORK,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_CHANNELS,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_PITCHFORK); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdPitchforkObj::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_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    :
      case GRAPH_OBJ_PROP_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdPitchforkObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdPitchforkObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdPitchforkObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdPitchforkObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Линия Ганна" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdGannLineObj.mqh:

//+------------------------------------------------------------------+
//|                                              GStdGannLineObj.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 CGStdGannLineObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdGannLineObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_GANNLINE,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GANN,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_SCALE,::ObjectGetDouble(chart_id,name,OBJPROP_SCALE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANGLE,::ObjectGetDouble(chart_id,name,OBJPROP_ANGLE));
                          }
   //--- Поддерживаемые свойства объекта (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_GANNLINE); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdGannLineObj::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_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdGannLineObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_ANGLE        :
      case GRAPH_OBJ_PROP_SCALE        :
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdGannLineObj::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 CGStdGannLineObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdGannLineObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Веер Ганна" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdGannFanObj.mqh:

//+------------------------------------------------------------------+
//|                                               GStdGannFanObj.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 CGStdGannFanObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdGannFanObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_GANNFAN,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GANN,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_DIRECTION));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_SCALE,::ObjectGetDouble(chart_id,name,OBJPROP_SCALE));
                          }
   //--- Поддерживаемые свойства объекта (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_GANNFAN); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdGannFanObj::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_DIRECTION    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdGannFanObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_SCALE        :
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdGannFanObj::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 CGStdGannFanObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdGannFanObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Сетка Ганна" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdGannGridObj.mqh:

//+------------------------------------------------------------------+
//|                                              GStdGannGridObj.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 CGStdGannGridObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdGannGridObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_GANNGRID,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_GANN,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_DIRECTION));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_SCALE,::ObjectGetDouble(chart_id,name,OBJPROP_SCALE));
                          }
   //--- Поддерживаемые свойства объекта (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_GANNGRID); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdGannGridObj::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_DIRECTION    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdGannGridObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_SCALE        :
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdGannGridObj::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 CGStdGannGridObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdGannGridObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Уровни Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdFiboObj.mqh:

//+------------------------------------------------------------------+
//|                                                  GStdFiboObj.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 CGStdFiboObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdFiboObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_FIBO,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_FIBO); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdFiboObj::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_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    :
      case GRAPH_OBJ_PROP_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdFiboObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdFiboObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdFiboObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdFiboObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Временные зоны Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdFiboTimesObj.mqh:

//+------------------------------------------------------------------+
//|                                             GStdFiboTimesObj.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 CGStdFiboTimesObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdFiboTimesObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_FIBOTIMES,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_FIBOTIMES); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdFiboTimesObj::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_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdFiboTimesObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdFiboTimesObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdFiboTimesObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdFiboTimesObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Веер Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdFiboFanObj.mqh:

//+------------------------------------------------------------------+
//|                                               GStdFiboFanObj.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 CGStdFiboFanObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdFiboFanObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_FIBOFAN,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_FIBOFAN); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdFiboFanObj::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_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdFiboFanObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdFiboFanObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdFiboFanObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdFiboFanObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Дуги Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdFiboArcObj.mqh:

//+------------------------------------------------------------------+
//|                                               GStdFiboArcObj.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 CGStdFiboArcObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdFiboArcObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_FIBOARC,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ELLIPSE,::ObjectGetInteger(chart_id,name,OBJPROP_ELLIPSE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_SCALE,::ObjectGetDouble(chart_id,name,OBJPROP_SCALE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_FIBOARC); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdFiboArcObj::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_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   :
      case GRAPH_OBJ_PROP_ELLIPSE      : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdFiboArcObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_SCALE        :
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdFiboArcObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdFiboArcObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdFiboArcObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Канал Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdFiboChannelObj.mqh:

//+------------------------------------------------------------------+
//|                                           GStdFiboChannelObj.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 link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Включаемые файлы                                                 |
//+------------------------------------------------------------------+
#include "GStdGraphObj.mqh"
//+------------------------------------------------------------------+
//| Графический объект "Канал Фибоначчи"                             |
//+------------------------------------------------------------------+
class CGStdFiboChannelObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdFiboChannelObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_FIBOCHANNEL,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_FIBOCHANNEL); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdFiboChannelObj::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_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   :
      case GRAPH_OBJ_PROP_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdFiboChannelObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdFiboChannelObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdFiboChannelObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdFiboChannelObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "Расширение Фибоначчи" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdExpansionObj.mqh:

//+------------------------------------------------------------------+
//|                                             GStdExpansionObj.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 CGStdExpansionObj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdExpansionObj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_EXPANSION,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_FIBO,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_LEFT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_LEFT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_RAY_RIGHT,::ObjectGetInteger(chart_id,name,OBJPROP_RAY_RIGHT));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELS,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELS));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELCOLOR,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELCOLOR));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELSTYLE,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELSTYLE));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELWIDTH,::ObjectGetInteger(chart_id,name,OBJPROP_LEVELWIDTH));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_LEVELTEXT,::ObjectGetString(chart_id,name,OBJPROP_LEVELTEXT));
                          }
   //--- Поддерживаемые свойства объекта (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_EXPANSION); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdExpansionObj::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_LEVELS       :
      case GRAPH_OBJ_PROP_LEVELCOLOR   :
      case GRAPH_OBJ_PROP_LEVELSTYLE   :
      case GRAPH_OBJ_PROP_LEVELWIDTH   :
      case GRAPH_OBJ_PROP_RAY_LEFT     :
      case GRAPH_OBJ_PROP_RAY_RIGHT    : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdExpansionObj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdExpansionObj::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_LEVELTEXT       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает краткое наименование объекта                          |
//+------------------------------------------------------------------+
string CGStdExpansionObj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdExpansionObj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "5-волновка Эллиота" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdElliotWave5Obj.mqh:

//+------------------------------------------------------------------+
//|                                           GStdElliotWave5Obj.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"
//+------------------------------------------------------------------+
//| Графический объект "5-волновка Эллиота"                          |
//+------------------------------------------------------------------+
class CGStdElliotWave5Obj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdElliotWave5Obj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ELLIOTWAVE5,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ELLIOTT,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_DRAWLINES,::ObjectGetInteger(chart_id,name,OBJPROP_DRAWLINES));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_DEGREE,::ObjectGetInteger(chart_id,name,OBJPROP_DEGREE));
                          }
   //--- Поддерживаемые свойства объекта (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_ELLIOTWAVE5); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdElliotWave5Obj::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_DRAWLINES    :
      case GRAPH_OBJ_PROP_DEGREE       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdElliotWave5Obj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdElliotWave5Obj::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 CGStdElliotWave5Obj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdElliotWave5Obj::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)
     );
  }
//+------------------------------------------------------------------+


Класс объекта "3-волновка Эллиота" в файле \MQL5\Include\DoEasy\Objects\Graph\Standart\GStdElliotWave3Obj.mqh:

//+------------------------------------------------------------------+
//|                                           GStdElliotWave3Obj.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"
//+------------------------------------------------------------------+
//| Графический объект "3-волновка Эллиота"                          |
//+------------------------------------------------------------------+
class CGStdElliotWave3Obj : public CGStdGraphObj
  {
private:

public:
   //--- Конструктор
                     CGStdElliotWave3Obj(const long chart_id,const string name) :
                        CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ELLIOTWAVE3,GRAPH_OBJ_BELONG_NO_PROGRAM,GRAPH_OBJ_GROUP_ELLIOTT,chart_id,name)
                          {
                           //--- Получим и сохраним свойства объекта
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_DRAWLINES,::ObjectGetInteger(chart_id,name,OBJPROP_DRAWLINES));
                           CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_DEGREE,::ObjectGetInteger(chart_id,name,OBJPROP_DEGREE));
                          }
   //--- Поддерживаемые свойства объекта (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_ELLIOTWAVE3); }
  };
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| целочисленное свойство, возвращает ложь в противном случае       |
//+------------------------------------------------------------------+
bool CGStdElliotWave3Obj::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_DRAWLINES    :
      case GRAPH_OBJ_PROP_DEGREE       : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| вещественное свойство, возвращает ложь в противном случае        |
//+------------------------------------------------------------------+
bool CGStdElliotWave3Obj::SupportProperty(ENUM_GRAPH_OBJ_PROP_DOUBLE property)
  {
   switch((int)property)
     {
      //--- Поддерживаемые свойства
      case GRAPH_OBJ_PROP_PRICE        : return true;
      //--- Остальные свойства не поддерживаются
      //--- По умолчанию false
      default: break;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| Возвращает истину, если объект поддерживает переданное           |
//| строковое свойство, возвращает ложь в противном случае           |
//+------------------------------------------------------------------+
bool CGStdElliotWave3Obj::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 CGStdElliotWave3Obj::Header(const bool symbol=false)
  {
   return this.TypeDescription();
  }
//+------------------------------------------------------------------+
//| Выводит в журнал краткое описание объекта                        |
//+------------------------------------------------------------------+
void CGStdElliotWave3Obj::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)
     );
  }
//+------------------------------------------------------------------+

Это все запланированные на сегодня объекты классов-наследников абстрактного графического объекта. Как видим, они идентичны друг другу, но имеют отличия по типам поддерживаемых свойств. А это значит, что каждый из этих объектов будет иметь только те свойства, которые присущи именно ему. И плюс здесь не просто в выводе этих данных в журнал, а именно в том, что поиск и сортировка объектов в библиотеке учитывает флаги поддержания объектом того или иного свойства. Поэтому при сортировке всех графических объектов в коллекции, например, по углу, в итоговый список не смогут попасть объекты, у которых нет никакого угла, — это свойство у них не поддерживается.

Оставим все выше представленные классы для самостоятельного разбора.

Теперь нам необходимо доработать класс управления объектами чарта, расположенный в файле класса-коллекции графических объектов по адресу \MQL5\Include\DoEasy\Collections\GraphElementsCollection.mqh.

Нам нужно сделать так, чтобы в зависимости от добавленного на график графического объекта создавался новый экземпляр класса стандартного графического объекта из тех, которые мы сегодня создали. Внесём в файл необходимые доработки.

Подключим файлы всех созданных сегодня классов к файлу класса-коллекции графических объектов (вместо ранее подключенного файла GStdGraphObj.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\Standart\GStdVLineObj.mqh"
#include "..\Objects\Graph\Standart\GStdHLineObj.mqh"
#include "..\Objects\Graph\Standart\GStdTrendObj.mqh"
#include "..\Objects\Graph\Standart\GStdTrendByAngleObj.mqh"
#include "..\Objects\Graph\Standart\GStdCiclesObj.mqh"
#include "..\Objects\Graph\Standart\GStdArrowedLineObj.mqh"
#include "..\Objects\Graph\Standart\GStdChannelObj.mqh"
#include "..\Objects\Graph\Standart\GStdStdDevChannelObj.mqh"
#include "..\Objects\Graph\Standart\GStdRegressionObj.mqh"
#include "..\Objects\Graph\Standart\GStdPitchforkObj.mqh"
#include "..\Objects\Graph\Standart\GStdGannLineObj.mqh"
#include "..\Objects\Graph\Standart\GStdGannFanObj.mqh"
#include "..\Objects\Graph\Standart\GStdGannGridObj.mqh"
#include "..\Objects\Graph\Standart\GStdFiboObj.mqh"
#include "..\Objects\Graph\Standart\GStdFiboTimesObj.mqh"
#include "..\Objects\Graph\Standart\GStdFiboFanObj.mqh"
#include "..\Objects\Graph\Standart\GStdFiboArcObj.mqh"
#include "..\Objects\Graph\Standart\GStdFiboChannelObj.mqh"
#include "..\Objects\Graph\Standart\GStdExpansionObj.mqh"
#include "..\Objects\Graph\Standart\GStdElliotWave5Obj.mqh"
#include "..\Objects\Graph\Standart\GStdElliotWave3Obj.mqh"
//+------------------------------------------------------------------+
//| Класс управления объектами чарта                                 |
//+------------------------------------------------------------------+
class CChartObjectsControl : public CObject
  {
private:
   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;         // Разница в количестве графических объектов по сравнению с прошлой проверкой
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);
//--- Проверяет объекты на чарте
   void              Refresh(void);
//--- Конструкторы
                     CChartObjectsControl(void)
                       { 
                        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_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);
                       }
  };
//+------------------------------------------------------------------+

В методе, проверяющем изменение количества объектов на чарте, класса управления графическими объектами внесём небольшие правки в блок кода для создания нового объекта, описывающего добавленный графический объект на чарт:

//+------------------------------------------------------------------+
//| 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)
     {
      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!="")
        {
         //--- Создаём объект класса графического объекта, соответствующий типу добавленного графического объекта
         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;
           }
        }
     }
//--- сохранение индекса последнего добавленного графического объекта и разницы по сравнению с прошлой проверкой
   this.m_last_objects=this.m_total_objects;
   this.m_is_graph_obj_event=(bool)this.m_delta_graph_obj;
  }
//+------------------------------------------------------------------+

Ранее мы здесь создавали новый абстрактный графический объект. Теперь же мы создаём объект соответствующего типа при помощи классов-наследников, созданных сегодня. После успешного создания объекта добавим ему свойство принадлежности (не принадлежит программе), и вместо вывода краткого описания созданного объекта, в журнал будем выводить полное описание всех его свойств.
Для выбора нужного объекта, который требуется создать, используем метод, создающий новый объект стандартного графического объекта:

//+------------------------------------------------------------------+
//| Создаёт новый объект стандартного графического объекта           |
//+------------------------------------------------------------------+
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;
     }
  }
//+------------------------------------------------------------------+

Здесь всё просто: в метод передаётся тип объекта, который требуется создать, идентификатор графика, на который был добавлен графический объект, и имя нового графического объекта. Далее, в зависимости от типа графического объекта, переданного в метод, создаём при помощи оператора new новый объект соответствующего класса-наследника абстрактного графического объекта и сразу же возвращаем результат создания этого нового объекта.

Метод вернёт либо указатель на вновь созданный объект, либо NULL при какой-либо ошибке создания объекта. Как видим, не все объекты ещё создаются. Остальные будем делать в следующей статье наряду с доработками, которые обязательно внесём в созданные сегодня классы — нам необходимо будет сделать доступ ко всем свойствам всех опорных точек объекта, а не к самой первой как это сделано на данном этапе.

У нас всё готово для тестирования.

Тестирование

Для теста возьмём советник из прошлой статьи и сохраним его в новой папке \MQL5\Experts\TestDoEasy\Part84\ под новым именем TestDoEasyPart84.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): Класс абстрактного стандартного графического объекта

Прикрепленные файлы |
MQL5.zip (4159.92 KB)
Стать хорошим программистом (Часть 3): 5 советов, чтобы лучше программировать на MQL5 Стать хорошим программистом (Часть 3): 5 советов, чтобы лучше программировать на MQL5
Статья обязательна к прочтению для всех, кто хочет улучшить свою карьеру программиста. Цель этой серии статей — помочь любому читателю, даже опытному, улучшить навыки программирования. Описанные в статье идеи работают как для начинающих MQL5-программистов, так и для профессионалов.
Стать хорошим программистом (Часть 2): избавляемся еще от пяти привычек на пути к лучшему программированию на MQL5 Стать хорошим программистом (Часть 2): избавляемся еще от пяти привычек на пути к лучшему программированию на MQL5
Статья обязательна к прочтению для всех, кто хочет улучшить свою карьеру программиста. Цель этой серии статей — помочь любому читателю, даже опытному, улучшить навыки программирования. Описанные в статье идеи работают как для начинающих MQL5-программистов, так и для профессионалов.
Стать хорошим программистом (Часть 4): повышаем скорость программирования Стать хорошим программистом (Часть 4): повышаем скорость программирования
Я полагаю, каждый разработчик хочет писать код быстрее. При этом возможность быстро и эффективно писать код — это не какая-то особая врожденная способность, доступная только избранным. Это навык, которым может овладеть любой программист, независимо от предыдущего опыта и объема набранных на клавиатуре текстов.
Графика в библиотеке DoEasy (Часть 83): Класс абстрактного стандартного графического объекта Графика в библиотеке DoEasy (Часть 83): Класс абстрактного стандартного графического объекта
В статье создадим класс абстрактного графического объекта. Этот объект будет основой для создания классов стандартных графических объектов. Свойств у графических объектов много, и сегодня, прежде чем создать класс абстрактного графического объекта, нам необходимо будет сделать объёмную подготовительную работу — прописать эти свойства в перечислениях библиотеки.