В прошлых выпусках мы узнали о большом количестве функций, с помощью которых можно получить информация об ордере, выделенном с помощью функции OrderSelect(). Большинство из этих функций очень важны и полезны. Однако, Вам наверняка уже хочется приступить к изучению функций, с помощью которых можно открывать и закрывать позиции, выставлять, модифировать и удалять ордера.
Сегодня будет рассказано о первой такой функции - функции OrderSend().
Формат функции:
int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Функция OrderSend() предназначена для размещения отложенного ордера или открытия позиции. Функция вовзращает номер тикера открытой позиции или размещенного отложенного ордера. В случае неудачи функция OrderSend() возвращает число -1.
При этом:
В параметре cmd мы передаем тип приказа:
Константа | Значение | Описание |
OP_BUY | 0 | Открыть позицию на покупку |
OP_SELL | 1 | Открыть позицию на продажу |
OP_BUYLIMIT | 2 | Разместить отложенный ордер BUY LIMIT |
OP_SELLLIMIT | 3 | Разместить отложенный ордер SELL LIMIT |
OP_BUYSTOP | 4 | Разместить отложенный ордер BUY STOP |
OP_SELLSTOP | 5 | Разместить отложенный ордер SELL STOP |
Таким образом, для того, чтобы открыть позицию на продажу в качестве параметра cmd надо указать OP_SELL. Для открытия позиции на покупку - OP_BUY. Для установки отложенного ордера надо использовать значения OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP или OP_SELLSTOP в зависимости от типа размещаемого отложенного ордера.
При открытии позиции в качестве параметра price надо использовать текущий Bid (если cmd равен OP_SELL) или текущий Ask (если cmd равен OP_BUY):
Важно:
Ни в коем случае нельзя использовать цену, которую Вы рассчитали по какой-то формуле, или цену, которую Вы не привели (нормализовали) к тому количеству знаков после запятой, сколько должно быть у данного инструмента.
Для того, чтобы "нормализовать" цену, надо использовать функцию NormalizeDouble():
double NormalizeDouble ( double value, int digits )
Эта функция округляет вещественное число value с точностью до digits знаков после запятой. Число цифр после десятичной точки должно быть в диапазоне 0 .. 8.
В случае использования "неправильной" цены в параметре price будут выданы следующие коды ошибок:
Если же цена устарела, но еще присутствует в потоке, то будет совершена сделка по текущей цене, если текущая цена находится в диапазоне price +/- slippage.
Еще три немаловажных параметра - StopLoss, TakeProfit и expiration.
Когда Вы открываете позициию (выставляете отложенный ордер), то ордера Stop Loss и Take Profit должны находиться по отношению к текущей цене (цене отложенного ордера) не ближе, чем на расстоянии определенного количества пунктов. Например, если Вы имеет счет в Дилинговом центре "Альпари", то Вы не можете выставлять Stop Loss и Take Profit ордера на FOREX ближе одного спрэда к текущей цене для открытой позиции или к цене отложенного ордера.
Если Вы попытаетесь разместить Stop Loss или Take Profit ближе, чем это дозволено, то функция OrderSend() вернет ошибку 130 (ERR_INVALID_STOPS).
Если Вы не знаете этого минимально допустимого значения, то Вы всегда можете его получить с помощью функции MarketInfo(). Функция MarketInfo(string symbol, int type) c параметром type, равным MODE_STOPLEVEL, возвращает это значение по инструменту, который передан ей в качестве параметра symbol.
Инструмент графика, к которому прикреплен эксперт, можно получить с помощью функции Symbol():
string Symbol()
Если функция OrderSend() возратила ошибку 147 (ERR_TRADE_EXPIRATION_DENIED), это означает, что на торговом сервере запрещены отложенные ордера с установленной датой эксперации. В этом случае следует в дальнейшем использовать функцию OrderSend() с параметром expiration, равным нулю. Большинство дилинговых центров разрешает своим клиентам устанавливать любую дату и время, когда неисполненный отложенный ордер будет удален автоматически.
Если функция OrderSend() вернула ошибку 148 (ERR_TRADE_TOO_MANY_ORDERS), это означает, что на торговом сервере установлено ограничение на максимально возможное число открытых позиций и выставленных отложенных ордеров по одному счету. Пытаясь открыть еще одну позицию или выставить еще один отложенный ордер, Вы превышаете допустимый лимит, поэтому Вам в этом будет отказано.
Пример использования функции OrderSend() можно найти в нашем первом эксперте:
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0, NULL, 0, 0, CLR_NONE); if (MyOrderTicket<0) { err = GetLastError(); Print("Ошибка при открытии позиции: ", err); MyOrderTicket = 0; }
В следующем выпуске мы покажем пример использования функции OrderSend().
Есть что сказать? Не стесняйтесь!
Последние статьи:
Видео по теме:
УГОЛОК АДМИНИСТРАТОРА