Подскажите с кодом. - страница 3

 
Ooops:
Не могу понять как написать одну функцию.
У меня в советнике рисуются линии и хочется сделать чтобы линии которые создались например больше 2х дней назад удалялись.
Подскажите как это сделать.

Линии имеют точки привязки по времени (не путать со временем создания). В зависимости от задач можно исходить из этого.

Ещё из вариантов, время создания или иное какое-либо время можно учитывать в имени объекта (извлекать в дальнейшем).

В общем, варианты могут быть разнообразны.

 
Ooops:
Всё-таки поскольку у вас в посте стоит ссылка на типы DRAW_..., автоматом проставленная у вас при публикации движком форума, то на всякий случай упомяну, что для линий типов DRAW_... (то есть не линий графических объектов), реализация по вопросу конечно иная. 
 
Dina Paches:

Линии имеют точки привязки по времени (не путать со временем создания). В зависимости от задач можно исходить из этого.

Ещё из вариантов, время создания или иное какое-либо время можно учитывать в имени объекта (извлекать в дальнейшем).

В общем, варианты могут быть разнообразны.

Топикстартер дату создания зашил в имя. В MQL4 это может выглядеть так

void DeleteAllTimeout()
{
   int i, j, total = ObjectsTotal( ) - 1;
   // создаем индексный массив для сортировки объектов по дате
   // формат имени дан топикстартером в примерах
   // 2016.10.17 03:59:00DWd 2016.10.17 07:55:00UPd
   // т.е. первые 19 символов имени - дата создания объекта
   int m_index[ 400, 2 ]; // предполагаем, что объектов не более 400
   string m_names[ 400 ];
   datetime m_date;
  
   for ( i = total; i>=0; i--)
   {
      m_names[ i ] = ObjectName( i );
      m_date = StringToTime( StringSubstr( m_names[ i ], 0, 19) );
      m_index[ i, 0 ] = (int) m_date;
      m_index[ i, 1 ] = i;
   }
  
   // сортируем объекты в порядке убывания даты
   ArraySort( m_index, total, 0, MODE_DESCEND);
  
   // оставляем объекты только текущего и предыдущего торговых дней
   int firstday, curday, days = 0;
   firstday = TimeDayOfYear( (datetime) m_index[ 0, 0] );
   for ( i = 1; i <= total; i ++ )
   {
      curday = TimeDayOfYear( (datetime) m_index[ i, 0] );
      if ( firstday != curday ) days ++;
      firstday = curday;
      
      if ( days > 1 ) // все объекты позже подлежат удалению
      {
         for ( j = i; j <= total; j++)
            ObjectDelete( m_names[ m_index[ j, 1] ] );
         break;
      }
   }
}
 
Mislaid:

Топикстартер дату создания зашил в имя. В MQL4 это может выглядеть так

void DeleteAllTimeout()
{
   int i, j, total = ObjectsTotal( ) - 1;
   // создаем индексный массив для сортировки объектов по дате
   // формат имени дан топикстартером в примерах
   // 2016.10.17 03:59:00DWd 2016.10.17 07:55:00UPd
   // т.е. первые 19 символов имени - дата создания объекта
   int m_index[ 400, 2 ]; // предполагаем, что объектов не более 400
   string m_names[ 400 ];
   datetime m_date;
  
   for ( i = total; i>=0; i--)
   {
      m_names[ i ] = ObjectName( i );
      m_date = StringToTime( StringSubstr( m_names[ i ], 0, 19) );
      m_index[ i, 0 ] = (int) m_date;
      m_index[ i, 1 ] = i;
   }
  
   // сортируем объекты в порядке убывания даты
   ArraySort( m_index, total, 0, MODE_DESCEND);
  
   // оставляем объекты только текущего и предыдущего торговых дней
   int firstday, curday, days = 0;
   firstday = TimeDayOfYear( (datetime) m_index[ 0, 0] );
   for ( i = 1; i <= total; i ++ )
   {
      curday = TimeDayOfYear( (datetime) m_index[ i, 0] );
      if ( firstday != curday ) days ++;
      firstday = curday;
      
      if ( days > 1 ) // все объекты позже подлежат удалению
      {
         for ( j = i; j <= total; j++)
            ObjectDelete( m_names[ m_index[ j, 1] ] );
         break;
      }
   }
}

У меня своё наработанное есть. Другие способы. В т.ч., для подобных задач мне больше по душе применение динамических массивов.

P./S.: Тему читала сначала. Поэтому и написала то, что написала. Чтоб имелось в виду.

И я не знаю, что за даты он зашивает по-факту. Если зашивать время создания (OBJPROP_CREATETIME), то оно равно TimeLocal(). А локальное время и время бара на котором (или во время которого) была создана линия - могут быть очень различающимися.

Я не увидела в теме конкретных условий от автора темы. Не видела и код от него. Мне неизвестно как и что за линии он создаёт. Неизвестны цели построения этих линий. Вполне вероятно, что ему можно обойтись без извлечений какого-либо времени из имён объектов. И, например, вместо извлечений из имени, ориентироваться на время из точек привязок 

В общем, много что мне неизвестно, что по-факту у автора темы.

Но намерений это выпытывать, а потом предлагать более "точечное решение" - у меня нет. Откладывать из-за этого свои собственные дела, sorry, не имею желания. 
 
Vladimir Karputov:

В тестере

      datetime time_create=(datetime)ObjectGetInteger(0,name,OBJPROP_CREATETIME);


возвращает дату создания линии из реальной жизни, то есть "D'2016.11.13 15:57:29'".

 

Всего лишь нужно было запустить советник в режиме тестирования на истории  и отследить возвращаемые параметры. Смотрите, я на локализацию проблемы потратил всего пять минут. 

 

Добавлено:

ошибку описал в теме MetaEditor build 1470

Данное поведение будет исправлено в ближайшем билде.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MetaEditor build 1471

Vladimir Karputov, 2016.11.15 07:31

Исправлено поведение в тестере "OBJPROP_CREATETIME". Теперь в тестере

      datetime time_create=(datetime)ObjectGetInteger(0,name,OBJPROP_CREATETIME);
возвращает время создания объекта, в историческом диапазоне тестирования, а не локальное время компьютера, как раньше.

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