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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Farkhat Guzairov
2103
Farkhat Guzairov  

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

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

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

 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 не годиться, так как изначально был не верен по своей логике, удивительно что этот пример все еще есть в официальной справке. Почему неверен, да потому, что как только вы удалите хотя бы один объект то общее количество на чарте измениться, а следовательно индекс ссылки будет неверен, что и происходит на текущий момент, скорее всего разработчики поняли ошибку, но вот как нам теперь корректно удалять объекты?

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

Sergey Kolemanov
1019
Sergey Kolemanov  
Farkhat Guzairov:

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

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

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

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

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

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

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

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

ObjectsDeleteAll(...);
Farkhat Guzairov
2103
Farkhat Guzairov  
Sergey Kolemanov:

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

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

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


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

Nikolay Khrushchev
21427
Nikolay Khrushchev  
Farkhat Guzairov:

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

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

Farkhat Guzairov
2103
Farkhat Guzairov  
Nikolay Khrushchev:

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

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

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

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

Farkhat Guzairov
2103
Farkhat Guzairov  
Sergey Kolemanov:

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

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

Nikolay Khrushchev
21427
Nikolay Khrushchev  
Sergey Kolemanov:

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

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

Farkhat Guzairov
2103
Farkhat Guzairov  
Farkhat Guzairov:

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

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

Farkhat Guzairov
2103
Farkhat Guzairov  
Nikolay Khrushchev:

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий