Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Проверил. Да, зависает. Но пример слишком неочевиден. Лучше сделать вот такую тестовую подборку.
Советник Test_Expert:
Индикатор Test:
Для воспроизведения:
Эксперт выполнял удаление объектов почти 10 секунд. Таким образом, проблема имеется. Возникает вопрос: что при этом произошло с индикатором? Ведь о его действиях в журнале ничего нет. Его объект бесследно исчез. Новые попытки запустить индикатор, не выгружая, ни к чему не приводят. Нужно только удалить индикатор с графика и присоединить заново.
Думаю, тут проблема в синхронизации потоков: эксперт (отдельный поток) получает сообщение о переключении графика и начинает выполнять удаление единственного объекта, но ему каким-то образом мешает поток индикатора (он же - GUI терминала). К чести терминала, получившийся dead lock (если это действительно он), со временем раскрывается, что и позволяет терминалу продолжить работу, хоть и с небольшим подвисанием.
в приведённом коде - наличиствует потенциальный "клинч"
функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту.
выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.
в приведённом коде - наличиствует потенциальный "клинч"
функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту.
выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.
какой клинч наличиствует при Comment(""); ?
какой клинч наличиствует при Comment(""); ?
а куда по вашему выводится Comment() ?
а куда по вашему выводится Comment() ?
ок, спрошу иначе
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту.
какие объекты удаляет и индикатор и эксперт одновременно при Comment("")?
вы код видели? о каком сканировании и каких объектах вы говорите? (одновременно и в ЕА и в Индикаторе)
в приведённом коде - наличиствует потенциальный "клинч"
функция ShowRectangle вызывается в OnInit индикатора и использует "синхронные" функции. ObjectsDeleteAll используется в OnDeinit эксперта и тоже является синхронной.
Эксперт работает в отдельном потоке от индикатора, они там "переругались" - один объекты удаляет, второй одновременно их сканирует, оба обращаются к общему ресурсу-чарту.
выход - не использовать "синхронные" функции в OnInit чего угодно, они за общий ресурс конкурируют. Вообще отрисовки не делать до первого OnChartEvent (или OnTimer/OnTick на крайний случай) когда всё уже загружено и работает.
Пробовал переносить в OnCalculate(). Поведение остается таким же.
каким образом "получается подружить"?
Эта проблема возникла не сильно давно. Примерно год (или ????) назад стали появляться такие проблемы.
Пробовал без канваса, bmp ...
Чистая панель с кнопкой + индикатор с переключением ТФ/символа = зависание!
Каким образом это получается "решить" у остальных "суперпупер" программистов - непонятно. Здесь же что спросить - так каждый молчит как партизан .....
Без панели с кнопкой не пробовали? )
Индикатор с переключением ТФ/символа нарушает архитектурные принципы системы. Система иерархичная, а здесь она стала сетевой, чего не ожидала.
Такое бывало и раньше, но только на уровне терминала, программ не касалось.
Теперь - что делать. Как я понимаю, Метаквоты всё, что нужно реализовали в MQ5 и там этой проблемы нет. ( Не утверждаю, а лишь предполагаю )
Рекомендации для MQ4:
1. Всегда помните, что система иерархичная: Счёт-Терминал-Инструмент-Масштаб. Меняйте параметры только сверху вниз в этой иерархии, иначе всё сломается.
2. Максимально осторожно подходите к использованию инструментария MT5, там всё хорошо, надеюсь.
Теперь - что делать. Как я понимаю, Метаквоты всё, что нужно реализовали в MQ5 и там этой проблемы нет. ( Не утверждаю, а лишь предполагаю )
Рекомендации для MQ4:
1. Всегда помните, что система иерархичная: Счёт-Терминал-Инструмент-Масштаб. Меняйте параметры только сверху вниз в этой иерархии, иначе всё сломается.
2. Максимально осторожно подходите к использованию инструментария MT5, там всё хорошо, надеюсь.
Ключевой ответ - в МТ5 не виснет, там это решили, но про МТ4 забыли.
В МТ5 другая архитектура. Там у каждого символа свой поток.
В МТ4, вроде, один интерфейсный поток, поэтому любой индюк с бесконечным циклом вешает всю платформу.
В мт4 работает отменно:
Индикатор на графике с EventSetMillisecondTimer(50);
Кидаем на график советник EventSetMillisecondTimer(100);
В мт5 по отдельности всё работает, а вместе работает несколько минут и обе программы становятся неактивны, если удалить советник, то индикатор начинает работать.
Если в советнике установить таймер на 500, тогда связка работает.
С архитектурой большие проблемы в мт5