Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не могу понять как написать одну функцию.
У меня в советнике рисуются линии и хочется сделать чтобы линии которые создались например больше 2х дней назад удалялись.
Подскажите как это сделать.
Линии имеют точки привязки по времени (не путать со временем создания). В зависимости от задач можно исходить из этого.
Ещё из вариантов, время создания или иное какое-либо время можно учитывать в имени объекта (извлекать в дальнейшем).
В общем, варианты могут быть разнообразны.
Линии имеют точки привязки по времени (не путать со временем создания). В зависимости от задач можно исходить из этого.
Ещё из вариантов, время создания или иное какое-либо время можно учитывать в имени объекта (извлекать в дальнейшем).
В общем, варианты могут быть разнообразны.
Топикстартер дату создания зашил в имя. В MQL4 это может выглядеть так
{
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;
}
}
}
Топикстартер дату создания зашил в имя. В MQL4 это может выглядеть так
{
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, не имею желания.В тестере
возвращает дату создания линии из реальной жизни, то есть "D'2016.11.13 15:57:29'".
Всего лишь нужно было запустить советник в режиме тестирования на истории и отследить возвращаемые параметры. Смотрите, я на локализацию проблемы потратил всего пять минут.
Добавлено:
ошибку описал в теме MetaEditor build 1470.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MetaEditor build 1471
Vladimir Karputov, 2016.11.15 07:31
Исправлено поведение в тестере "OBJPROP_CREATETIME". Теперь в тестере