home

Функция 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);
}
}
}