Поиск объектов

Для поиска объектов на графике существует 3 функции. Первые две — ObjectsTotal и ObjectName — позволяют организовать перебор объектов по имени, и далее, если требуется, использовать имя каждого объекта для анализа его прочих свойств (о том, как это делается, мы расскажем в следующем разделе). Третья функция ObjectFind позволяет по известному имени проверить существование объекта. В принципе, то же самое можно сделать, просто запросив какое-либо свойство через ObjectGet-функцию: если объекта с переданным именем нет, мы получим ошибку в _LastError, но это менее удобно, чем вызов ObjectFind. Кроме того она дополнительно сразу возвращает номер окна, в котором находится объект.

int ObjectsTotal(long chartId, int window = -1, int type = -1)

Функция возвращает количество объектов на графике с идентификатором chartId (0 — текущий график). В расчет принимаются только объекты в подокне с номером window (0 — основное окно, -1 — основное окно и все подокна), а также объекты конкретного типа, указанного в параметре type (-1 означает по умолчанию все типы). Значением type может быть элемент перечисления ENUM_OBJECT.

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

string ObjectName(long chartId, int index, int window = -1, int type = -1)

Функция возвращает имя объекта под номером index на графике с идентификатором chartId. При составлении внутреннего списка, внутри которого и ищется объект, в расчет принимаются указанные номер подокна (window) и тип объектов (type). Список отсортирован по названиям объектов в лексикографическом порядке, то есть, в частности, по алфавиту с учетом регистра.

Как и ObjectsTotal, ObjectName в процессе своего выполнения дожидается выборки всей очереди команд графика и затем возвращает имя объекта из актуализированного списка объектов.

В случае ошибки будет получена пустая строка, в _LastError занесен код OBJECT_NOT_FOUND (4202).

Для проверки работы этих двух функций создадим скрипт ObjectFinder.mq5, который выводит в журнал все объекты на всех графиках. В нем применены уже известные нам функции перебора графиков (ChartFirst и ChartNext), а также функции получения свойств графиков (ChartSymbol, ChartPeriod, ChartGetInteger).

#include <MQL5Book/Periods.mqh>
   
void OnStart()
{
   int count = 0;
   long id = ChartFirst();
   // цикл по графиках
   while(id != -1)
   {
      PrintFormat("%s %s (%lld)"ChartSymbol(id), PeriodToString(ChartPeriod(id)), id);
      const int win = (int)ChartGetInteger(idCHART_WINDOWS_TOTAL);
      // цикл по окнам
      for(int k = 0k < win; ++k)
      {
         PrintFormat("  Window %d"k);
         const int n = ObjectsTotal(idk);
         // цикл по объектам
         for(int i = 0i < n; ++i)
         {
            const string name = ObjectName(idik);
            const ENUM_OBJECT type = (ENUM_OBJECT)ObjectGetInteger(idnameOBJPROP_TYPE);
            PrintFormat("    %s %s"EnumToString(type), name);
            ++count;
         }
      }
      id = ChartNext(id);
   }
   
   PrintFormat("%d objects found"count);
}

Для каждого графика определяем количество подокон (ChartGetInteger(id, CHART_WINDOWS_TOTAL)) и вызываем для каждого подокна ObjectsTotal и, во внутреннем цикле, — ObjectName. Далее по имени находим тип объекта и выводим их вместе в журнал.

Ниже приведен вариант возможного результата работы скрипта (с сокращениями).

EURUSD H1 (132358585987782873)
  Window 0
    OBJ_FIBO H1 Fibo 58513
    OBJ_TEXT H1 Text 40688
    OBJ_TREND H1 Trendline 3291
    OBJ_VLINE H1 Vertical Line 28732
    OBJ_VLINE H1 Vertical Line 33752
    OBJ_VLINE H1 Vertical Line 35549
  Window 1
  Window 2
EURUSD D1 (132360375330772909)
  Window 0
EURUSD M15 (132544239145024745)
  Window 0
    OBJ_VLINE H1 Vertical Line 27032
...
XAUUSD D1 (132544239145024746)
  Window 0
    OBJ_EVENT ObjShow-2021.11.25 00:00:00
    OBJ_TEXT ObjShow-2021.11.26 00:00:00
    OBJ_ARROW_SELL ObjShow-2021.11.29 00:00:00
    OBJ_ARROW_BUY ObjShow-2021.11.30 00:00:00
    OBJ_ARROW_RIGHT_PRICE ObjShow-2021.12.01 00:00:00
    OBJ_ARROW_LEFT_PRICE ObjShow-2021.12.02 00:00:00
    OBJ_ARROW_CHECK ObjShow-2021.12.03 00:00:00
    OBJ_ARROW_STOP ObjShow-2021.12.06 00:00:00
    OBJ_ARROW_DOWN ObjShow-2021.12.07 00:00:00
    OBJ_ARROW_UP ObjShow-2021.12.08 00:00:00
    OBJ_ARROW_THUMB_DOWN ObjShow-2021.12.09 00:00:00
    OBJ_ARROW_THUMB_UP ObjShow-2021.12.10 00:00:00
    OBJ_HLINE ObjShow-2021.12.13 00:00:00
    OBJ_VLINE ObjShow-2021.12.14 00:00:00
...
35 objects found

Здесь, в частности, видно, что на графике XAUUSD D1 находятся объекты, сгенерированные скриптом ObjectSimpleShowcase.mq5. На некоторых графиках и в некоторых подокнах объектов нет.

int ObjectFind(long chartId, const string name)

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

Если объект не найден, функция возвращает отрицательное число. Как и предыдущие функции данного раздела, ObjectFind использует синхронный вызов.

Пример использования данной функции мы увидим в скрипте ObjectCopy.mq5 в следующем разделе.