Изучим функцию OrderTakeProfit() и доработаем наш пример. Мы почему-то с первых строчек кода безусловно верим в тот факт, что позиция была закрыта именно по Stop Loss или Take Profit ордера. А если нет? Это легко проверить.
- Если для позиции на покупку цена закрытия находится не ниже уровня Take Profit, то позиция закрыта по Take Profit.
- Если для позиции на продажу цена закрытия находится не выше уровня Take Profit, то позиция закрыта по Take Profit.
Мы знаем, что уровень Stop Loss ордера выделенной позиции или ордера можно определить с помощью функции OrderStopLoss(). По аналогии уровень Take Profit определяется с помощью функции OrderTakeProfit():
double OrderTakeProfit()
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Изменим наш пример, чтобы убедиться, что позиция закрыта по ордеру, а не с рынка:
//---- выбираем ордер/позицию с тикером 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
{
if ( ((OrderClosePrice() >= OrderTakeProfit()) && (OrderType() == OP_BUY)) ||
((OrderClosePrice() <= OrderTakeProfit()) && (OrderType() == OP_SELL)) )
{
// позиция закрылась по Take Profit
// ...
}
else
Print("Ошибка: позиция закрыта не по ордеру");
}
}
else
Print("Ошибка: это не закрытая позиция, а открытая");
}
else
Print("Ошибка: это не закрытая позиция, а отложенный ордер");
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());