Как заработать деньги. Проект сам себе финансист.
июль 2011
пн вт ср чт пт сб вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Главная » » »

OrderSend() - открытие позиции или размещение отложенного ордера

В прошлых выпусках мы узнали о большом количестве функций, с помощью которых можно получить информация об ордере, выделенном с помощью функции 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.

При этом:

  • Symbol - инструмент, по которому будет открыта позиция или размещен отложенный ордер;
  • Cmd - тип ордера (см. таблицу 1);
  • Volume - объем в лотах;
  • Price - цена открытия позиции или уровень отложенного ордера;
  • Slippage - максимально допустимое отклонение между price и ценой сервера, при которым позиция будет открыта (для установки отложенных ордеров величина параметра slippage значения не имеет);
  • Stoploss - уровень Stop Loss;
  • Takeprofit - уровень Take Profit;
  • Comment - комментарий к ордеру или позиции (впоследствии это поле может быть изменено сервером - см. выпуск "OrderComment() - комментарий выделенного ордера");
  • Magic - магическое число ордера (может быть впоследствии получено функцией OrderMagicNumber());
  • Expiration - дата и время истечения отложенного ордера (если к этой дате и времени отложенный ордер не сработает, то он будет удален - см. выпуск "OrderExpiration() - дата истечения отложенного ордера");
  • Arrow_color - цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.

Параметры функции OrderSend()

В параметре cmd мы передаем тип приказа:

КонстантаЗначениеОписание
OP_BUY0Открыть позицию на покупку
OP_SELL1Открыть позицию на продажу
OP_BUYLIMIT2Разместить отложенный ордер BUY LIMIT
OP_SELLLIMIT3Разместить отложенный ордер SELL LIMIT
OP_BUYSTOP4Разместить отложенный ордер BUY STOP
OP_SELLSTOP5Разместить отложенный ордер SELL STOP
Таблица 1. Возможные значения параметра cmd функции OrderSend()

Таким образом, для того, чтобы открыть позицию на продажу в качестве параметра cmd надо указать OP_SELL. Для открытия позиции на покупку - OP_BUY. Для установки отложенного ордера надо использовать значения OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP или OP_SELLSTOP в зависимости от типа размещаемого отложенного ордера.

При открытии позиции в качестве параметра price надо использовать текущий Bid (если cmd равен OP_SELL) или текущий Ask (если cmd равен OP_BUY):

  • функция Bid возвращает текущий Bid по инструменту, к которому "прикреплен" эксперт;
  • функция Ask возвращает текущий Ask по инструменту, к которому "прикреплен" эксперт;
  • функция MarketInfo(string symbol, int type) c параметром type, равным MODE_BID или MODE_ASK, возвращает текущий Bid или Ask по инструменту, который передан ей в качестве параметра symbol.

Важно:
Ни в коем случае нельзя использовать цену, которую Вы рассчитали по какой-то формуле, или цену, которую Вы не привели (нормализовали) к тому количеству знаков после запятой, сколько должно быть у данного инструмента.

Для того, чтобы "нормализовать" цену, надо использовать функцию NormalizeDouble():

   double NormalizeDouble ( double value, int digits )

Эта функция округляет вещественное число value с точностью до digits знаков после запятой. Число цифр после десятичной точки должно быть в диапазоне 0 .. 8.

В случае использования "неправильной" цены в параметре price будут выданы следующие коды ошибок:

  • ERR_INVALID_PRICE (129) - если цена не была "нормализована" или такой цены вообще не было в потоке;
  • ERR_REQUOTE (138) - если цена сильно устарела (независимо от значения параметра slippage);

Если же цена устарела, но еще присутствует в потоке, то будет совершена сделка по текущей цене, если текущая цена находится в диапазоне price +/- slippage.

Прочие параметры функции OrderSend()

Еще три немаловажных параметра - 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().



Автор статьи: Андрей Ведихин

Хомячковый рай. Уйти и потеряться:

Комментарии к этой заметке больше не принимаются.




Есть что сказать? Не стесняйтесь!






Последние статьи:

Выгодные «исламские счета» для трейдеров Форекс Выгодные «исламские счета» для трейдеров Форекс Таким образом, вне зависимости от стиля работы стоит использовать «исламские счета» и сотрудничать с компаниями, которые не берут с трейдеров swap-комиссии. ..
2014-09-29
Стоит ли покупать чужие торговые сигналы и прогнозы? Стоит ли покупать чужие торговые сигналы и прогнозы? И все же основным нашим советом станет отказ от покупки торговых сигналов и прогнозов. Куда лучше научиться анализировать валютный рынок и думать всегда только своей головой. ..
2015-02-12

Видео по теме:




В мире больших денег

  • Самые богатые люди
    планеты. Ежегодные рейтинги FORBS. Истории успеха признаных финансовых гуру
  • Самые дорогие вещи:
    Часы, автомобили, ноутбуки стоимотью в десятки и сотни тысяч долларов. Рубрика "Чтоб я так жил"
  • Денежные прогнозы
    Что покупать и что продавать? Периодические прогнозы цен на иностранные валюты, акции крупнейших компаний и драгоценные металлы

ВКонтакте с деньгами

УГОЛОК АДМИНИСТРАТОРА