В прошлых выпусках мы уже достаточно сильно продвинулись в вопросе, как определить, была ли позиция закрыта по Take Profit ордеру или по Stop Loss. Параллельно мы изучили следующие торговые функции советника:
В данной статье мы изучим функцию OrderTakeProfit() и доработаем наш пример. Мы почему-то с первых строчек кода безусловно верим в тот факт, что позиция была закрыта именно по Stop Loss или 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());
В следующей статье мы продолжим изучение торговых функций языка MetaQuotes Language 4 и расскажем о функции OrderSymbol().
Есть что сказать? Не стесняйтесь!
Последние статьи:
Видео по теме:
УГОЛОК АДМИНИСТРАТОРА