Ожидание ответа сервера после посылки OrderSend() - страница 3

 
Karputov Vladimir:
А не нужно внутри цикла. @Сделал дело - гуляй смело!@ Внутри цикла пульнули и если OrderSend==true, то взвести флаг ожидания и ловить результат в OnTradeTransaction(). И никаких циклов и зацикливаний.
Возможно вы правы. Но, мне этот путь не очень нравится. Так как я открываю три сделки, мне нужно будет отлавливать в OnTrade три результата. А потом снова пытаться открыть не открывшиеся. Гораздо элегантнее дождаться ответа сервера прямо на месте, когда все параметры запроса еще свежие.
 

Вышла новая статья Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее? . В ней есть скрипт проверки скорострельности. Так вот, там есть такое решение (советник "SyncTradesTest.mq5" для синхронного выполения

      //--- проводим цикл операций
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- action
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

- здесь OrderSend проверяется на true или на false. В Вашем случае нужно просто проверять на true. Может примерно так:

         bool rezult=false;
         do
           {
            rezult=OrderSend(req,res);
           }
         while(!rezult)

Правда тогда внутрь цикла do ... while нужно записать получение цены и заполнение структуры запроса.

 
Oleg Shenker:

Открываю сделку в цикле следующим кодом:

 Цикл задуман как средство повышения надежности открытия сделки, то есть, если не открывается с первого раза, пробовать снова.

Проблема в том, что, пока терминал получает ответ сервера, цикл успевает послать команду OrderSend() несколько раз.

Как можно заставить его ждать ответа? 

Да очень просто.

Нужно поставить флаг, что мы ожидаем ответа в OnTradeTransaction, которая, в свою очередь сбросит флаг, когда

придёт подтверждение, что ордер установлен. 

 
prostotrader:

Да очень просто.

Нужно поставить флаг, что мы ожидаем ответа в OnTradeTransaction, которая, в свою очередь сбросит флаг, когда

придёт подтверждение, что ордер установлен. 

А почему OnTradeTransaction(), а не OnTrade()?
 
Karputov Vladimir:

Вышла новая статья Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее? . В ней есть скрипт проверки скорострельности. Так вот, там есть такое решение (советник "SyncTradesTest.mq5" для синхронного выполения

- здесь OrderSend проверяется на true или на false. В Вашем случае нужно просто проверять на true. Может примерно так:

Правда тогда внутрь цикла do ... while нужно записать получение цены и заполнение структуры запроса.

Я так делал. Суть та же. Пока нет ответа от сервера - OrderSend() == false. Цил продолжает посылать запросы.

Или совсем отказываться от цикла, и проверять исполнение по OnTrade() или OnTradeTransaction(), и если все нормально, то идти дальше... А если не нормально...

Вот!!! Не годится OnTradeTransaction(), так как она вернет результат, что все хорошо. И будет молчать, пока сделка не случится.

Сколько ждать, перед тем как сделать новую попытку открыть сделку? Не вижу разницы между проверкой OnTradeTransaction() и проверкой result.retcode.

 
Oleg Shenker:

Я так делал. Суть та же. Пока нет ответа от сервера - OrderSend() == false. Цил продолжает посылать запросы.

Или совсем отказываться от цикла, и проверять исполнение по OnTrade() или OnTradeTransaction(), и если все нормально, то идти дальше... А если не нормально...

Вот!!! Не годится OnTradeTransaction(), так как она вернет результат, что все хорошо. И будет молчать, пока сделка не случится.

Сколько ждать, перед тем как сделать новую попытку открыть сделку? Не вижу разницы между проверкой OnTradeTransaction() и проверкой result.retcode.

А Вы точно так делали:

         bool rezult=false;
         do
           {
            rezult=OrderSend(req,res);
           }
         while(!rezult)

?

Я в цикле предлагал проверять только false или true.  

 
Karputov Vladimir:

А Вы точно так делали:

?

Я в цикле предлагал проверять только false или true.  

Я делал короче:
while !OrderSend(req, res);
 
Интересно, зачем понадобилось делать асинхронный OrderSendAsync и полуaсинхронный OrderSend? ИМХО OrderSend с поведением как в MT4 был бы удобней.  Выход из OrderSend, если появилась новая сделка или ордер и торговая история на терминале обновилась, смотрится короче, удобнее и без велосипедописательства. :)

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

разработчики объявляли, что OrderSend сделали полностью синхронным

 


 
RickD:
Интересно, зачем понадобилось делать асинхронный OrderSendAsync и полуaсинхронный OrderSend? ИМХО OrderSend с поведением как в MT4 был бы удобней.  Выход из OrderSend, если появилась новая сделка или ордер и торговая история на терминале обновилась, смотрится короче, удобнее и без велосипедописательства. :)

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

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

Кроме того, асинхронный советник после отправки ордеров может продолжать контролировать новые сигналы, а синхронный советник будет "курить бамбук" до тех пор, пока не сработает предыдущий приказ.

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