OrderModify() - изменение параметров отложенных ордеров и открытых позиций
В прошлых выпусках я рассмотрел очень полезную функцию - OrderSend(). А в этом выпуске я расскажу о функции OrderModify().
bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
Эта функция позволяет изменять параметры отложенных ордеров и открытых позиций. В случае успеха она возвращает true, а в случае неудачи - false. Код ошибки можно будет получить с помощью функции GetLastError().
Параметры функции:
- ticket - тикер отложенного ордера или открытой позиции;
- price - новый уровень отложенного ордера (для открытых позиций не может быть изменен);
- stoploss - новый уровень Stop Loss;
- takeprofit - новый уровень Take Profit;
- expiration - новые дата и время истечения отложенного ордера (если к этой дате и времени отложенный ордер не сработает, то он будет удален - см. выпуск "OrderExpiration() - дата истечения отложенного ордера");
- arrow_color - цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.
В случае неправильных параметров функция возвращает следующие коды ошибок:
- 1 (ERR_NO_RESULT) - если ни один из параметров не был изменен;
- 147 (ERR_TRADE_EXPIRATION_DENIED) - если в настройках торгового сервера запрещено выставлять дату эксперации ордера. В этом случае параметр expiration всегда должен быть равен нулю).
В качестве практического примера применения этой функции рассмотрим установку и управление трейлинг стопом.
Напомню, что Trailing Stop (трейлинг стоп) – это алгоритм управления уровнем Stop Loss ордера. После выставления трейлинг-стопа (например, на Х пипсов) происходит следующее:
- MetaTrader не предпринимает никаких действий до того момента, пока по открытой позиции не образуется прибыль в Х пипсов. После этого MetaTrader выставляет Stop Loss ордер на расстоянии Х пипсов от текущей цены (в данном случае - на уровне безубыточности).
- После выполнения первого шага MetaTrader посылает команду на изменение уровня Stop Loss ордера на расстояние Х пипсов от текущей котировки каждый раз, когда расстояние между ней и старым уровнем ордера превысит Х пипсов. В результате этого Stop Loss ордер "подтягивается" к текущей цене.
Реализуем этот принцип на языке MetaQuotes Language 4. Будем полагать, что открытая позиция уже выбрана и мы точно знаем, что эта позиция открыта по инструменту, к которому прикреплен эксперт. Также предположим, что значение трейлинг стопа в пипсах содержится в переменной TrailingStop.
int err; if (OrderType() == OP_BUY) { // позиция на покупку if ((Bid-OrderOpenPrice())>=(TrailingStop*Point)) { // выставляем Stop Loss if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0)) Print("#", OrderTicket(),": trailing stop ", Bid-TrailingStop*Point); else { err = GetLastError(); Print("#", OrderTicket(),": trailing stop error ", err); } } } else { // позиция на продажу if ((OrderOpenPrice()-Ask)>=(TrailingStop*Point)) { // выставляем Stop Loss if (OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0)) Print("#", OrderTicket(),": trailing stop ", Ask+TrailingStop*Point); else { err = GetLastError(); Print("#", OrderTicket(),": trailing stop error ", err); } } }
В этом коде Вам могут быть непонятны несколько функций:
- Bid - Bid последней котировки по инструменту, к которому прикреплен эксперт;
- Ask - Ask последней котировки по инструменту, к которому прикреплен советник;
- Point - размер пункта текущего инструмента в валюте котировки (для EURUSD это 0.0001, для USDJPY- 0.01 и т.д.).
В следующем выпуске я расскажу, как удалить отложенный ордер с помощью функции OrderDelete().
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: