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