Новая версия платформы MetaTrader 5 build 1870: Добавление символов в Обзор рынка по ISIN - страница 11

 
fxsaber:

Его и использую. На чарте только один объект - BITMAP_LABEL. Вот он и не удаляется.

Не вериться. Покажите простейший пример, пожалуйста.

У меня все удаляется.
 
Vitaly Muzichenko:

Rosh, у меня попутный вопрос: А что делать, если на графике нужен "Таймер отсчёта времени до закрытия свечи", это нужно каждую секунду вызывать ChartRedraw? Так это действие убивает быстродействие индикатора. 

Почему в мт4 нет с этим проблем, а в мт5 с графикой совсем всё сложно?

Утверждение весьма неоднозначное.

По моим наблюдениям реальное время выполнения ChartRedraw() это около 3 миллисекунд. 
Т.е. если производить перерисовку раз в секунду, то сама перерисовка будет длиться только 1/333  этой самой секунды, т.е. быстродействие индикатора реально может снизиться на 0,333%.

Является ли это убивающим фактором?

Тем более наверняка это происходит в разных потоках.

 
Nikolai Semko:

Не вериться. Покажите простейший пример, пожалуйста.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1870: Добавление символов в Обзор рынка по ISIN

fxsaber, 2018.07.06 16:39

Как наглядный пример ситуации, можно запустить этот индикатор с таким OnDeinit

void OnDeinit( const int )
{
  EventKillTimer();

  ObjectDelete(0, ObjName);
//  ObjectFind(0, ObjName); // Без этой строки объект останется полноценно жить на чарте (где нет NewTick-событий).

  if (Clock)
    delete Clock;
}
 
fxsaber:

а можно полный код, я же не знаю что за объект и как он создавался. 

Возможно Вы смешиваете понятия: удаление и отображение.

Другими словами для воспроизведения факта удаления объекта, как правильно заметил Рашид, необходимо делать перерисовку чарта.

И это абсолютно логично и разумно разделать удаление и отображение для экономии ресурсов.

 
Nikolai Semko:

а можно полный код, я же не знаю что за объект и как он создавался.

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

Возможно Вы смешиваете понятия: удаление и отображение.

Другими словами для воспроизведения факта удаления объекта, как правильно заметил Рашид, необходимо делать перерисовку чарта.

И это абсолютно логично и разумно разделать удаление и отображение для экономии ресурсов.

Не происходит именно удаления. С отображением изначально все понятно.

Clock
Clock
  • голосов: 24
  • 2017.11.16
  • fxsaber
  • www.mql5.com
Использование библиотеки продемонстрировано в следующем исходном коде: После запуска на графике появятся такие идущие часы: Индикатор Для использования сразу "из коробки" приложен кроссплатформенный индикатор Clock.mq5. В нем реализована интерактивная смена "скинов" - варианты часов (распакуйте ZIP-архив) переключаются клавишами ВВЕРХ/ВНИЗ на...
 
Nikolai Semko:

Решение этой проблемы очень простое.

Вместо множества объектов использовать только один - Canvas.

Вообще не вижу смысла использовать любые объекты, кроме одного холста. 

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

 
Alexey Kozitsyn:

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

Не соглашусь. 
Канвас это и есть простая графика.
А графика в виде объектов это примитивная, ограниченная и очень медленная графика. 
 
fxsaber:

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

Не происходит именно удаления. С отображением изначально все понятно.

Да, подтверждаю. Проблемка существует. Раньше вроде этого не было.

После удаления объектов, их имена остаются в списке объектов. Со временем они иногда исчезают, иногда нет, но при смене ТФ они удаляются. 

Причем, похоже, что просто ObjectDelete не хватает времени на отработку. Потому как если OnDeinit чем нибудь утяжелить ( Comment или ChartXYToTimePrice например):

void OnDeinit(const int)
  {
   //Comment("");
   
   EventKillTimer();

   ObjectDelete(0,ObjName);

   //ChartRedraw();
  
   datetime time;
   double price;
   int i=0;
   ChartXYToTimePrice(0,100,100,i,time,price);

   if(Clock)
      delete Clock;
  }

тогда объекты удаляются и без ChartRedraw.

Я и понять поэтому не мог, почему у меня удаляется, а у Вас нет. А у меня стоял как раз Comment. 

Я даже для проверки добавил в Ваш код экземпляр класса CCanvas и просто копировал в его ресурс данные из вашего ресурса, создавая вторые дублирующие часы на экране(код прилагаю), но проблема сохранялась.

Но это, действительно, не проблема, а проблемка, т.к. она легко решается простой перерисовкой. (ChartRedraw или Comment - не важно, т.к. Comment тоже выполняет ChartRedraw)

Файлы:
Canvas.mqh  152 kb
Clock.mq5  11 kb
 
Nikolai Semko:

Я даже для проверки добавил в Ваш код экземпляр класса CCanvas и просто копировал в его ресурс данные из вашего ресурса, создавая вторые дублирующие часы на экране(код прилагаю), но проблема сохранялась.

      if(!ResourceReadImage(ResourceName,C.m_pixels,width_bmp,height_bmp)) Print("Error read resource: ",GetLastError()); // переносим bmp файл в массив arr[]

Но это, действительно, не проблема, а проблемка, т.к. она легко решается простой перерисовкой. (ChartRedraw или Comment - не важно, т.к. Comment тоже выполняет ChartRedraw)

Поэтому и написал, что баг.

 
fxsaber:

Поэтому и написал, что баг.

Ну какой-же баг? Вы хотите чтобы в ObjectDelete принудительно сунули ChartRedraw? А "завтра" найдётся такой умник который станет замерять скорость выполнения ObjectDelete нескольких объектов в цикле и после каждого объекта будет ChartRedraw, ну и какая скорость будет при этом?
Причина обращения: