Порядок событий графика - страница 2

 

pavlick_: 

Хотя не выйдет ничего, ну пошлю я из индикатора сообщение, как я его в эксперте отловлю, когда подтверждение необходимо получить находясь в OnTimer? 

Принять сообщение в OnChartEvent() и сохранить результат в глобальной переменной.

Сообщения можно отсылать не только другим программам на одном графике, но даже и на другие графики. 

 

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


Если гарантий порядка никаких нет, то можно было бы задействовать lparam или dparam (всё равно они не работают при CHARTEVENT_OBJECT_DELETE). Можно пердавать в них инициатора удаления (например, 0 - вручную, 1 - из мкл кода).

МК как всегда многословны, вопросы порядка - это большая тайна? Застопорился на этой мелочи и не могу продвинуться дальше.
 

pavlick_:
Anatoli, я думал об этом, но это ведь огромная задержка, фигура будет мерцать (появляться и исчезать), не выход это.

Если гарантий порядка никаких нет, то можно было бы задействовать lparam или dparam (всё равно они не работают при CHARTEVENT_OBJECT_DELETE). Можно пердавать в них инициатора удаления (например, 0 - вручную, 1 - из мкл кода).

МК как всегда многословны, вопросы порядка - это большая тайна? Застопорился на этой мелочи и не могу продвинуться дальше. 

Сделайте краткий пример и обозначьте проблему на результате его теста. Так понятнее будет, что подсказать, если есть проблема и есть ли вообще.
 
Anatoli Kazharski:
Сделайте краткий пример и обозначьте проблему на результате его теста. Так понятнее будет, что подсказать, если есть проблема и есть ли вообще.
Спасибо за попытку помочь, я подумаю как полаконичней сделать пример, и выложу позже.
 
pavlick_:

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

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

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

https://www.mql5.com/ru/docs/eventfunctions/eventchartcustom

Внимательно читаем:

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

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

Обращаем внимание на слово "очередь". Оно тут не случайно употребляется.

Документация по MQL5: Работа с событиями / EventChartCustom
Документация по MQL5: Работа с событиями / EventChartCustom
  • www.mql5.com
Работа с событиями / EventChartCustom - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Anton:

https://www.mql5.com/ru/docs/eventfunctions/eventchartcustom

Внимательно читаем:

Обращаем внимание на слово "очередь". Оно тут не случайно употребляется.

т.е. ответом на следующий вопрос будет да?

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

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

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


Гарантируется ли то, что эксперт получит события в следующем порядке (и не в каком другом): "событие 1", "событие 2", "событие 3" ?
 
pavlick_:

т.е. ответом на следующий вопрос будет да?

Да, термин "очередь" определяет именно такой порядок доступа к данным.
 
Anton:
Да, термин "очередь" определяет именно такой порядок доступа к данным.
Ясно. Спасибо за ответ, и благодарность всем участникам.
 
Andrey Khatimlianskii:
А событие удаление объекта создастся гарантированно до выхода из функции ObjectDelete? Там нет асинхронности, связанной с перерисовкой чарта?

Эта функция лишь размещает команду на удаление объекта в очереди чарта. Согласно заявленному порядку, в очереди чарта она появится после размещения в той же очереди пользовательского события через EventChartCustom. А значит во входящей очереди событий эксперта события будут появляться согласно последовательности процессинга очереди чарта. Т.е. пользовательское событие и только потом событие удаления объекта.

До или после выхода из функции ObjectDelete это произойдет - не имеет отношения к поставленному вопросу (последовательность обработки). Хотя ассинхронность процессинга работы с объектами в данном случае конечно есть, т.е. для гарантии процессинга удаления объекта (процессинга очереди чарта) нужно вызвать ChartRedraw().

 
Anton:

Эта функция лишь размещает команду на удаление объекта в очереди чарта. Согласно заявленному порядку, в очереди чарта она появится после размещения в той же очереди пользовательского события через EventChartCustom. А значит во входящей очереди событий эксперта события будут появляться согласно последовательности процессинга очереди чарта. Т.е. пользовательское событие и только потом событие удаления объекта.

До или после выхода из функции ObjectDelete это произойдет - не имеет отношения к поставленному вопросу (последовательность обработки). Хотя ассинхронность процессинга работы с объектами в данном случае конечно есть, т.е. для гарантии процессинга удаления объекта (процессинга очереди чарта) нужно вызвать ChartRedraw().

Ну началось, асинхронность, постановка в очередь )). Скрипт делает примерно это:

EventChartCustom();  // событие 1

ObjectDelete();    // событие 2

EventChartCustom();  // событие 3

Раз ObjectDelete() это постановка в очередь, т.е. функция не дожидается фактического удаления (возможно), то событие 3 может вполне оказаться раньше события 2 (их приём в OnChartEvent). Может и не так, но с ваших слов как-то так получается.

Причина обращения: