При смене таймфрейма объект исчезает с графика. - страница 2

 

А все, спасибо за ответы! Пока Вы мнее здесь писали, я решил проблему, таким способом:

void OnDeinit(const int reason)
  {
  if(UninitializeReason()!=REASON_CHARTCHANGE)
  {
   ObjectDelete("Dot_A");
   ObjectDelete("Dot_B");
   for(int j=0; j<=301; j++)
   ObjectDelete("Line"+IntegerToString(j,0));
  }
  } 
 

А ну, теперь правда другая проблема появилась. Индикатор после переключения графика теперь перестал рисовать линии.

Ну я постараюсь решить эту проблему.. ))

 
Yuriy Vins:

А все, спасибо за ответы! Пока Вы мнее здесь писали, я решил проблему, таким способом:

UninitializeReason()reason

:)

 
Короче, с Реазончиками я разобрался! 😀
 
Еще разберитесь вот с этим, пригодится.
Последовательность выполнение Init() и DeInit()
Последовательность выполнение Init() и DeInit()
  • 2017.04.07
  • www.mql5.com
Всем привет ! Столкнулся с такой проблемой Написан индикатор или советник...
 
Там в конце и лекарство есть.
Init_Sync
Init_Sync
  • www.mql5.com
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
 
Yuriy Vins:

Здравствуйте! Написал индикатор. Все работает хорошо. Да вот только при переключении таймфрейма, все зарисованные объекты исчезают с графика.

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

Пробовал функцию ChartRedraw(); , вставлял и в начале и в конце. - не помогает.

столкнулся с той же проблемой перечитал все что с этим связанно ответы в разных ветках и документацию и проблема так не решается
методом логического тыка задача решена за 12 часов.

1 сначала вызывается деинит старого индикатора потом инит нового, процесс асинхронный то есть работа производится одновременно
разница между старта деинит и инит примерно от 20 до 100 микро секунд, до миллисекунды недотягивает

2 деинит большого количества прямоугольников у меня занимает 3 секунды

3 тоесть инит и калькулейт отрабатывают раньше чем деинит старого индикатора

4 при повышении таймфрейма иногда деинит успевает а при понижении точно нет, почему? читаем дальше

5 я сначала подумал что деинит получает переменные от нового индикатора если деинит медленный, и сделал задержку в 5 секунд, проверил переменную до задержки и после
она одинаковая и отличается от новой переменной инита, тоесть пока не завершится деинит старые переменные остаются старыми

так почему же не рисуются новые обьекты, так потому что история не загрузилась и обьекты некуда ставить
решение костыль

   double close[1];
   int close_test = CopyClose(Symbol(), PERIOD_CURRENT, time_code, 1, close);
   if(close_test < 1)
      return(0);

и prev_calculated = 0 пока не загрузится история, вариантов проверки синхронности истории масса, любой вариант подойдет.

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

все запросы на создание и удаление обьекта встают в очередь, я дожидаюсь удаление обьекта получаю подтверждение этому но он на новом таймфрейме все равно есть.
и тут меня осенило, а что если график не меняет таймфрейм а удаляется и создается новый, все обьекты и так удаляются на старом, и вот появляется новый график синхронизируется история а это время
в очередь встают остатки деинита и ВНИМАНИЕ!!! все обьекты со старого таймфрейма запомненные при удалении графика встают в очередь на создание обьектов на новом графике после запроса удаления этих обьектов деинитом, тоесть сначала удаляется воздух апротом создаются обьекты из памяти о старом графике, итого очередь такая

деинит - запоминание обьектов - новый график - запрос на удаление обьектов де инитом - постановка команды удаление в очередь - синхронизация нового графика по истории - постановка команды создания обьектов на новом графике,

так как процессы асинхронны то очередь будет меняться но удаление всегда будет до возврата истории обьектов со старого графика а запоминаются они до удаления в момент смены таймфрейма

и вот я пробую свою теорию, ставлю задержку де инита

void OnDeinit(const int reason)
  {
  string uid1=uid;
  Print("de:",uid);
  datetime tm = TimeTradeServer();
  //Print("de:",TimeTradeServer());
  while(tm>TimeTradeServer()-5)//задержка
  {}
  //Print("de this:",uid);
  //Print("de last:",uid1); проверили что они одинаковые 
   MF.Rectargl.Delete_All_Prefix(uid);
  }

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

но есть и подвох, если история таймфрейма была то новый график появляется сразу а если небыло то пока не завершится де инит а это у меня 5+3 сек график не загружается
простое решение это 2 раза делать удаление, сложное это проверить пока не синхронизируется новый график с историей ожидать, а если синхронизация не начилась то удалять потом ждать потом проверяте если снова появилось то снова удалять

ПС: подвох в том что нигде не описан порядок действий и приходится догадываться, но адекватного решения не найдено так как при отсутствии истории другого таймфрейма я тупо вешаю систему либо по времини либо по событию ожидания синхронизации истории.

 
Александр Ячменев #:

ПС: подвох в том что нигде не описан порядок действий и приходится догадываться, но адекватного решения не найдено

https://www.mql5.com/ru/code/18138

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов