Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
pavlick_
423
pavlick_  

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

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

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

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

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

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

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

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

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

Dina Paches
8497
Dina Paches  

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
46937
Dmitry Fedoseev  
Не стоило бы уповать на этот порядок. Искать другой способ решения задачи.
Dina Paches
8497
Dina Paches  
Dmitry Fedoseev:
Не стоило бы уповать на этот порядок. Искать другой способ решения задачи.
Но и дискредитировать не стоит. Насколько знаю, хоть вероятность пропуска обработки событий в OnChartEvent и существует, но на практике лично я с этим не припоминаю, чтобы сталкивалась.
pavlick_
423
pavlick_  
Спасибо за внимание к вопросу, но хотелось бы увидеть комментарий авторов. Потому что хочется написать опираясь на какие-то гарантии языка/библиотеки, а не обнаружить в какой-то момент, что при выходе нового билда работать стало иначе, а порядок сообщений - UB.  Вообще картина примерно такая:
1. Графические объекты объединены в группы, удаление одного элемента группы приводит к удалению и остальных элементов той же самой группы (структура имени: №группы-№подгруппы-индекс_элемента).
2. Удаление объектов отлавливает обработчик OnChartEvent, видя удаление эл-та группы, он удаляет всю группу (если ручками удаляем один элемент, то под снос идёт вся группа-подгруппа).
3. В то же время удаление может производиться программно из эксперта. Например, мы хотим перерисовать сложную фигуру из трендовых линий. Для этого мы должны удалить целиком старую группу, и следующим шагом нарисовать новую фигуру (с теми же номерами группы и подгруппы). Да, можно инкрементировать подгруппу, но оставить прежний номер видится более правильным.
4. Очевидно, что удаление из эксперта и удаление в обработчике будут мешать друг другу, поэтому подумал о такой схеме: шлём обработчику событий графика сообщение-запрет на игнорирование удаления какой-то группы-подгруппы (Говорим-не трогай группу 1-1, удалять будет эксперт), удаляем группу из эксперта, шлём сообщение отменяющее предыдущий запрет, отрисовываем фигуру из эксперта под старым именем.

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

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

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


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

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

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


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

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

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

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