Ordersend () - відкриття позиції або розміщення відкладеного ордера

У минулих випусках ми дізналися про велику кількість функцій, за допомогою яких можна отримати інформацію про ордер, виділеному за допомогою функції OrderSelect (). Більшість з цих функцій дуже важливі і корисні. Однак, Вам напевно вже хочеться приступити до вивчення функцій, за допомогою яких можна відкривати і закривати позиції, виставляти, модіфіровать і видаляти ордера.

Сьогодні буде розказано про першу такої функції - функції OrderSend ().

Функція OrderSend () призначена для розміщення відкладеного ордера або відкриття позиції. Функція вовзращается номер тікера відкритої позиції або розміщеного відкладеного ордера. У разі невдачі функція OrderSend () повертає число -1.

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

У параметрі cmd ми передаємо тип наказу:

Розмістити відкладений ордер 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 ():

Ця функція округлює дійсне число 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 ():

Якщо функція OrderSend () поверненням помилку 147 (ERR_TRADE_EXPIRATION_DENIED), це означає, що на торговому сервері заборонені відкладені ордери з встановленою датою експераціі. В цьому випадку слід надалі використовувати функцію OrderSend () з параметром expiration. рівним нулю. Більшість дилінгових центрів дозволяє своїм клієнтам встановлювати будь-яку дату і час, коли невиконаний відкладений ордер буде видалений автоматично.

Якщо функція OrderSend () повернула помилку 148 (ERR_TRADE_TOO_MANY_ORDERS), це означає, що на торговому сервері встановлено обмеження на максимально можливе число відкритих позицій і виставлених відкладених ордерів по одному рахунку. Намагаючись відкрити ще одну позицію або виставити ще один відкладений ордер, Ви перевищуєте припустимий ліміт, тому Вам в цьому буде відмовлено.

Приклад використання функції OrderSend () можна знайти в нашому першому експерта:

У наступному випуску ми покажемо приклад використання функції OrderSend ().