Асинхронное и многопоточное программирование в MQL - страница 26

 
Vladimir Simakov:
Синхронизация - это задача программиста, не умеешь, не пользуешься многопоточностью. Задача создателей дать инструмент, а там уже каждый сам себе злобный буратино. Тот же а-ля mutex самому реализовать вообще не проблема.

к сожалению это не так, целевая аудитория MQL - кто?  (имхо, прикладные программисты, знающие основы программирования)

да и речь все равно будет идти о MQL5 ( разработчики не однократно сказали, что обновлений MQL4 больше не будет)

Cам MQL5 уже изначально работает в ассинхронном режиме - запрос исторических данных, например (или вернет данные или запустит подкачку в фоне и вернет ошибку) и так все работает, что касается обмена данными между терминалом и MQL-программой,

и вот эти моменты уже вызывают недоумение, что вместо возврата значений нужно постоянно проверять готовность данных и так через раз.... при переходе с MQL4 это жуть как не удобно


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

;)

 
Andrey Barinov:

GUI должен крутиться в главном эксперте, а все остальное в отдельном эксперте. Этот отдельный слейв эксперт помещается на невидимый OBJ_CHART и взаимодействует с главным путем EventSendCustom().

Не знаю, как сейчас. Раньше, вроде, только скрипты запускались на OBJ_CHART. Какая-то еще особенность с входными параметрами была.

Попробовал запросить бары со всех символов из Обзора рынка. История по всем закачана. Десятки секунд один проход цикла! Мягко говоря, не порадовал MT5.
 
fxsaber:

Не знаю, как сейчас. Раньше, вроде, только скрипты запускались на OBJ_CHART. Какая-то еще особенность с входными параметрами была.

Попробовал запросить бары со всех символов из Обзора рынка. История по всем закачана. Десятки секунд один проход цикла! Мягко говоря, не порадовал MT5.

Советники запускаются, только ни тики ни таймер там не работает. Только по OnChartEvent можно все запускать (а тики и таймер транслировать туда с главного советника). 

Больше ограничений не заметил. Все работает.

Но можно и на обычный чарт по такому же принципу делать. (в МТ4 у меня так, т.к. там OBJ_CHART нет)
 
Andrey Barinov:

Советники запускаются, только ни тики ни таймер там не работает. Только по OnChartEvent можно все запускать (а тики и таймер транслировать туда с главного советника). 

Больше ограничений не заметил. Все работает.

Прикольно. Не знал о такой возможности. А почему gui в индикатор не поместить и взаимодействовать через ресурсы? У меня так. EventChartCustom() передает до 128 символов, один дабл и лонг за раз и становится в очередь OnChartEvent() , а в ресурсы можно поместить сколько угодно символов, и значений любых типов через юнионы. И в очередь не становиться. Берешь когда нужно.
 
Реter Konow:
Прикольно. Не знал о такой возможности. А почему gui в индикатор не поместить и взаимодействовать через ресурсы? У меня так. EventChartCustom() передает до 128 символов, один дабл и лонг за раз и становится в очередь OnChartEvent() , а в ресурсы можно поместить сколько угодно символов, и значений любых типов через юнионы. И в очередь не становиться. Берешь когда нужно.

Спасибо, про OnChartEvent не знал. Синхронизацию делаете через кастомные события? Обмен данными?

 
Реter Konow:
Прикольно. Не знал о такой возможности. А почему gui в индикатор не поместить и взаимодействовать через ресурсы? У меня так. EventChartCustom() передает до 128 символов, один дабл и лонг за раз и становится в очередь OnChartEvent() , а в ресурсы можно поместить сколько угодно символов, и значений любых типов через юнионы. И в очередь не становиться. Берешь когда нужно.

Я данные не передаю по OnChartEvent. Только события. Иначе в советнике агенте ни одного события нет, а так он получает ONTIMER_BEAT  и ONTICK_BEAT.

А данными обмениваться можно или через файл или через ресурсы, в зависимости от задачи. Я чаще испльльзую файлы, т.к. они же используются для восстановления ГУИ и всего остального после рестарта терминала.

Ваш GUI умеет запоминать и восстанавливать свой вид после рестарта терминала?

 
fxsaber:

Спасибо, про OnChartEvent не знал. Синхронизацию делаете через кастомные события? Обмен данными?

 Каждое сообщение каждой стороны имеет порядковый номер. Когда сторона А посылает стороне В сообщение, она прежде смотрит, было ли прочитано предыдущее сообщение. Если нет, новое не посылает. Когда сторона В посылает стороне А сообщение, точно также смотрит было ли прочитано прежнее сообщение. 
 
Andrey Barinov:

Я данные не передаю по OnChartEvent. Только события. Иначе в советнике агенте ни одного события нет, а так он получает ONTIMER_BEAT  и ONTICK_BEAT.

А данными обмениваться можно или через файл или через ресурсы, в зависимости от задачи. Я чаще испльльзую файлы, т.к. они же используются для восстановления ГУИ и всего остального после рестарта терминала.

Ваш GUI умеет запоминать и восстанавливать свой вид после рестарта терминала?

Я бы предложил полностью отказаться от EventChartCustom() именно по причине очереди, которая иногда может вызывать торможения. Взаимодействовать через ресурсы делая двусторонние запросы на частоте таймера. К примеру, если на стороне А сильно загружена OnChartEvent(), а сторона В посылает событие нажатие кнопки Cancel, то сторона А может принять это событие с опозданием из за какой то ерунды, которая ее нагружает.

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

 
Реter Konow:

Я бы предложил полностью отказаться от EventChartCustom() именно по причине очереди, которая иногда может вызывать торможения. Взаимодействовать через ресурсы делая двусторонние запросы на частоте таймера. К примеру, если на стороне А сильно загружена OnChartEvent(), а сторона В посылает событие нажатие кнопки Cancel, то сторона А может принять это событие с опозданием из за какой то ерунды, которая ее нагружает.

Таймер не работает в советнике который на OBJ_CHART. Там НИКАКИХ СОБЫТИЙ нет (Кроме OnChartEvent). Поэтому приходится все события (OnTick, OnTimer etc)  слать туда из главного советника.

Кроме того, нажатия кнопок я не шлю туда сюда. Это ни к чему.
 
Andrey Barinov:

Таймер не работает в советнике который на OBJ_CHART. Там НИКАКИХ СОБЫТИЙ нет (Кроме OnChartEvent). Поэтому приходится все события (OnTick, OnTimer etc)  слать туда из главного советника.

Кроме того, нажатия кнопок я не шлю туда сюда. Это ни к чему.

Предлагаю в качестве носителя GUI использовать индикатор, а для связи с советником - ресурсы. К тому же, в МТ4 сможете управлять советником тестере с обычного графика с помощью панели. Будут работать все элементы управления,а не только кнопки. Сможете передавать текст, и вообще что угодно в тестируемого советника. Я это уже проверял. Все работает.

ЗЫ. и тестируемый советник будет передавать на обычный график разные данные.

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