функция OrderTakeProfit.
Изучим функцию 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());