Русский

Справочник MQL4 Работа с событиями EventChartCustom

EventChartCustom

Генерирует пользовательское событие для указанного графика.

bool  EventChartCustom(
   long    chart_id,            // идентификатор графика-получателя события
   ushort  custom_event_id,     // идентификатор события
   long    lparam,              // параметр типа long
   double  dparam,              // параметр типа double
   string  sparam               // строковый параметр события
   );

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

custom_event_id

[in]  Идентификатор пользовательского события. Этот идентификатор автоматически добавляется к значению CHARTEVENT_CUSTOM и преобразуется к целому типу.

lparam

[in]  Параметр события типа long, передаваемый функции OnChartEvent.

dparam

[in]  Параметр события типа double, передаваемый функции OnChartEvent.

sparam

[in]  Параметр события типа string, передаваемый функции OnChartEvent. Если строка имеет длину больше, чем 63 символа, то строка усекается.

Возвращаемое значение

Возвращает true в случае удачной постановки пользовательского события в очередь событий графика – получателя события. В случае ошибки возвращает false, для получения кода ошибки используйте GetLastError().

Примечание

Эксперт или индикатор, прикрепленный к указанному графику, обрабатывает данное событие при помощи функции OnChartEvent(int event_id, long& lparam, double& dparam, string& sparam).

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

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра  sparam

Событие нажатия клавиатуры

CHARTEVENT_KEYDOWN

код нажатой клавиши

Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии

Строковое значение битовой маски, описывающее статус кнопок клавиатуры

События мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_MOVE

X координата

Y координата

Строковое значение битовой маски, описывающее статус кнопок мыши

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

CHARTEVENT_OBJECT_CREATE

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

Событие изменения свойств объекта через диалог свойств

CHARTEVENT_OBJECT_CHANGE

Имя измененного графического объекта

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

CHARTEVENT_OBJECT_DELETE

Имя удаленного графического объекта

Событие щелчка мыши на графике

CHARTEVENT_CLICK

X координата

Y координата

Событие щелчка мыши на графическом объекте

CHARTEVENT_OBJECT_CLICK

X координата

Y координата

Имя графического объекта, на котором произошло событие

Событие перемещения графического объекта при помощи мыши

CHARTEVENT_OBJECT_DRAG

Имя перемещенного графического объекта

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

CHARTEVENT_OBJECT_ENDEDIT

Имя графического объекта "Поле ввода", в котором завершилось редактирование текста

Событие изменения графика

CHARTEVENT_CHART_CHANGE

Пользовательское событие с номером N

CHARTEVENT_CUSTOM+N

Значение, заданное функцией EventChartCustom()

Значение, заданное функцией EventChartCustom()

Значение, заданное функцией EventChartCustom()

Пример:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отладочное сообщение
         Print("Кнопка нажата = ",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID = ",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное сообщение от графика с id = "+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID = ",id);
         //--- выведем сообщение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытым графикам       |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)                // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // на основании предыдущего получим новый график
      if(currChart==-1) break;        // достигли конца списка графиков
      i++;                            // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Смотри также

События клиентского терминала, Функции обработки событий