Новая версия платформы MetaTrader 4 build 1350 - страница 15

 
Ihor Herasko #:

Проверил. Да, зависает. Но пример слишком неочевиден. Лучше сделать вот такую тестовую подборку.

Советник Test_Expert:

Индикатор Test:

Для воспроизведения:

  1. Запустить советник и индикатор на одном графике. 
  2. Произвести клик левой клавишей мыши на красном прямоугольнике (на одной из пяти его опорных точек). 
Получится, хоть и недолгое, но зависание. В журнале видно следующее:

Эксперт выполнял удаление объектов почти 10 секунд. Таким образом, проблема имеется. Возникает вопрос: что при этом произошло с индикатором? Ведь о его действиях в журнале ничего нет. Его объект бесследно исчез. Новые попытки запустить индикатор, не выгружая, ни к чему не приводят. Нужно только удалить индикатор с графика и присоединить заново.

Думаю, тут проблема в синхронизации потоков: эксперт (отдельный поток) получает сообщение о переключении графика и начинает выполнять удаление единственного объекта, но ему каким-то образом мешает поток индикатора (он же - GUI терминала). К чести терминала, получившийся dead lock (если это действительно он), со временем раскрывается, что и позволяет терминалу продолжить работу, хоть и с небольшим подвисанием.

в приведённом коде - наличиствует потенциальный "клинч"

функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту. 

выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.

 
Maxim Kuznetsov #:

в приведённом коде - наличиствует потенциальный "клинч"

функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту. 

выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.

какой клинч наличиствует при Comment(""); ?

 
Taras Slobodyanik #:

какой клинч наличиствует при Comment(""); ?

а куда по вашему выводится Comment() ?

 
Maxim Kuznetsov #:

а куда по вашему выводится Comment() ?

ок, спрошу иначе

Maxim Kuznetsov #:

Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту. 

какие объекты удаляет и индикатор и эксперт одновременно при Comment("")?

вы код видели? о каком сканировании и каких объектах вы говорите? (одновременно и в ЕА и в Индикаторе)

 
Maxim Kuznetsov #:

в приведённом коде - наличиствует потенциальный "клинч"

функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту. 

выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.

Пробовал переносить в OnCalculate(). Поведение остается таким же.

 
Vladislav Andruschenko #:

каким образом "получается подружить"? 


Эта проблема возникла не сильно давно. Примерно год (или ????) назад стали появляться такие проблемы. 

Пробовал без канваса, bmp ... 

Чистая панель с кнопкой + индикатор с переключением ТФ/символа = зависание! 

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

Без панели с кнопкой не пробовали? ) 

Индикатор с переключением ТФ/символа нарушает архитектурные принципы системы. Система иерархичная, а здесь она стала сетевой, чего не ожидала. 

Такое бывало и раньше, но только на уровне терминала, программ не касалось. 

 

Теперь - что делать. Как я понимаю, Метаквоты всё, что нужно реализовали в MQ5 и там этой проблемы нет. ( Не утверждаю, а лишь предполагаю )

Рекомендации для MQ4: 

1. Всегда помните, что система иерархичная: Счёт-Терминал-Инструмент-Масштаб. Меняйте параметры только сверху вниз в этой иерархии, иначе всё сломается. 

2. Максимально осторожно подходите к использованию инструментария MT5, там всё хорошо, надеюсь. 

 
Алексей Тарабанов #:

Теперь - что делать. Как я понимаю, Метаквоты всё, что нужно реализовали в MQ5 и там этой проблемы нет. ( Не утверждаю, а лишь предполагаю )

Рекомендации для MQ4: 

1. Всегда помните, что система иерархичная: Счёт-Терминал-Инструмент-Масштаб. Меняйте параметры только сверху вниз в этой иерархии, иначе всё сломается. 

2. Максимально осторожно подходите к использованию инструментария MT5, там всё хорошо, надеюсь. 

В мт5 проблем нет. 

 
Vitaliy Kuznetsov #:

Ключевой ответ - в МТ5 не виснет, там это решили, но про МТ4 забыли.

В МТ5 другая архитектура. Там у каждого символа свой поток.

В МТ4, вроде, один интерфейсный поток, поэтому любой индюк с бесконечным циклом вешает всю платформу.

 

В мт4 работает отменно:

Индикатор на графике с EventSetMillisecondTimer(50);

Кидаем на график советник EventSetMillisecondTimer(100);

В мт5 по отдельности всё работает, а вместе работает несколько минут и обе программы становятся неактивны, если удалить советник, то индикатор начинает работать.

Если в советнике установить таймер на 500, тогда связка работает.

С архитектурой большие проблемы в мт5

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