Как задать ордеру режим заключения сделки?

 

В документации упоминается перечисление ENUM_SYMBOL_TRADE_EXECUTION.

Возник вопрос. Как указать посылаемому ордеру к какому режиму заключения сделки из этого перечисления этот ордер относится? В справке OrderSend я этой информации не нашёл. А если не задать, как я понимаю, нет гарантии, что я пошлю запрос на открытие ордера соответствующего типа.

 
hoz:

В документации упоминается перечисление ENUM_SYMBOL_TRADE_EXECUTION.

Возник вопрос. Как указать посылаемому ордеру к какому режиму заключения сделки из этого перечисления этот ордер относится? В справке OrderSend я этой информации не нашёл. А если не задать, как я понимаю, нет гарантии, что я пошлю запрос на открытие ордера соответствующего типа.

Вообще, всегда можно посмотреть реализацию в СБ,  Trade.mqh, CTrade::PositionOpen

 
hoz:

В документации упоминается перечисление ENUM_SYMBOL_TRADE_EXECUTION.

Возник вопрос. Как указать посылаемому ордеру к какому режиму заключения сделки из этого перечисления этот ордер относится? В справке OrderSend я этой информации не нашёл. А если не задать, как я понимаю, нет гарантии, что я пошлю запрос на открытие ордера соответствующего типа.

Просто посмотреть исходник:

string CTrade::FormatRequest(string &str,const MqlTradeRequest &request) const
  {
   string      type,price,price_new;
   string      tmp;
   CSymbolInfo symbol;
//--- clean
   str="";
//--- set up
   int digits=5;
   if(request.symbol!=NULL)
     {
      if(symbol.Name(request.symbol))
         digits=symbol.Digits();
     }
//--- see what is wanted
   switch(request.action)
     {
      //--- instant execution of a deal
      case TRADE_ACTION_DEAL:
         switch(symbol.TradeExecution())
           {
            //--- request execution
            case SYMBOL_TRADE_EXECUTION_REQUEST:
               if(IsHedging() && request.position!=0)
               str=StringFormat("request %s %s position #%I64u %s at %s",
                                FormatOrderType(type,request.type),
                                DoubleToString(request.volume,2),
                                request.position,
                                request.symbol,
                                DoubleToString(request.price,digits));
               else
                  str=StringFormat("request %s %s %s at %s",
                                   FormatOrderType(type,request.type),
                                   DoubleToString(request.volume,2),
                                   request.symbol,
                                   DoubleToString(request.price,digits));
               //--- Is there SL or TP?
               if(request.sl!=0.0)
                 {
                  tmp=StringFormat(" sl: %s",DoubleToString(request.sl,digits));
                  str+=tmp;
                 }
               if(request.tp!=0.0)
                 {
                  tmp=StringFormat(" tp: %s",DoubleToString(request.tp,digits));
                  str+=tmp;
                 }
               break;
               //--- instant execution
            case SYMBOL_TRADE_EXECUTION_INSTANT:
               if(IsHedging() && request.position!=0)
               str=StringFormat("instant %s %s position #%I64u %s at %s",
                                FormatOrderType(type,request.type),
                                DoubleToString(request.volume,2),
                                request.position,
                                request.symbol,
                                DoubleToString(request.price,digits));
               else
                  str=StringFormat("instant %s %s %s at %s",
                                   FormatOrderType(type,request.type),
                                   DoubleToString(request.volume,2),
                                   request.symbol,
                                   DoubleToString(request.price,digits));
               //--- Is there SL or TP?
               if(request.sl!=0.0)
                 {
                  tmp=StringFormat(" sl: %s",DoubleToString(request.sl,digits));
                  str+=tmp;
                 }
               if(request.tp!=0.0)
                 {
                  tmp=StringFormat(" tp: %s",DoubleToString(request.tp,digits));
                  str+=tmp;
                 }
               break;
               //--- market execution
            case SYMBOL_TRADE_EXECUTION_MARKET:
               if(IsHedging() && request.position!=0)
               str=StringFormat("market %s %s position #%I64u %s",
                                FormatOrderType(type,request.type),
                                DoubleToString(request.volume,2),
                                request.position,
                                request.symbol);
               else
                  str=StringFormat("market %s %s %s",
                                   FormatOrderType(type,request.type),
                                   DoubleToString(request.volume,2),
                                   request.symbol);
               //--- Is there SL or TP?
               if(request.sl!=0.0)
                 {
                  tmp=StringFormat(" sl: %s",DoubleToString(request.sl,digits));
                  str+=tmp;
                 }
               if(request.tp!=0.0)
                 {
                  tmp=StringFormat(" tp: %s",DoubleToString(request.tp,digits));
                  str+=tmp;
                 }
               break;
               //--- exchange execution
            case SYMBOL_TRADE_EXECUTION_EXCHANGE:
               if(IsHedging() && request.position!=0)
               str=StringFormat("exchange %s %s position #%I64u %s",
                                FormatOrderType(type,request.type),
                                DoubleToString(request.volume,2),
                                request.position,
                                request.symbol);
               else
                  str=StringFormat("exchange %s %s %s",
                                   FormatOrderType(type,request.type),
                                   DoubleToString(request.volume,2),
                                   request.symbol);
               //--- Is there SL or TP?
               if(request.sl!=0.0)
                 {
                  tmp=StringFormat(" sl: %s",DoubleToString(request.sl,digits));
                  str+=tmp;
                 }
               if(request.tp!=0.0)
                 {
                  tmp=StringFormat(" tp: %s",DoubleToString(request.tp,digits));
                  str+=tmp;
                 }
               break;
           }
         //--- end of TRADE_ACTION_DEAL processing
         break;

         //--- setting a pending order
      case TRADE_ACTION_PENDING:
         str=StringFormat("%s %s %s at %s",
                          FormatOrderType(type,request.type),
                          DoubleToString(request.volume,2),
                          request.symbol,
                          FormatOrderPrice(price,request.price,request.stoplimit,digits));
      //--- Is there SL or TP?
      if(request.sl!=0.0)
        {
         tmp=StringFormat(" sl: %s",DoubleToString(request.sl,digits));
         str+=tmp;
        }
      if(request.tp!=0.0)
        {
         tmp=StringFormat(" tp: %s",DoubleToString(request.tp,digits));
         str+=tmp;
        }
      break;

      //--- Setting SL/TP
      case TRADE_ACTION_SLTP:
         if(IsHedging() && request.position!=0)
         str=StringFormat("modify position #%I64u %s (sl: %s, tp: %s)",
                          request.position,
                          request.symbol,
                          DoubleToString(request.sl,digits),
                          DoubleToString(request.tp,digits));
         else
            str=StringFormat("modify %s (sl: %s, tp: %s)",
                             request.symbol,
                             DoubleToString(request.sl,digits),
                             DoubleToString(request.tp,digits));
         break;

         //--- modifying a pending order
      case TRADE_ACTION_MODIFY:
         str=StringFormat("modify #%I64u at %s (sl: %s tp: %s)",
                          request.order,
                          FormatOrderPrice(price_new,request.price,request.stoplimit,digits),
                          DoubleToString(request.sl,digits),
                          DoubleToString(request.tp,digits));
      break;

      //--- deleting a pending order
      case TRADE_ACTION_REMOVE:
         str=StringFormat("cancel #%I64u",request.order);
         break;

         //--- close by
      case TRADE_ACTION_CLOSE_BY:
         if(IsHedging() && request.position!=0)
         str=StringFormat("close position #%I64u by #%I64u",request.position,request.position_by);
         else
            str=StringFormat("wrong action close by (#%I64u by #%I64u)",request.position,request.position_by);
         break;

      default:
         str="unknown action "+(string)request.action;
         break;
     }
//--- return the result
   return(str);
  }
 
Ihor Herasko:

Просто посмотреть исходник:

Вчера ещё посмотрел. Но вот всё-равно не всё однозначно. Смотрю сюда.

Это наводит меня на мысли.

Во-первых, я вижу применение только самым 2 первым типа. Остальное левак, который нужно избегать как страшный сон. Зачем оно вообще нужно, соответственно, загадка..

  • Биржевое исполнение (Exchange Execution)
    В данном режиме торговые операции, совершаемые в платформе, выводятся во внешнюю торговую систему (биржу). Торговые операции совершаются по ценам текущих рыночных предложений.

Получается всё остальные типы ордеров кухонные? Если не задал тип исполнения Exchange Execution я торгую против ДЦ что-ли? Другого смысла в этих словах нет.

Идём дальше..

  • Исполнение по запросу (Request Execution)
    В этом режиме исполнение рыночного ордера осуществляется по цене, предварительно полученной от брокера. Перед отправкой рыночного ордера у брокера запрашиваются цены его исполнения. После их получения выполнение ордера по данной цене можно либо подтвердить, либо отклонить.

Этот тип как я понял используется для отложенных ордеров?

А вот эти 2 странные какие-то:

  • Немедленное исполнение (Instant Execution)
    В этом режиме исполнение рыночного ордера осуществляется по цене, предложенной брокеру. При отправке запроса на исполнение, платформа автоматически подставляет в ордер текущие цены. В случае, если брокер принимает цены, ордер будет исполнен. Если брокер не принимает запрошенную цену, то происходит так называемое "Перекотирование" (Requote) — брокер возвращает цены, по которым может быть исполнен данный ордер.
  • Исполнение по рынку (Market Execution)
    В этом режиме исполнения рыночного ордера решение о цене исполнения принимает брокер без дополнительного согласования с трейдером. Отправка рыночного ордера в таком режиме подразумевает досрочное согласие с ценой, по которой он будет выполнен.

Я так понимаю Instant Execution это адекватный тип ордера, который самый выгодный. Его и нужно применять, а Market Execution какой-то не вариант. Слишком он не надёжный. Там нужно "верить" в брокера (ДЦ). Если он откроет ордер по не выгодной цене, то такой ордер даже уже ни как не обработать.

Итого из всего сказанного я вижу только 2 варианта: Instant Execution и Request Execution. Остальные они как бы есть, но никому не нужны, судя из описания т.к. не выгодные совсем.

Типы исполнения - Принципы трейдинга - MetaTrader 5
Типы исполнения - Принципы трейдинга - MetaTrader 5
  • www.metatrader5.com
В этом режиме исполнение рыночного ордера осуществляется по цене, предложенной брокеру. При отправке запроса на исполнение, платформа автоматически подставляет в ордер текущие цены. В случае, если брокер принимает цены, ордер будет исполнен. Если брокер не принимает запрошенную цену, то происходит так называемое "Перекотирование" (Requote) —...
 
hoz:

Если не задал тип исполнения Exchange Execution я торгую против ДЦ что-ли? Другого смысла в этих словах нет.

Тип исполнения устанавливается брокером. Поэтому задавать его не нужно. Можно лишь узнать, какой тип исполнения на стороне брокера. Ну а против ДЦ мы торгуем по определению )) А на бирже - против других участников. Здесь ничего не поделаешь.

Идём дальше..

Этот тип как я понял используется для отложенных ордеров?

Нет. Именно для рыночных. Здесь везде речь о рыночных ордерах. В МТ 4/5 не видел реализации этого способоа. Он был на МТ3. Нужно было нажать кнопку "Новый ордер", появлялось окно с текущей котировкой и таймер. Пока таймер не истек - цены действительны, можно именно по ним купить или продать. По истечении таймера - новый запрос.

А вот эти 2 странные какие-то:

Я так понимаю Instant Execution это адекватный тип ордера, который самый выгодный.

Я бы назвал его одним из признаков кухонности. Нормальный брокер не может гарантировать наличие нужной цены и объема в тот момент, когда получит заявку от трейдера. Да, у него есть вариант отправить реквот. Но в таких случаях вообще невозможно работать. Как ни отправь заявку, ее все равно вернут с приходом новой цены. От такого брокера в свое время ушел.

Его и нужно применять, а Market Execution какой-то не вариант. Слишком он не надёжный. Там нужно "верить" в брокера (ДЦ). Если он откроет ордер по не выгодной цене, то такой ордер даже уже ни как не обработать.

На мой взгляд, наиболее логичный тип исполнения. 

 
Ihor Herasko:

Тип исполнения устанавливается брокером. Поэтому задавать его не нужно. Можно лишь узнать, какой тип исполнения на стороне брокера. Ну а против ДЦ мы торгуем по определению )) А на бирже - против других участников. Здесь ничего не поделаешь.

Там получается для разного торгового инструмента в течение торговой сессии может разные ордера по-разному исполняться ? Т.е. брокер будет предлагать разные варианты исполнений? Как-то мне это не нравится. Слишком много лишних нюансов, которые по-сути не актуальны. Ведь если призадуматься, зачем мне выбирать тип исполнения? Если я торгую, я посылаю приказ на открытие торговой позиции. Есс-но цена мне нужно мной заявленная, а не которую "выплюнет" ДЦ. Выбирать режим биржевого исполнения это отдельный абсурд. Я вот думаю, кому нужно было всё так раздувать.. Ведь это лишне излишества, которые никому вообще не нужны, и даже наоборот.

Получается, если я хочу работать с приказами типа:

  • Немедленное исполнение (Instant Execution)
    В этом режиме исполнение рыночного ордера осуществляется по цене, предложенной брокеру. При отправке запроса на исполнение, платформа автоматически подставляет в ордер текущие цены. В случае, если брокер принимает цены, ордер будет исполнен. Если брокер не принимает запрошенную цену, то происходит так называемое "Перекотирование" (Requote) — брокер возвращает цены, по которым может быть исполнен данный ордер.
  • Исполнение по запросу (Request Execution)
    В этом режиме исполнение рыночного ордера осуществляется по цене, предварительно полученной от брокера. Перед отправкой рыночного ордера у брокера запрашиваются цены его исполнения. После их получения выполнение ордера по данной цене можно либо подтвердить, либо отклонить.


А мне ДЦ будет возвращать возможный тип по очереди либо Исполнение по рынку (Market Execution) либо Биржевое исполнение (Exchange Execution), то я вообще не открою ни одной сделки. Я прав?

Эта ситуация даже при наличии прибыльной и стабильной ТС может все шансы на успех размотать.

Исполнение по рынку - Открытие и закрытие позиций - MetaTrader 5
Исполнение по рынку - Открытие и закрытие позиций - MetaTrader 5
  • www.metatrader5.com
— для исполнения операции в режиме "По рынку" выберите соответствующий  пункт. Также в этом поле вы можете переключиться к выставлению отложенного ордера. — дополнительные правила исполнения ордера: "Все/Ничего" или "Все/Частично". Если данное поле неактивно, значит возможность выбора заблокирована на сервере. При нажатии кнопки "Sell by...
 
hoz:

Там получается для разного торгового инструмента в течение торговой сессии может разные ордера по-разному исполняться ?

Теоретически тип исполнения может меняться хоть на каждом тике. Но практически такого, конечно же, никто не делает. Более того, у большинства ДЦ этот момент оговорен в договоре. 

Учитывая все возможные условия, не вижу большой проблемы, чтобы учесть все это в коде, который пишется и отлаживается один раз, а потом используется в любом советнике.

 
Ihor Herasko:

Теоретически тип исполнения может меняться хоть на каждом тике. Но практически такого, конечно же, никто не делает. Более того, у большинства ДЦ этот момент оговорен в договоре. 

Учитывая все возможные условия, не вижу большой проблемы, чтобы учесть все это в коде, который пишется и отлаживается один раз, а потом используется в любом советнике.

Единственное, в конструкторе класса было бы проще инициализировать раз тип исполнения, вместо получения его перед каждой торговой операцией.. Это мысли вслух.

Я тут посмотрел, кстати, Vladimir Karputov у в каком-то сове тип заполнения в ИНИТЕ запоминает. Больше в будущем он его не пересчитывает. Это я так понимаю тоже не совсем корректо, т.к. теоритически может не хватить лота, в данный момент времени, и тогда возникает нестыковка?
 
hoz:

Единственное, в конструкторе класса было бы проще инициализировать раз тип исполнения, вместо получения его перед каждой торговой операцией.. Это мысли вслух.

По большому счету можно и так. Но тогда потребуется отслеживать новости от брокера о том, что изменился тип исполнения на таких то счетах. В этот момент нужно будет перезапустить советник, чтобы он получил новые данные. Чтобы не беспокоиться о таких вещах (о них можно и забыть ведь) лучше сделать так, чтобы голова на этот счет никогда не болела - проверить все, что можно перед совершением торговой операции. Это не такие уж большие затраты ресурсов. Даже в тестере не ощущается.

Я тут посмотрел, кстати, Vladimir Karputov у в каком-то сове тип заполнения в ИНИТЕ запоминает. Больше в будущем он его не пересчитывает. Это я так понимаю тоже не совсем корректо, т.к. теоритически может не хватить лота, в данный момент времени, и тогда возникает нестыковка?

Не вижу зависимости типа исполнения от размера залога. Что Вы имеете в виду?

 
Ihor Herasko:

По большому счету можно и так. Но тогда потребуется отслеживать новости от брокера о том, что изменился тип исполнения на таких то счетах. В этот момент нужно будет перезапустить советник, чтобы он получил новые данные. Чтобы не беспокоиться о таких вещах (о них можно и забыть ведь) лучше сделать так, чтобы голова на этот счет никогда не болела - проверить все, что можно перед совершением торговой операции. Это не такие уж большие затраты ресурсов. Даже в тестере не ощущается.

Не вижу зависимости типа исполнения от размера залога. Что Вы имеете в виду?

А мне эти 2 фактора не дают покоя 2 дня. Принято решение тип заполнения проверять постоянно, а тип исполнения 1 раз в ините. По моему, это самый вариант. Как я понял, тип исполнения, не будет меняться на канкретном типе счёта наобум.

 
hoz:

А мне эти 2 фактора не дают покоя 2 дня. Принято решение тип заполнения проверять постоянно, а тип исполнения 1 раз в ините. По моему, это самый вариант. Как я понял, тип исполнения, не будет меняться на канкретном типе счёта наобум.

Тогда программисту придется следить за тем, не изменился ли тип исполнения ордера во время работы советника. Если изменился, то потребуется перезапуск эксперта. Такую простую вещь, на мой взгляд, лучше автоматизировать.

Причина обращения: