Как открыть позицию в МQL4?

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Как открыть позицию в МQL4?

Сообщение Haos » 05 фев 2016, 12:56

Если мы посмотрим справку по MQL4 в разделе "Торговые функции", то обнаружим следующую функцию, которая используется для установки ордеров и, в том числе, для открытия позиции по рынку:
Код: выделить все
int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

В этой функции много параметров и разработчик должен хорошо разобраться с ними, чтобы в дальнейшем эффективно использовать эту функцию.
Рассмотрим эти параметры подробнее.
1. string symbol // символ
Этот параметр определяет имя торгового инструмента (валютной пары, акции и т.п.) для которого будет выполняться операция по открытию сделки. Если мы хотим, чтобы это был текущий инструмент (т.е. тот, на котором будет запущен советник), то можем применить зарезервированную функцию Symbol().
2. int cmd // торговая операция
Здесь указывается тип торговой операции. Для этого используются зарезервированные свойства функции OrderSend(). А именно:
OP_BUY - для покупки
OP_SELL - для продажи.
Остальные свойства для данной темы не применяются.
3. double volume // количество лотов
Здесь указывается определенное кол-во лотов, которое мы закладываем в сделку.
4. double price // цена
Цена открытия сделки.
Для покупки - Ask
Для продажи - Bid
5. int slippage // проскальзывание
Проскальзывание - это максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
Обычно это несколько пунктов. Для четырехзначных брокеров - 3 пнт. Для пятизначных - 30. Значность определяется, например, по кол-ву цифр у EURUSD после точки в котировках.
Например, 1.1193 - это четырехзначный брокер.

(остальные параметры будут описаны далее)
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как открыть позицию в МQL4?

Сообщение Haos » 05 фев 2016, 14:10

6. double stoploss // stop loss
Цена, по которой мы хотим закрыть позицию в случае убытка (SL) определяется для
- покупки: Bid - Y * Point
- продажи: Ask + Y * Point
где Y - кол-во пунктов, заложенных нами для SL.
Point - предопределенная переменная в MQL4, равная размеру пункта текущего инструмента в валюте котировки.
Т.е., например, если мы устанавливаем SL равным 30 пнт. и сделка у нас покупка, то параметр примет вид: Bid - 30 * Point.
7. double takeprofit // take profit
Цена, по которой мы хотим закрыть позицию в случае прибыли (TP) определяется для
- покупки: Ask + Y * Point
- продажи: Bid - Y * Point
где Y - кол-во пунктов, заложенных нами для TP.
Т.е., например, если мы устанавливаем TP равным 40 пнт. и сделка у нас покупка, то параметр примет вид: Ask + 40 * Point.
8. string comment=NULL // комментарий
Берется в двойные кавычки. Например, "My order". Чтобы его не было (а так делается очень часто) достаточно просто указать две пары кавычек подряд "" или константу NULL.
9. int magic=0 // идентификатор
Магическое число ордера. Может использоваться как определяемый пользователем идентификатор. Этот параметр используется для однозначной идентификации советника. Это необходимо, чтобы однозначно привязать все действия советника с ним (например, чтобы советник работал только со своими сделками и не трогал другие). Обычно Magic определять как цифры даты, в которую он был написан (так как вряд ли вы за один день сделаете больше одного советника).
Например, 20160205.
10. datetime expiration=0 // срок истечения ордера
0 - если не имеет значения, иначе нужно указать дату.
11. color arrow_color=clrNONE // цвет
Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.
Я обычно использую CLR_NONE, т.е. без стрелки, так как они по-моему захламляют график. Но многим нравятся, поэтому здесь можно указывать цвет, используя зарезервированные цветовые константы в MQL4.
Например,
clrGreen - для зеленой стрелки (покупка)
clrRed - для красной (продажа).

Итак, параметры рассмотрены. Теперь мы можем написать команду по открытию сделки с теми параметрами с которыми нам нужно. При этом нужно помнить, что функция OrderSend() возвращает значение типа int. Поэтому нам необходимо ввести некую переменную этого типа:
Код: выделить все
int  intTic;

Тогда команда на открытие покупки будет выглядеть, например, так:
Код: выделить все
intTic = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Bid-30*Point, Ask+40*Point, "", 20160205, 0, clrGreen);

А покупка без СЛ и ТП так:
Код: выделить все
intTic = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "", 20160205, 0, clrGreen);

А на открытие продажи так:
Код: выделить все
intTic = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Ask+30*Point, Bid-40*Point, "", 20160205, 0, clrRed);

А продажа без СЛ и ТП так:
Код: выделить все
intTic = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "", 20160205, 0, clrRed);

(продолжение следует)
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как открыть позицию в МQL4?

Сообщение Haos » 15 фев 2016, 19:43

В качестве примера применения функции по открытию позиции на покупку напишем скрипт.
Создадим заготовку скрипта в MQL4 и введем строку
Код: выделить все
#property show_inputs

сразу после
Код: выделить все
#property strict

вверху кода скрипта.
Эта команда позволит над вводить значения переменных, используемых скриптом, при его запуске.
Еще ниже введем следующий код, который позволит задавать нам из окна скрипта размер торгового лота, значение СЛ, ТП и идентификатор эксперта, а также величину проскальзывания.

Код: выделить все
input double   dblLot      = 0.1;   // Размер торгового лота
input int      intTP       = 30;    // ТП (пнт.)
input int      intSL       = 30;    // SL (пнт.);
input int      intMagic    = 15022016; // Идентификатор эксперта
input int      intSI       = 3;        // Проскальзывание цены (slippage) (пнт.)


В теле функции OnStart() скрипта введем две переменные для расчета уровня СЛ и ТП (в водном окне мы вводим величину в пнт., а сами уровни нужно рассчитать). При этом по стандартам языка мы должны применить функцию NormalizeDouble() для корректного отображения цифр после запятой в котировках актива.
Код: выделить все
   double dblSL = NormalizeDouble(Bid - intSL * Point, Digits);
   double dblTP = NormalizeDouble(Ask + intTP * Point, Digits);

Сами переменные dblSL и dblTP являются типа double и для операции на покупку приведенные две строчки кода весьма стандартны.
Ниже этих двух строк пропишем строку по открытию позиции на покупку:
Код: выделить все
int intTic = OrderSend(Symbol(), OP_BUY, dblLot, Ask, intSI, dblSL, dblTP, "", intMagic, 0, clrGreen);

Скрипт готов. Скомпилируем его и применим на каком-нибудь активе. При этом откроется окно свойств скрипта, где мы можем ввести нужные нам параметры СЛ, ТП, размера лота и проскальзывания:
01.png

Если мы запускаем на 4-х значном брокере, то оставим всё как есть, иначе увеличим в 10 раз СЛ, ТП и проскальзывание.
Скрипт отработает и вы увидите открытую позицию на покупку.

Весь код скрипта:
Код: выделить все
//+------------------------------------------------------------------+
//|                                              SC-OpenPosition.mq4 |
//|                                                             Haos |
//|                                        http://www.investforum.ru |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link      "http://www.investforum.ru"
#property version   "1.00"
#property strict
#property show_inputs

input double   dblLot      = 0.1;      // Размер торгового лота
input int      intTP       = 30;       // ТП (пнт.)
input int      intSL       = 30;       // SL (пнт.);
input int      intMagic    = 15022016; // Идентификатор эксперта
input int      intSI       = 3;        // Проскальзывание цены (slippage) (пнт.)

//********************************************************************************

void OnStart()
{
   double dblSL = NormalizeDouble(Bid - intSL * Point, Digits);
   double dblTP = NormalizeDouble(Ask + intTP * Point, Digits);
   int intTic = OrderSend(Symbol(), OP_BUY, dblLot, Ask, intSI, dblSL, dblTP, "",
            intMagic, 0, clrGreen);
   
}
//+------------------------------------------------------------------+

Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как открыть позицию в МQL4?

Сообщение Haos » 16 фев 2016, 19:43

Вообще говоря, на этом уровне использования функционала МКУЭль по открытию позиции заканчивается кроме как анализ результата выполнения функции OrderSend() на предмет открытия или не открытия позиции.
Обычно это делается так:
Код: выделить все
if(intTic < 0)
{
   Print("OrderSend завершилась с ошибкой #",GetLastError());
}
else
Print("Функция OrderSend успешно выполнена");

Сам результат выполнения функции OrderSend() приравнивается переменной intTic и если она окажется отрицательной, то значит открытие позиции не произошло.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как открыть позицию в МQL4?

Сообщение Haos » 21 фев 2016, 15:45

Следует отметить, что, вообще говоря, в профессиональных советниках (т.е. сделанных серьезно, скажем так) открытие сделки нарастает очень многими проверками на то, открылась ли она и если нет можно ли это исправить.
Поскольку я всегда пользуюсь правилом П. Киммела автора книги "Borland C++ 5" "Если в вашу абстракцию входит более одной-двух составных частей, независимо данных или функций, то смело создавайте класс". (стр. 337) только в переводе на функцию :hi_hi_hi: то, процедуру (в смысле последовательность действий) по открытии позиции многие разработчики советников и т.п. (и я ) выношу в отдельную функцию. Это, своего рода, удобный и правильный стиль программирования.
Поэтому сделаем функцию f_OpenPosition_(), в которой оформим действия по открытию позиции на покупку. Эта функция типа void будет выглядеть так:
Код: выделить все
void f_OpenPosition_(string sy, int op, double ll, double sl, double tp, int mn, int si, string co)
{
/*
   Версия   : 21.02.2016                                                     
   Описание : Открывает позицию по рыночной цене   
   Сторонних ресурсов не использует!!!                       
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)         
   op - операция {OP_BUY; OP_SELL}                                                           
   ll - лот                                                               
   sl - уровень стоп (0)                                                     
   tp - уровень тейк  (0)                                                   
   mn - MagicNumber
   si - проскальзывание (slippage) (пнт.)                                                       
   co - комментарий ("" - нет комментария)                                                       
*/   

   if(sy == "0") sy = Symbol();
   int intTic = OrderSend(sy, op, ll, Ask, si, sl, tp, co, mn, 0, clrGreen);
   
}

Список передаваемых в неё параметров указан в комментарии. Строка
Код: выделить все
if(sy == "0") sy = Symbol();
сравнивает параметр sy с нулем и при совпадении присваивает ему текущий символ графика.
Весь код скрипта тогда примет вид:
Код: выделить все
//+------------------------------------------------------------------+
//|                                              SC-OpenPosition.mq4 |
//|                                                             Haos |
//|                                        http://www.investforum.ru |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link      "http://www.investforum.ru"
#property version   "2.00"
#property strict
#property show_inputs

input double   dblLot      = 0.1;      // Размер торгового лота
input int      intTP       = 30;       // ТП (пнт.)
input int      intSL       = 30;       // SL (пнт.);
input int      intMagic    = 15022016; // Идентификатор эксперта
input int      intSI       = 3;        // Проскальзывание цены (slippage) (пнт.)

//********************************************************************************

void OnStart()
{
   double dblSL = NormalizeDouble(Bid - intSL * Point, Digits);
   double dblTP = NormalizeDouble(Ask + intTP * Point, Digits);
   f_OpenPosition_("0", OP_BUY, dblLot, dblSL, dblTP, intMagic, intSI, "");
   
}

//********************************************************************************

void f_OpenPosition_(string sy, int op, double ll, double sl, double tp, int mn, int si, string co)
{
/*
   Версия   : 21.02.2016                                                     
   Описание : Открывает позицию по рыночной цене   
   Сторонних ресурсов не использует!!!                       
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)         
   op - операция {OP_BUY; OP_SELL}                                                           
   ll - лот                                                               
   sl - уровень стоп (0)                                                     
   tp - уровень тейк  (0)                                                   
   mn - MagicNumber
   si - проскальзывание (slippage) (пнт.)                                                       
   co - комментарий ("" - нет комментария)                                                       
*/   

   if(sy == "0") sy = Symbol();
   int intTic = OrderSend(sy, op, ll, Ask, si, sl, tp, co, mn, 0, clrGreen);
           
}

Это уже неплохая заготовка функции для дальнейшей её модификации.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения