Как установить ордер

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

Как установить ордер

Сообщение Haos » 21 ноя 2017, 09:33

Наконец, мы переходим к рассмотрении функции установки ордера, на которую уже ссылались в статье Как установить стоповую (BuyStop & SellStop) сетку.
Код данной функции (см. код ниже):
Код: выделить все
void f_SetOrder(string sy, int op, double ll, double pp, double sl, double tp, int si,
              int mn, string co, datetime ex)
{
/*
   Дата: 26 октября 2015 г. 
   Сторонних ресурсов не использует!                                 
   Описание функции: Установка ордера
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)         
   op - операция (OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP)                                                           
   ll - лот                                                               
   pp - цена                                                               
   sl - уровень стоп                                                       
   tp - уровень тейк
   si - проскальзывание (slippage) (пнт.)   
   mn - Magic Number                                                       
   co - комментарий                                                       
   ex - Срок истечения                                                     

*/
   int      int_Tic     = 0;
   int      int_Try     = 5;              // Количество торговых попыток
   bool     bol_Sou     = false;           // Использовать звуковой сигнал
   string   str_Suc     = "ok.wav";       // Звук успеха
   string   str_Err     = "timeout.wav";  // Звук ошибки
   bool     bol_Sin     = true;           // Использовать значок открытия сделки?
   color    clOpen      = clrNONE,
            clOpenBuy   = LightBlue,      // Цвет значка открытия покупки
            clOpenSell  = LightCoral;     // Цвет значка открытия продажи

  if(sy == "0") sy = Symbol();
  int int_Dig  = (int) MarketInfo(sy, MODE_DIGITS);
  if(co == "") co = WindowExpertName();
  if(ex > 0 && ex < TimeCurrent()) ex = 0;
  if(op == OP_BUYLIMIT || op == OP_BUYSTOP)
  {
      if(bol_Sin) clOpen = clOpenBuy;
  }
  else if(op == OP_SELLLIMIT || op == OP_SELLSTOP)
  {
      if(bol_Sin) clOpen = clOpenSell;
  }
 
   for(int i = 1; i <= int_Try; i++)
   {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
      {
         Print("SetOrder(): Остановка работы функции");
         break;
      }
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pp = NormalizeDouble(pp, int_Dig);
      int_Tic = OrderSend(sy, op, ll, pp, si, sl, tp, co, mn, ex, clOpen);
      if(int_Tic > 0)
      {
         if(bol_Sou) PlaySound(str_Suc);
         Print("Функция OrderSend успешно выполнена");
         break;
      }
      else if(int_Tic < 0)
      {
         if(bol_Sou) PlaySound(str_Err);
         Print("OrderSend завершилась с ошибкой #", GetLastError());
      }
   } 
}

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

Как установить ордер

Сообщение Haos » 12 дек 2017, 09:49

Рассмотрим пример применения данной функции по установке отложенного ордера на примере установки BuyStop ордера по торговому инструменту EURUSD, задавая цену установки соответственно учитывая текущие котировки.
Код: выделить все
#property copyright "Haos"
#property link      "http://www.investforum.ru"
#property version   "1.00"
#property strict
#property show_inputs

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

input double   dblPr   = 1.1800;   // Цена установки
input double   dblQ0   = 0.1;      // Величина лота
input int      intTP   = 300;      // ТП ордера {0 - без ТП} (пнт.)
input int      intSL   = 200;      // SL ордера {0 - без СЛ} (пнт.)
input int      intSI   = 3;        // Проскальзывание цены (slippage) (пнт.)

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

void OnStart()
{
   double  dblSL = NormalizeDouble(dblPr - intSL * Point, Digits),
            dblTP = NormalizeDouble(dblPr + intTP * Point, Digits);     
   f_SetOrder("0", OP_BUYSTOP, dblQ0, dblPr, dblSL, dblTP, intSI, 0, "", 0);       
   
}

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

void f_SetOrder(string sy, int op, double ll, double pp, double sl, double tp, int si,
              int mn, string co, datetime ex)
{
/*
   Дата: 26 октября 2015 г. 
   Сторонних ресурсов не использует!                                 
   Описание функции: Установка ордера
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)         
   op - операция (OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP)                                                           
   ll - лот                                                               
   pp - цена                                                               
   sl - уровень стоп                                                       
   tp - уровень тейк
   si - проскальзывание (slippage) (пнт.)   
   mn - Magic Number                                                       
   co - комментарий                                                       
   ex - Срок истечения                                                     

*/
   int      int_Tic     = 0;
   int      int_Try     = 5;              // Количество торговых попыток
   bool     bol_Sou     = false;           // Использовать звуковой сигнал
   string   str_Suc     = "ok.wav";       // Звук успеха
   string   str_Err     = "timeout.wav";  // Звук ошибки
   bool     bol_Sin     = false;           // Использовать значок открытия сделки?
   color    clOpen      = clrNONE,
            clOpenBuy   = LightBlue,      // Цвет значка открытия покупки
            clOpenSell  = LightCoral;     // Цвет значка открытия продажи

  if(sy == "0") sy = Symbol();
  int int_Dig  = (int) MarketInfo(sy, MODE_DIGITS);
  if(co == "") co = WindowExpertName();
  if(ex > 0 && ex < TimeCurrent()) ex = 0;
  if(op == OP_BUYLIMIT || op == OP_BUYSTOP)
  {
      if(bol_Sin) clOpen = clOpenBuy;
  }
  else if(op == OP_SELLLIMIT || op == OP_SELLSTOP)
  {
      if(bol_Sin) clOpen = clOpenSell;
  }
 
   for(int i = 1; i <= int_Try; i++)
   {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
      {
         Print("SetOrder(): Остановка работы функции");
         break;
      }
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pp = NormalizeDouble(pp, int_Dig);
      int_Tic = OrderSend(sy, op, ll, pp, si, sl, tp, co, mn, ex, clOpen);
      if(int_Tic > 0)
      {
         if(bol_Sou) PlaySound(str_Suc);
         Print("Функция OrderSend успешно выполнена");
         break;
      }
      else if(int_Tic < 0)
      {
         if(bol_Sou) PlaySound(str_Err);
         Print("OrderSend завершилась с ошибкой #", GetLastError());
      }
   } 
}

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

В данном скрипте в качестве входных параметров задаются:
1. Цена установки ордера
2. Величина лота ордера
3. ТП ордера
4. СЛ ордера
5. Величину проскальзывания
Для расчета положений ТП и СЛ в коде вводятся две переменные dblTP и dblSL. После расчета значений ТП и СЛ запускается функция f_SetOrder().
Результат работы функции виден на скрине (см. скрин ниже):
Вложения
03-BuyStop.png
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Как установить ордер

Сообщение Haos » 12 дек 2017, 13:27

Теперь рассмотрим установку отложенного ордера типа SellStop с идентификатором (переменная intMagic):
Код: выделить все
#property copyright "Haos"
#property link      "http://www.investforum.ru"
#property version   "1.00"
#property strict
#property show_inputs

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

input double   dblPr    = 1.1700;   // Цена установки
input double   dblQ0    = 0.1;      // Величина лота
input int      intTP    = 300;      // ТП ордера {0 - без ТП} (пнт.)
input int      intSL    = 200;      // SL ордера {0 - без СЛ} (пнт.)
input int      intSI    = 3;        // Проскальзывание цены (slippage) (пнт.)
input int      intMagic = 12122017; // Идентификатор ордеров (0 - любой)

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

void OnStart()
{
   double  dblSL = NormalizeDouble(dblPr + intSL * Point, Digits),
           dblTP = NormalizeDouble(dblPr - intTP * Point, Digits);     
   f_SetOrder("0", OP_SELLSTOP, dblQ0, dblPr, dblSL, dblTP, intSI, intMagic, "", 0);       
   
}

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

void f_SetOrder(string sy, int op, double ll, double pp, double sl, double tp, int si,
              int mn, string co, datetime ex)
{
/*
   Дата: 26 октября 2015 г. 
   Сторонних ресурсов не использует!                                 
   Описание функции: Установка ордера
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)         
   op - операция (OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP)                                                           
   ll - лот                                                               
   pp - цена                                                               
   sl - уровень стоп                                                       
   tp - уровень тейк
   si - проскальзывание (slippage) (пнт.)   
   mn - Magic Number                                                       
   co - комментарий                                                       
   ex - Срок истечения                                                     

*/
   int      int_Tic     = 0;
   int      int_Try     = 5;              // Количество торговых попыток
   bool     bol_Sou     = false;           // Использовать звуковой сигнал
   string   str_Suc     = "ok.wav";       // Звук успеха
   string   str_Err     = "timeout.wav";  // Звук ошибки
   bool     bol_Sin     = false;           // Использовать значок открытия сделки?
   color    clOpen      = clrNONE,
            clOpenBuy   = LightBlue,      // Цвет значка открытия покупки
            clOpenSell  = LightCoral;     // Цвет значка открытия продажи

  if(sy == "0") sy = Symbol();
  int int_Dig  = (int) MarketInfo(sy, MODE_DIGITS);
  if(co == "") co = WindowExpertName();
  if(ex > 0 && ex < TimeCurrent()) ex = 0;
  if(op == OP_BUYLIMIT || op == OP_BUYSTOP)
  {
      if(bol_Sin) clOpen = clOpenBuy;
  }
  else if(op == OP_SELLLIMIT || op == OP_SELLSTOP)
  {
      if(bol_Sin) clOpen = clOpenSell;
  }
 
   for(int i = 1; i <= int_Try; i++)
   {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
      {
         Print("SetOrder(): Остановка работы функции");
         break;
      }
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pp = NormalizeDouble(pp, int_Dig);
      int_Tic = OrderSend(sy, op, ll, pp, si, sl, tp, co, mn, ex, clOpen);
      if(int_Tic > 0)
      {
         if(bol_Sou) PlaySound(str_Suc);
         Print("Функция OrderSend успешно выполнена");
         break;
      }
      else if(int_Tic < 0)
      {
         if(bol_Sou) PlaySound(str_Err);
         Print("OrderSend завершилась с ошибкой #", GetLastError());
      }
   } 
}

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

Использование идентификатора ордеров при их установке позволяет в дальнейшем "подхватывать" их советником и не путать с другими сделками и ордерами (от других экспертов или ручной торговли). Если задать идентификатор ордеров равным нулю, то это будет равносильно отсутствию идентификатора и такие сделки ничем не будут отличаться как при установке вручную.
Результат работы функции виден на скрине (см. скрин ниже):
Вложения
04-SellStop.png
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


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

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

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

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

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