OrderSendAsync не возвращает номер тикета (OnTradeTransaction - ловля блох или асинхронных хаос? ) - страница 4

 
prostotrader:

:)

А если отложенный ордер и исполнился не полным объемом?

У ордера заполнены свойства текущего и оставшегося объёма. Точно так же и у позиции.

 
Artyom Trishkin:

У ордера заполнены свойства текущего и оставшегося объёма. Точно так же и у позиции.

Причем тут позиция, если вообще нет никаких данных об ордере!

Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),

при этом нет не тикета не реквест айди ордера.

 

К пачке предьяв, справедливо адресованных автором топика в сторону MQ за некорректный, нелогичный и вводящий в заблуждение функционал работы функции OnTradeTransaction() хочу добавить еще несколько топиков.

1. Набор событий, приходящий при выполнении ордеров, различается для форекс-заявок и биржевых заявок. Получается, что если трейдер торгует на едином счете (а такие уже появились у некоторых брокеров), то требуется реализовать две разные логики обработки.

2. Комментарий, выставленный к ордеру, по каким-то неясным причинам указывается только в событии TRADE_TRANSACTION_REQUEST, а в TRADE_TRANSACTION_POSITION не указывается, хотя и проводится в системе потом как комментарий к Позиции.

3. Поле symbol в структуре MqlTradeTransaction у биржевых сделок  у части транзакций НЕ заполняется, нужно "переключаться" на анализ поля у стурктуры  MqlTradeRequest.

Заявленную автором проблему я как раз пытаюсь решить через указание собственных идентификаторов, но не через поле magic (его я использую для идентификации стратегий), а черезх поле comment.Но по сути это не значит ничего - все эти доп. обработки и "накрутки" логики, необходимые для того чтобы связать ордер и сделки, связанные с его выполнением, требуются задержек, которые нивелиуют преимущество OrderSendAsync, как уже верно было замечено.

 

При этом удивляет, что MQ продолжают пичкать MT5 таким маржанальным функционалом, как-то работа скриптов Python, который дай бог нужен 0,1% трейдеров, а имеющиеся недостатки текущего функционала, от которого страдают большинство, не исправляют. Под "страданием" я тут понимаю фигурально и все то страдолетство, которое требуется на написание этих диких "костылей", которые необходимы чтобы перекрыть имеющиеся недостатки функционала работы функции OnTradeTransaction().

Поэтому я предлагаю больше тут не обсуждать "костыли", хотя тема и была вначале для этого создана -   это все и так понятно, что убив кучу времени, можно написать все что угодно, тем более что у каждого своя вариация в потребностях, и варианты "костылей" могут отличаться; а сделать далее тут сухую выжимку из всей этой помойки проблем, связанных с работой функции OnTradeTransaction(), и как только выйдет новый релиз МТ5 - в "горячем" топике по новому релизу коллективно надавить на сознание менеджеров по развитию продукта в направлении их осознания того, что пришло время навести порядок в работе данной функции.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
prostotrader:

Причем тут позиция, если вообще нет никаких данных об ордере!

Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),

при этом нет не тикета не реквест айди

А как я всё нахожу? Шайтан?

 
Artyom Trishkin:

А как я всё нахожу? Шайтан?

Можно, при желании, найти все, написав несколько страниц кода.

Только зачем?

Все очень просто, посмотрите "на досуге" (на ФОРЕКС не тестил)

Файлы:
Delay_test.mq5  40 kb
 
prostotrader:

Можно, при желании, найти все, написав несколько страниц кода.

Только зачем?

Все очень просто, посмотрите "на досуге" (на ФОРЕКС не тестил)

Не буду. Зачем? У меня иной досуг.

 
Artyom Trishkin:

Не буду. Зачем? У меня иной досуг.

Я подтвердил свои слова конкретным кодом, Вы отказались...

Значит у Вас только Шайтан.

 
prostotrader:

Я подтвердил свои слова конкретным кодом, Вы отказались...

Значит у Вас только Шайтан.

Значит Шайтан.

Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".

Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки".
Но MQ дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.

Я не настаиваю. Jedem das Seine

 
Artyom Trishkin:

Значит Шайтан.

Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".

Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки".
Но MQ дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.

Я не настаиваю. Jedem das Seine

Понятна Ваша позиция.

Добавлено

Даже в КВИК используется точно такой же механизм как в МТ5, при отправке асинхронных ордеров (и почему-то тоже работает)

//--- Transaction callback -----
procedure pfTransReplyCB;
var
  i: integer;
  Child: TMDIChild;
begin
  Mutex.Lock;
  try
    for i:= 0 to MainForm.MDIChildCount - 1 do
    begin
      Child:= TMDIChild(MainForm.MDIChildren[i]);
      if(Child <> nil) then
      begin
        if(dwTransId = Child.Expert.TransID) then               //Test ID
        begin
          if(nTransactionResult = TRANS2QUIK_SUCCESS) then       //Test result  
            Child.Expert.FOrder:= nOrderNum else                //Get order done
              Child.Expert.FTransBusy:= false;                  //Get order fail
          break;
        end;
      end;
    end;
  finally
    Mutex.UnLock;
  end;
end;

МТ5

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  switch(trans.type)
  {
    case TRADE_TRANSACTION_REQUEST:
      if((BuyOrder.req_id > 0) && (result.request_id == BuyOrder.req_id)) //Test ID
      {
        if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE))  //Test result
        {
          BuyOrder.req_id = 0;
          switch(BuyOrder.state)
          {
            case ORD_DO_MODIFY: 
            case ORD_DO_CANCEL:
            case ORD_DO_SET:
              if(result.order > 0)
              {
                BuyOrder.ticket = result.order;                         //Get order ticket
             }
              else
              {
                BuyOrder.state = ORD_NO_STATE;
                Print(__FUNCTION__, ": Не получен билет Buy ордера!");
                BuyOrder.ticket = 0;
              }
            break;
          }
        }
        else
        {
          switch(BuyOrder.state)
          {
            case ORD_DO_SET:
              BuyOrder.state = ORD_NO_STATE;
              Print(__FUNCTION__, ": Buy ордер не установлен!");
              BuyOrder.ticket = 0;
            break;  
            case ORD_DO_MODIFY:
              BuyOrder.state = ORD_WORK;
              Print(__FUNCTION__, ": Buy ордер не модифицирован!");
            break;
            case ORD_DO_CANCEL:
              BuyOrder.state = ORD_WORK;
              Print(__FUNCTION__, ": Buy ордер не удалён!");
            break;                                                 
          }
        }
      }

Добавлено

С 2013 года использую OnTradetransaction() с асинхронными ордерами на реале

и до сих пор никаких проблем не было!

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...