OrderSend - Торгівельні функції - Довідник MQL4
Основна функція, що використовується для здійснення торгових операцій або встановлення відкладеного ордера.
[in] Найменування фінансового інструменту, з яким проводиться торгівельна операція.
[in] Торгова операція. Можливо будь-яким із значень торгових операцій.
[in] Кількість лотів.
[in] Ціна відкриття.
[in] Максимально допустиме відхилення ціни для ринкових ордерів (ордерів на купівлю чи продаж).
[in] Ціна закриття ордера при досягненні рівня збитковості (0 у разі відсутності рівня збитковості).
[in] Ціна закриття ордера при досягненні рівня прибутковості (0 у разі відсутності рівня прибутковості).
[in] Магічна кількість ордера. Може використовуватися як ідентифікатор, що визначається користувачем.
[in] Строк закінчення відкладеного ордера.
[in] Колір стрілки, що відкриває, на графіку. Якщо параметр відсутній або його значення дорівнює CLR_NONE, то стрілка, що відкривається, не відображається на графіку.
Повертає номер тикета, призначений ордеру торговим сервером або -1 у разі невдачі. Щоб отримати інформацію про помилку, необхідно викликати функцію GetLastError().
При відкритті ринкового ордера (OP_SELL або OP_BUY) в якості ціни відкриття можуть використовуватися тільки останні ціни Bid (для продажу) або Ask (для покупки). Якщо операція проводиться за фінансовим інструментом, відмінним від поточного, то для отримання останніх котирувань по цьому інструменту необхідно скористатися функцією MarketInfo() з MODE_BID або MODE_ASK.
Не можна використовувати розрахункову чи ненормалізовану ціну. Якщо запитуваної ціни відкриття не було в ціновому потоці, або ціна, що запитується, не нормалізована відповідно до кількості знаків після десяткової точки, то будезгенеровано помилку 129 (ERR_INVALID_PRICE). Якщо запитання відкриття сильно застаріла, то незалежно від значення параметра slippage буде згенерована помилка 138 (ERR_REQUOTE). Якщо запитувана ціна застаріла, але ще присутня в ціновому потоці, то ордер відкривається за поточною ціною і тільки в тому випадку, якщо поточна ціна потрапляє в діапазон price+-slippage.
Ціни StopLoss і TakeProfit не можуть розташовуватися надто близько до ринку. Мінімальну відстань стопів у пунктах можна отримати, використовуючи функцію MarketInfo() з MODE_STOPLEVEL. У разі помилкових і ненормалізованих стопів генерується помилка 130 (ERR_INVALID_STOPS). Нульове значення MODE_STOPLEVEL означає відсутність обмеження на мінімальну дистанцію для стоп-лосса/тейк-профіту, або факт використання торговим сервером зовнішніх механізмів динамічного контролю рівнів, які не можуть бути трансльовані в термінал. У другому випадку GetLastError() може повертати помилку 130, оскільки рівень MODE_STOPLEVEL фактично є "плаваючим".
При встановленні відкладеного ордера ціна відкриття не може бути надто близькою до ринку. Мінімальну відстань відкладеної ціни від поточної ринкової ціни в пунктах також можна отримати, використовуючи MarketInfo() з параметром MODE_STOPLEVEL. У разі неправильної ціни відкриття відкладеного ордера буде згенеровано помилку 130 (ERR_INVALID_STOPS).
На деяких торгових серверах може бути встановлена заборона застосування терміну закінчення відкладених ордерів. У цьому випадку при спробі задати ненульове значення у параметрі expiration буде згенеровано помилку 147 (ERR_TRADE_EXPIRATION_DENIED).
На деяких торгових серверах може бути встановлений ліміт на загальну кількість відкритих та відкладених ордерів. Приперевищення цього ліміту новий ордер відкритий не буде (відкладений ордер не буде встановлений) і торговий сервер поверне помилку 148 (ERR_TRADE_TOO_MANY_ORDERS).
//+--------------------------------------------------- -------------------+ // Script program start function //+--------------- -------------------------------------------------- -+ void OnStart () < //--- отримаємо мінімальне значення Stop level double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL ); Print ("Minimum Stop Level=",minstoplevel, "points"); double price = Ask; //--- обчислені значення цін SL і TP повинні бути нормалізовані double stoploss = NormalizeDouble ( Bid -minstoplevel * Point , Digits ); double takeprofit = NormalizeDouble ( Bid + minstoplevel * Point , Digits ); //--- розміщуємо ринковий ордер на покупку 1 лота int ticket= ; if (ticket < Print ( "OrderSend завершилася з помилкою #" , GetLastError ()); > else Print ( "Функція OrderSend успішно виконана" ) //--- >