Нет. Все гораздо проще. При удалении объектов в MQL4 нужно делать это начиная с конца. Т.е. вместо
for (j=0;j<line_total;j++)
Нужно написать:
for (j=line_total-1;j>=0;j--)
Это работает только когда нужно удалить ВСЕ объекты! А когда часть из них нужно удалить а часть оставить - работает только уменьшение счетчика. При удалении объекта вся цепочка сидящих за ним подтягивается на один вперед и общее к-во объектов уменьшается. Кстати по этой причине для ускорения лучше писать for (j=0;j<ObjectsTotal();j++) тогда цикл в конце не будет гоняться вхолостую.
Это работает только когда нужно удалить ВСЕ объекты! А когда часть из них нужно удалить а часть оставить - работает только уменьшение счетчика.
Нет никакой разницы. Никто не мешает удалять выборочно.
При удалении объекта вся цепочка сидящих за ним подтягивается на один вперед и общее к-во объектов уменьшается. Кстати по этой причине для ускорения лучше писать for (j=0;j<ObjectsTotal();j++) тогда цикл в конце не будет гоняться вхолостую.
Это ошибочный подход. Будет приводить к тем же глюкам, с которыми столкнулся топикстартер.
Это не глюк!!!
При удалении объектов изменяется их количество и нумерация.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На графике есть несколько горизонтальных линий. Скрипт закодирован убрать все, которые соответствуют заданному цвету. Скрипт удаляет строго через одну! Почему не могу понять. При повторном запуске скрипта происходит то же самое. Код ниже.
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);}
}
}