Возможен случай, когда мыпоошибке выделили открытую позицию. Выявить этот случай нам поможет функция OrderCloseTime().
datetime OrderCloseTime()
Функцию можно вызвать после того, как ордер или позиция были предварительно выбраны спомощью функции OrderSelect().
Возвращает дату ивремя закрытия позиции или ордера:
- Если позиция открыта, товозвращает 0(ноль).
- Если позиция закрыта, товозвращает дату ивремя закрытия позиции.
- Если отложенный ордер удален, товозвращает дату ивремя удаления ордера.
- Если отложенный ордер еще неудален, товозвращает 0(ноль).
Исходя изэтих правил нам надо проверить время закрытия выделенной позиции. Если оно равно нулю, тоэто открытая позиция инам надо сообщить обошибке:
//---- выбираем ордер/позицию с тикером 77777
if ( OrderSelect (77777, SELECT_BY_TICKET) == true)
{
// это позиция, а не отложеный ордер?
if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
{
// это закрытая позиция, а не открытая?
if ( OrderCloseTime() != 0 )
{
if ( ((OrderClosePrice() <= OrderStopLoss()) && (OrderType() == OP_BUY)) ||
((OrderClosePrice() >= OrderStopLoss()) && (OrderType() == OP_SELL)) )
{
// позиция закрылась по Stop Loss
// ...
}
else
{
// позиция закрылась по Take Profit
// ...
}
}
else
Print("Ошибка: это не закрытая позиция, а открытая");
}
else
Print("Ошибка: это не закрытая позиция, а отложенный ордер");
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());
То, что это неможет быть отложенный ордер, мыуже проверили (см.прошлый выпуск).
Теперь наш пример поопределению типа ордера, покоторому была закрыта позиция, стал содержать наодну ошибку меньше, нопо-прежнему остается небезгрешным. Мыпочему-то спервых строчек кода безусловно верим втот факт, что позиция закрыта именно поStop Loss или Take Profit ордера. Аесли нет?
Перейти к главе «
функция OrderTakeProfit».