Как корректно удалять объекты с чартов MQL4?

 

Всем доброго!

Столкнулся с проблемой, решение которой до конца не удалось добиться.

Есть такой код:

 PrintFormat("Всего %d объектов",obj_total); 
   for(i=obj_total-1;i>=0;i--) 
     { 
      string name=ObjectName(i); 
      PrintFormat("Объект %d: %s",i,name); 
      ObjectDelete(name); 
     } 

Этот код из справки, чуть расширим его:

PrintFormat("Всего %d объектов",obj_total);
string ObjRectangle = "TEST-";
   for(i=obj_total-1;i>=0;i--) 
     { 
      string name=ObjectName(i);
      if(StringFind(name,ObjRectangle) == 0){
        PrintFormat("Объект %d: %s",i,name); 
        ObjectDelete(name); 
      }
     } 

казалось бы какие проблемы могут возникнуть, так и есть ранее году так в 2015 этот код работал без особых проблема, сейчас же, происходит частичное удаление объектов по выборке.

Понятно что выбранный цикл for не годиться, так как изначально был не верен по своей логике, удивительно что этот пример все еще есть в официальной справке. Почему неверен, да потому, что как только вы удалите хотя бы один объект то общее количество на чарте измениться, а следовательно индекс ссылки будет неверен, что и происходит на текущий момент, скорее всего разработчики поняли ошибку, но вот как нам теперь корректно удалять объекты?

Есть решения?

 
Farkhat Guzairov:

Всем доброго!

Столкнулся с проблемой, решение которой до конца не удалось добиться.

Есть такой код:

Этот код из справки, чуть расширим его:

казалось бы какие проблемы могут быть возникнуть, так и есть ранее году так в 2015 этот когда работал без особых проблема, сейчас же, происходит частичное удаление объектов по выборке.

Понятно что выбранный цикл for не годиться, так как изначально был не верен по своей логике, удивительно что этот пример все еще есть в официальной справке. Почему неверен, да потому, что как только вы удалите хотя бы один объект то общее количество на чарте измениться, а следовательно индекс ссылки будет неверен, что и происходит на текущий момент, скорее всего разработчики поняли ошибку, но вот как нам теперь корректно удалять объекты?

Есть решения?

Так в цикле уже давно не удаляют, используйте

ObjectsDeleteAll(...);
 
Sergey Kolemanov:

Так в цикле уже давно не удаляют, используйте

Да, решение было бы хорошим, при условии что на чарте кроме моего индикатора не будет других индикаторов, я хочу удалить только свои объекты. Есть еще какое либо решение?

int  ObjectsDeleteAll( 
   long           chart_id,   // идентификатор графика 
   const string     prefix,   // префикс имени объекта 
   int    sub_window=EMPTY,   // индекс окна 
   int    object_type=EMPTY   // тип объекта для удаления 
   );
Вот это вроде как подходит, если я правильно понимаю prefix это часть имени объекта.
 
Sergey Kolemanov:


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

 
Farkhat Guzairov:

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

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

 
Nikolay Khrushchev:

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

Не знал, о существовании приличных программистов, спасибо за новость! День прожит не зря!

 
Farkhat Guzairov:
Вот это вроде как подходит, если я правильно понимаю prefix это часть имени объекта.

Да, так и есть. Задайте "правильное" имя объекта и проблем не будет, например: "имя программы" + "ID чарта" + "индекс объекта" , красным выделе префикс.

 
Sergey Kolemanov:

Да, так и есть. Задайте "правильное" имя объекта и проблем не будет, например: "имя программы" + "ID чарта" + "индекс объекта" , красным выделе префикс.

:), ок. Как бы иначе и не делал, но все равно спасибо!

 
Sergey Kolemanov:

Да, так и есть. Задайте "правильное" имя объекта и проблем не будет, например: "имя программы" + "ID чарта" + "индекс объекта" , красным выделе префикс.

"ID чарта" то зачем? это лишнее.

 
Farkhat Guzairov:

:), ок. Как бы иначе и не делал, но все равно спасибо!

Как все уже понимают, пример к контекстной справке не является правильным и только вводит в заблуждение, пример либо надо исправить, либо просто убрать из справки.

 
Nikolay Khrushchev:

"ID чарта" то зачем? это лишнее.

Это как пример, думаю у каждого свой подход к уникальности имен объекта. У меня свой.

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