Функция обработки событий OnChartEvent

Индикатор или эксперт может получать интерактивные события от терминала, если в коде описана функция OnChartEvent со следующим прототипом.

void OnChartEvent(const int event, const long &lparam, const double &dparam, const string &sparam)

Эта функция будет вызываться терминалом в ответ на действия пользователя или в случае генерации "пользовательского события" с помощью EventChartCustom.

В параметре event передается идентификатор события (его тип) — одно из значений перечисления ENUM_CHART_EVENT (см. таблицу).

Идентификатор

Описание

CHARTEVENT_KEYDOWN

Действие на клавиатуре

CHARTEVENT_MOUSE_MOVE

Перемещение мыши и нажатие кнопок мышки (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE)

CHARTEVENT_MOUSE_WHEEL

Нажатие или прокрутка колесика мышки (если для графика установлено свойство CHART_EVENT_MOUSE_WHEEL)

CHARTEVENT_CLICK

Нажатие мышки на графике

CHARTEVENT_OBJECT_CREATE

Создание графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE)

CHARTEVENT_OBJECT_CHANGE

Изменение графического объекта через диалог свойств

CHARTEVENT_OBJECT_DELETE

Удаление графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE)

CHARTEVENT_OBJECT_CLICK

Нажатие мышки на графическом объекте

CHARTEVENT_OBJECT_DRAG

Перетаскивание графического объекта

CHARTEVENT_OBJECT_ENDEDIT

Окончание редактирования текста в графическом объекте "поле ввода"

CHARTEVENT_CHART_CHANGE

Изменение размеров или свойств графика (через диалог свойств, панель инструментов или контекстное меню)

CHARTEVENT_CUSTOM

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

CHARTEVENT_CUSTOM_LAST

Конечный номер события из диапазона пользовательских событий

Параметры lparam, dparam, sparam используются по-разному в зависимости от типа события. В общем можно сказать, что они содержат дополнительные данные, необходимые для обработки конкретного события. В следующих разделах приведены подробности для каждого типа.

Внимание! Функция OnChartEvent вызывается только в индикаторах и экспертах, которые непосредственно нанесены на график. Если какой-либо индикатор создан программно с помощью iCustom или IndicatorCreate, в него события OnChartEvent транслироваться не будут.
 
Кроме того, обработчик OnChartEvent не вызывается в тестере, даже в визуальном режиме.

Для первой демонстрации обработчика OnChartEvent рассмотрим безбуферный индикатор EventAll.mq5, который позволяет перехватывать и записывать в журнал все события.

void OnChartEvent(const int id,
   const long &lparamconst double &dparamconst string &sparam)
{
   ENUM_CHART_EVENT evt = (ENUM_CHART_EVENT)id;
   PrintFormat("%s %lld %f '%s'"EnumToString(evt), lparamdparamsparam);
}

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

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

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

CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_CLICK 149 144.000000 ''
CHARTEVENT_OBJECT_CLICK 112 105.000000 'Daily Rectangle 53404'
CHARTEVENT_CLICK 112 105.000000 ''
CHARTEVENT_KEYDOWN 46 1.000000 '339'
CHARTEVENT_CLICK 13 252.000000 ''
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Button 61349'
CHARTEVENT_OBJECT_CLICK 145 104.000000 'Daily Button 61349'
CHARTEVENT_CLICK 145 104.000000 ''
CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Vertical Line 22641'
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Vertical Line 22641'
CHARTEVENT_OBJECT_CLICK 177 206.000000 'Daily Vertical Line 22641'
CHARTEVENT_CLICK 177 206.000000 ''
CHARTEVENT_OBJECT_CHANGE 0 0.000000 'Daily Rectangle 37930'
CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_CLICK 152 118.000000 ''

Здесь мы видим события различных типов, значения их параметров станут понятны после прочтения следующих разделов.