Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
Здравствуйте! Написал индикатор. Все работает хорошо. Да вот только при переключении таймфрейма, все зарисованные объекты исчезают с графика.
Вопрос , конечно же, может быть банальным. Но на просторах интернета и данного форума ответа я все же не нашел..
Пробовал функцию ChartRedraw(); , вставлял и в начале и в конце. - не помогает.
столкнулся с той же проблемой перечитал все что с этим связанно ответы в разных ветках и документацию и проблема так не решается методом логического тыка задача решена за 12 часов.
1 сначала вызывается деинит старого индикатора потом инит нового, процесс асинхронный то есть работа производится одновременно разница между старта деинит и инит примерно от 20 до 100 микро секунд, до миллисекунды недотягивает
2 деинит большого количества прямоугольников у меня занимает 3 секунды
3 тоесть инит и калькулейт отрабатывают раньше чем деинит старого индикатора
4 при повышении таймфрейма иногда деинит успевает а при понижении точно нет, почему? читаем дальше
5 я сначала подумал что деинит получает переменные от нового индикатора если деинит медленный, и сделал задержку в 5 секунд, проверил переменную до задержки и после она одинаковая и отличается от новой переменной инита, тоесть пока не завершится деинит старые переменные остаются старыми
так почему же не рисуются новые обьекты, так потому что история не загрузилась и обьекты некуда ставить решение костыль
и prev_calculated = 0 пока не загрузится история, вариантов проверки синхронности истории масса, любой вариант подойдет.
все, обьекты рисуются. идем дальше. обьекты все еще не удаляются при том что запрос на удаление прошел, и даже ответ получен что фигура удалена
все запросы на создание и удаление обьекта встают в очередь, я дожидаюсь удаление обьекта получаю подтверждение этому но он на новом таймфрейме все равно есть. и тут меня осенило, а что если график не меняет таймфрейм а удаляется и создается новый, все обьекты и так удаляются на старом, и вот появляется новый график синхронизируется история а это время в очередь встают остатки деинита и ВНИМАНИЕ!!! все обьекты со старого таймфрейма запомненные при удалении графика встают в очередь на создание обьектов на новом графике после запроса удаления этих обьектов деинитом, тоесть сначала удаляется воздух апротом создаются обьекты из памяти о старом графике, итого очередь такая
деинит - запоминание обьектов - новый график - запрос на удаление обьектов де инитом - постановка команды удаление в очередь - синхронизация нового графика по истории - постановка команды создания обьектов на новом графике,
так как процессы асинхронны то очередь будет меняться но удаление всегда будет до возврата истории обьектов со старого графика а запоминаются они до удаления в момент смены таймфрейма
и вот я пробую свою теорию, ставлю задержку де инита
и уаля, все удаляется, то есть я жду пока история обьектов перенесется на новый график и только после этого удаляю заключение, смена таймфрейма удаляет график и все что на нем и создает новый график с переносом всего что было на старом и только после завершения переноса возможно что то удалить,
но есть и подвох, если история таймфрейма была то новый график появляется сразу а если небыло то пока не завершится де инит а это у меня 5+3 сек график не загружается простое решение это 2 раза делать удаление, сложное это проверить пока не синхронизируется новый график с историей ожидать, а если синхронизация не начилась то удалять потом ждать потом проверяте если снова появилось то снова удалять
ПС: подвох в том что нигде не описан порядок действий и приходится догадываться, но адекватного решения не найдено так как при отсутствии истории другого таймфрейма я тупо вешаю систему либо по времини либо по событию ожидания синхронизации истории.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
А все, спасибо за ответы! Пока Вы мнее здесь писали, я решил проблему, таким способом:
А ну, теперь правда другая проблема появилась. Индикатор после переключения графика теперь перестал рисовать линии.
Ну я постараюсь решить эту проблему.. ))
А все, спасибо за ответы! Пока Вы мнее здесь писали, я решил проблему, таким способом:
UninitializeReason() = reason
:)
Здравствуйте! Написал индикатор. Все работает хорошо. Да вот только при переключении таймфрейма, все зарисованные объекты исчезают с графика.
Вопрос , конечно же, может быть банальным. Но на просторах интернета и данного форума ответа я все же не нашел..
Пробовал функцию ChartRedraw(); , вставлял и в начале и в конце. - не помогает.
методом логического тыка задача решена за 12 часов.
1 сначала вызывается деинит старого индикатора потом инит нового, процесс асинхронный то есть работа производится одновременно
разница между старта деинит и инит примерно от 20 до 100 микро секунд, до миллисекунды недотягивает
2 деинит большого количества прямоугольников у меня занимает 3 секунды
3 тоесть инит и калькулейт отрабатывают раньше чем деинит старого индикатора
4 при повышении таймфрейма иногда деинит успевает а при понижении точно нет, почему? читаем дальше
5 я сначала подумал что деинит получает переменные от нового индикатора если деинит медленный, и сделал задержку в 5 секунд, проверил переменную до задержки и после
она одинаковая и отличается от новой переменной инита, тоесть пока не завершится деинит старые переменные остаются старыми
так почему же не рисуются новые обьекты, так потому что история не загрузилась и обьекты некуда ставить
решение костыль
и prev_calculated = 0 пока не загрузится история, вариантов проверки синхронности истории масса, любой вариант подойдет.
все, обьекты рисуются. идем дальше. обьекты все еще не удаляются при том что запрос на удаление прошел, и даже ответ получен что фигура удалена
все запросы на создание и удаление обьекта встают в очередь, я дожидаюсь удаление обьекта получаю подтверждение этому но он на новом таймфрейме все равно есть.
и тут меня осенило, а что если график не меняет таймфрейм а удаляется и создается новый, все обьекты и так удаляются на старом, и вот появляется новый график синхронизируется история а это время
в очередь встают остатки деинита и ВНИМАНИЕ!!! все обьекты со старого таймфрейма запомненные при удалении графика встают в очередь на создание обьектов на новом графике после запроса удаления этих обьектов деинитом, тоесть сначала удаляется воздух апротом создаются обьекты из памяти о старом графике, итого очередь такая
деинит - запоминание обьектов - новый график - запрос на удаление обьектов де инитом - постановка команды удаление в очередь - синхронизация нового графика по истории - постановка команды создания обьектов на новом графике,
так как процессы асинхронны то очередь будет меняться но удаление всегда будет до возврата истории обьектов со старого графика а запоминаются они до удаления в момент смены таймфрейма
и вот я пробую свою теорию, ставлю задержку де инита
и уаля, все удаляется, то есть я жду пока история обьектов перенесется на новый график и только после этого удаляю
заключение, смена таймфрейма удаляет график и все что на нем и создает новый график с переносом всего что было на старом и только после завершения переноса возможно что то удалить,
но есть и подвох, если история таймфрейма была то новый график появляется сразу а если небыло то пока не завершится де инит а это у меня 5+3 сек график не загружается
простое решение это 2 раза делать удаление, сложное это проверить пока не синхронизируется новый график с историей ожидать, а если синхронизация не начилась то удалять потом ждать потом проверяте если снова появилось то снова удалять
ПС: подвох в том что нигде не описан порядок действий и приходится догадываться, но адекватного решения не найдено так как при отсутствии истории другого таймфрейма я тупо вешаю систему либо по времини либо по событию ожидания синхронизации истории.
ПС: подвох в том что нигде не описан порядок действий и приходится догадываться, но адекватного решения не найдено
https://www.mql5.com/ru/code/18138