Для удаления графики или закрытия ордеров надо использовать цикл по убыванию индекса
for(int a1 = obj_total_start-1; a1 <= 0; a1--)
И посмотри ещё такие функции как ObjectsDeleteAll
Удаляет все объекты с указанным типом:
int ObjectsDeleteAll( int sub_window=EMPTY, // индекс окна int object_type=EMPTY // тип объекта для удаления );Удаляет по префиксу имени в подокне графика все объекты указанного типа.
int ObjectsDeleteAll( long chart_id, // идентификатор графика const string prefix, // префикс имени объекта int sub_window=EMPTY, // индекс окна int object_type=EMPTY // тип объекта для удаления );
Пора пояснить, почему же удалять объекты (метки, ордера и т.п.) нужно начиная с последнего.
Удаление происходит по номеру, под которым объект хранится в базе данных.
Пусть имеется 4 объекта, вот их номера и имена: 0 ААА 1 БББ 2 ВВВ 3 ГГГ
Вот скрипт, создающий 8 меток
С большими номерами объекты отсутствуют, удаление прекращается.
Вот скрипт, наглядно удаляющий метки, созданные прошлым скриптом, начиная с 0
Были удалены лишь объекты на четных позициях. Приходится повторить удаление.
При удалении с конца эффект перенумерации отсутствует, удаление будет полным.
Вот скрипт, удаляющий метки с конца
Есть более простой и универсальный способ удаления - нужно удалять лишь один нулевой объект.
Вот простой скрипт, производящий полное удаление. Короче, проще, надежнее
Удаление происходит по номеру, под которым объект хранится в базе данных.
Пусть имеется 4 объекта, вот их номера и имена: 0 ААА 1 БББ 2 ВВВ 3 ГГГ
Вот скрипт, создающий 8 меток
//+---------------------------------------------------+ //| Создание меток С-Проба.mq4 | //+---------------------------------------------------+ #property strict int N=8; // Количество объектов void OnStart() { int i; string name; for(i=0; i<N; i++) { name=string(ShortToString(65+i)); name=name+name+name; ObjectCreate(name, OBJ_LABEL, 0, 0, 0); // Создание ObjectSet(name, OBJPROP_CORNER, 0); // Левый Верхний угол ObjectSet(name, OBJPROP_XDISTANCE, 25); // X ObjectSet(name, OBJPROP_YDISTANCE, 25+i*25); // Y ObjectSetText(name,name,12,NULL,White); } }
После удаления объекта под номером 0 происходит перенумерация обектов: 0 БББ 1 ВВВ 2 ГГГ
С большими номерами объекты отсутствуют, удаление прекращается.
Вот скрипт, наглядно удаляющий метки, созданные прошлым скриптом, начиная с 0
//+---------------------------------------------------+ //| Удаление меток по возрастанию С-Проба.mq4 | //+---------------------------------------------------+ #property strict void OnStart() { int N=ObjectsTotal(); // Количество объектов for(int i=0; i<N; i++) { string name=ObjectName(i); ObjectDelete(name); } }

При удалении с конца эффект перенумерации отсутствует, удаление будет полным.
Вот скрипт, удаляющий метки с конца
//+---------------------------------------------------+ //| Удаление меток по убыванию С-Проба.mq4 | //+---------------------------------------------------+ #property strict void OnStart() { int N=ObjectsTotal(); // Количество объектов for(int i=N-1; i>=0; i--) { string name=ObjectName(i); ObjectDelete(name); } }Ошибка будет лишь в случае, если во время удаления появится новый объект.
Есть более простой и универсальный способ удаления - нужно удалять лишь один нулевой объект.
Вот простой скрипт, производящий полное удаление. Короче, проще, надежнее
//+---------------------------------------------------+ //| Цикл удаления нулевой метки С-Проба.mq4 | //+---------------------------------------------------+ #property strict void OnStart() { while(ObjectsTotal()>0) { string name=ObjectName(0); ObjectDelete(name); } }Приведенный материал лишь демонстрирует теоретическую основу возникновения некоторых ошибок программирования

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день. В торговле испоьзую углы ганна. Когда их накапливается много, нужно удалять, что трудоемко.
Написал скрипт, но он удаляет частично, приходится его перезапустить много раз до полного удаления всех углов.
в чем может быть ошибка?
void OnStart()
{//старт
int obj_total_start=ObjectsTotal();
for(int a1=0;a1<obj_total_start;a1++)
{
if (ObjectType(ObjectName(a1))==OBJ_GANNLINE) ObjectDelete(ObjectName(a1));
}
}//коней старта