Порядок событий графика

 

Здравствуйте.

Существуют ли основания/гарантии того, что следующие предположения верны:

Существует эксперт, который содержит обработчик OnChartEvent. Из другого скрипта сначала отправляем пользовательское событие через EventChartCustom, а потом удаляем графический объект с графика, что приводит к отправке обработчику  CHARTEVENT_OBJECT_DELETE. Обработчик получит события в том порядке, который наблюдает скрипт (сначала пользовательское, а потом CHARTEVENT_OBJECT_DELETE).

Функции обработки событий - Функции - Основы языка - Справочник MQL4
Функции обработки событий - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Функции обработки событий - Функции - Основы языка - Справочник MQL4
 
pavlick_:

Здравствуйте.

Существуют ли основания/гарантии того, что следующие предположения верны:

Существует эксперт, который содержит обработчик OnChartEvent. Из другого скрипта сначала отправляем пользовательское событие через EventChartCustom, а потом удаляем графический объект с графика, что приводит к отправке обработчику  CHARTEVENT_OBJECT_DELETE. Обработчик получит события в том порядке, который наблюдает скрипт (сначала пользовательское, а потом CHARTEVENT_OBJECT_DELETE).

К этой статье прилагается в конце индикатор с именем: test_types_of_chart_events. Описание о нём в пп.3.1.2. статьи. На основе его работы можно понаблюдать порядок получения событий.

Запустите его на график и упоминаемые вами программы.

 

P./S.: Для событий, не перечисленных явно в его коде и не запрещённых во внешних параметрах(и внутри кода) к обработке, вывод информации  предусмотрен через default в его блоке switch(id)

      switch(id)
        {
        ...
         //---
         default: nameChartEvent="UNKNOWN";                 break;
        }
      //---
      StringConcatenate(text,LINE_NUMBER,nameChartEvent,": id = ",
                        IntegerToString(id),", lparam: ",lparam,
                        ", dparam: ",dparam,", sparam: ",sparam);
      Print(text);
Т.е., отображение по событиям на графике, не перечисленным и не запрещённым к обработке в коде этого индикатора: их id, lparam, dparam, sparam, под именем: "UNKNOWN".
 
Не стоило бы уповать на этот порядок. Искать другой способ решения задачи.
 
Dmitry Fedoseev:
Не стоило бы уповать на этот порядок. Искать другой способ решения задачи.
Но и дискредитировать не стоит. Насколько знаю, хоть вероятность пропуска обработки событий в OnChartEvent и существует, но на практике лично я с этим не припоминаю, чтобы сталкивалась.
 
Спасибо за внимание к вопросу, но хотелось бы увидеть комментарий авторов. Потому что хочется написать опираясь на какие-то гарантии языка/библиотеки, а не обнаружить в какой-то момент, что при выходе нового билда работать стало иначе, а порядок сообщений - UB.  Вообще картина примерно такая:
1. Графические объекты объединены в группы, удаление одного элемента группы приводит к удалению и остальных элементов той же самой группы (структура имени: №группы-№подгруппы-индекс_элемента).
2. Удаление объектов отлавливает обработчик OnChartEvent, видя удаление эл-та группы, он удаляет всю группу (если ручками удаляем один элемент, то под снос идёт вся группа-подгруппа).
3. В то же время удаление может производиться программно из эксперта. Например, мы хотим перерисовать сложную фигуру из трендовых линий. Для этого мы должны удалить целиком старую группу, и следующим шагом нарисовать новую фигуру (с теми же номерами группы и подгруппы). Да, можно инкрементировать подгруппу, но оставить прежний номер видится более правильным.
4. Очевидно, что удаление из эксперта и удаление в обработчике будут мешать друг другу, поэтому подумал о такой схеме: шлём обработчику событий графика сообщение-запрет на игнорирование удаления какой-то группы-подгруппы (Говорим-не трогай группу 1-1, удалять будет эксперт), удаляем группу из эксперта, шлём сообщение отменяющее предыдущий запрет, отрисовываем фигуру из эксперта под старым именем.

Запутанно описал, наверное.
 
Выходные закончились, надеюсь получить ответ от сотрудников МК. Господа, допустим имеем:

1. Скрипт, который шлёт пользовательское событие графику через EventChartCustom() ("событие 1"), потом удаляет графический объект с графика (это генерирует CHARTEVENT_OBJECT_DELETE "собыие 2"), шлёт пользовательское событие через EventChartCustom() ("событие 3").

2. Эксперт, который содержит обработчик OnChartEvent().


Гарантируется ли то, что эксперт получит события в следующем порядке (и не в каком другом): "событие 1", "событие 2", "событие 3" ?
 
Вы можете сами послать событие при успешном удалении, я так понимаю это полностью решает вопрос.
 
pavlick_:
Выходные закончились, надеюсь получить ответ от сотрудников МК. Господа, допустим имеем:

1. Скрипт, который шлёт пользовательское событие графику через EventChartCustom() ("событие 1"), потом удаляет графический объект с графика (это генерирует CHARTEVENT_OBJECT_DELETE "собыие 2"), шлёт пользовательское событие через EventChartCustom() ("событие 3").

2. Эксперт, который содержит обработчик OnChartEvent().


Гарантируется ли то, что эксперт получит события в следующем порядке (и не в каком другом): "событие 1", "событие 2", "событие 3" ?
насколько я знаю, события "складываются" в список событий терминала в порядке поступления. ситуацию, когда событие пропало ещё представить себе можно, но что бы события перемешались - это невозможно. иногда я делаю, что бы приёмник посылал ответное событие о получении события или о завершении какой либо операции. так у меня работает советник для расчетов и индикаторы для отображения графической информации.
 

Пропавшее сообщение? Просто супер )).

У одного графика может быть более одного обработчика OnChartEvent? Даже в одном эксперте? Терминал дёрнит их обоих при поступлении любого сообщения?

 
Смотря на ваши ответы, начал думать, что обработчики выполняются в разных потока и можно иметь разделяемые данные, проверил - все события в одном потоке обрабатываются. Заводить несколько программ для разных целей (индикатор для OnChartEvent и эксперт для OnTimer) как-то не очень (ну если другого выхода не будет, то возможно и так сделаю). Спасибо за идею (Хотя не выйдет ничего, ну пошлю я из индикатора сообщение, как я его в эксперте отловлю, когда подтверждение необходимо получить находясь в OnTimer? Все обработчики в одном потоке, OnChartEvent эксперта не отработает пока не завершится OnTimer). Вопрос к МК по прежнему актуален https://www.mql5.com/ru/forum/99111#comment_2933135