Расскажем оторговой функции OrderExpiration().
datetime OrderExpiration()
Эта функция возвращает дату эксперации (истечения) отложенного ордера. Если доуказанного времени ордер несработал, тоонавтоматически удаляется изсистемы. Ордер должен быть предварительно выбран спомощью функции OrderSelect().
Если дата истечения неустановлена (т.е. ордер может существовать бесконечное время, пока неисполнится или небудет удален), тоOrderExpiration() вернет 0.
Для чего используется дата истечения отложенного ордера? Причин может быть множество. Например, довольно разумно удалять отложенные ордера впятницу поздно вечером перед закрытием недели.
В качестве примера использования функции OrderExpiration() напишем кусок кода, которых пробегает повсем неудаленным отложенным ордерам иесли дата истечения неустановлена, тоустанавливает еена23:59:59ближайшей пятницы.
// вычислим 23:59:59 ближайшей пятницы
datetime friday;
datetime c_time;
c_time = CurTime();
// в friday - дата и время на 00:00:00 текущего дня
friday = c_time-TimeHour(c_time)*60*60-TimeMinute(c_time)*60-TimeSeconds(c_time);
// в friday - дата и время на 00:00:00 ближайшей пятницы
friday = friday + (5-TimeDayOfWeek(c_time))*60*60*24;
// в friday - дата и время на 23:59:59 ближайшей пятницы
friday = friday + 23*60*60 + 59*60 + 59;
// пробежимся по отложенным ордерам и изменим эксперацию
int pos;
for(pos=0; posOP_SELL)
{
// дата эксперации отсутствует?
if (OrderExpiration()==0)
// изменить дату эксперации
OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),
OrderTakeProfit(), friday);
}
}
else
Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos);
}
В этом коде есть несколько неизвестных нам функций:
- int TimeDayOfWeek(datetime date) возвращает день недели (0-Воскресенье,1,2,3,4,5,6) для указанной даты;
- datetime CurTime() время прихода последней котировки ввиде количества секунд, прошедших после 00:001января 1970года;
- int TimeHour(datetime time) возвращает порядковый номер часа для времени time;
- int TimeMinute(datetime time) возвращает порядковый номер минуты для времени time;
- int TimeSeconds(datetime time) возвращает количество секунд сначала минуты для времени time.
Например, для 02:16:05среды функции TimeHour, TimeMinute иTimeSeconds вернут соответственно 2,16и5. Афункция TimeDayOfWeek вернет 3.
Мы помним, что значение типа datetime представляет собой количество секунд, прошедшее с00:001января 1970года. Также мыпомним, что вчасе 6060секунд, авминуте 60секунд. Исходя изэтого становится понятной наша логика получения впеременной friday даты ивремени, которые соответствуют 23:59:59ближайшей пятницы:
// вычислим 23:59:59 ближайшей пятницы
datetime friday;
datetime c_time;
c_time = CurTime();
// в friday - дата и время на 00:00:00 текущего дня
friday = c_time-TimeHour(c_time)*60*60-TimeMinute(c_time)*60-TimeSeconds(c_time);
// в friday - дата и время на 00:00:00 ближайшей пятницы
friday = friday + (5-TimeDayOfWeek(c_time))*60*60*24;
// в friday - дата и время на 23:59:59 ближайшей пятницы
friday = friday + 23*60*60 + 59*60 + 59;