Почему script удяляет линии через одну?

 

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


int start()
{
int line_total=ObjectsTotal(), j, i;
string name;
Print("Количество уровней = ",line_total);
for (i=0;i<line_total;i++)
{name = ObjectName(i);

Print("Имя линии - ",name);
}
for (j=0;j<line_total;j++)
{name = ObjectName(j);
Print("j=",j," ",name," ",ObjectGet(name,OBJPROP_STYLE)," == ",DRAW_LINE," ",ObjectGet(name,OBJPROP_COLOR)," == 14822282");
if (ObjectGet(name,OBJPROP_STYLE)==DRAW_LINE && ObjectGet(name,OBJPROP_COLOR)==14822282)
{Print("Удаляем линию ",name);while (!ObjectDelete(name))Sleep(100);}
}
}

 
После удаления объекта на его место в нумерации, видимо, становится следующий (до которого еще не дошли). Вы же после удаления увеличиваете переменную j. Поэтому после удаления объекта не нужно увеличивать j. В цикле for этого можно достичь, если уменьшать переменную цикла, которая автоматически затем прирастится.
 

Нет. Все гораздо проще. При удалении объектов в MQL4 нужно делать это начиная с конца. Т.е. вместо


for (j=0;j<line_total;j++)


Нужно написать:


for (j=line_total-1;j>=0;j--)

 
bstone и Scriptong - большое спасибо
 
bstone >>:

Нет. Все гораздо проще. При удалении объектов в MQL4 нужно делать это начиная с конца.

Это работает только когда нужно удалить ВСЕ объекты! А когда часть из них нужно удалить а часть оставить - работает только уменьшение счетчика. При удалении объекта вся цепочка сидящих за ним подтягивается на один вперед и общее к-во объектов уменьшается. Кстати по этой причине для ускорения лучше писать for (j=0;j<ObjectsTotal();j++) тогда цикл в конце не будет гоняться вхолостую.

 
ForexTools писал (а) >>

Это работает только когда нужно удалить ВСЕ объекты! А когда часть из них нужно удалить а часть оставить - работает только уменьшение счетчика.

Нет никакой разницы. Никто не мешает удалять выборочно.


При удалении объекта вся цепочка сидящих за ним подтягивается на один вперед и общее к-во объектов уменьшается. Кстати по этой причине для ускорения лучше писать for (j=0;j<ObjectsTotal();j++) тогда цикл в конце не будет гоняться вхолостую.

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

 

Это не глюк!!!

При удалении объектов изменяется их количество и нумерация.

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