удаление скриптом обьектов

 

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

Написал скрипт, но он удаляет частично, приходится его перезапустить много раз до полного удаления всех углов.

в чем может быть ошибка?

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));
   }

  
}//коней старта

 

Для удаления графики или закрытия ордеров надо использовать цикл по убыванию индекса

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 меток
//+---------------------------------------------------+
//| Создание меток                        С-Проба.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 ГГГ

Далее в цикле удаляется объект с номером 1, в результате имеем: 0 БББ   1 ГГГ
С большими номерами объекты отсутствуют, удаление прекращается.
Вот скрипт, наглядно удаляющий метки, созданные прошлым скриптом, начиная с 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);
  }
}
Приведенный материал лишь демонстрирует теоретическую основу возникновения некоторых ошибок программирования
Причина обращения: