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

 
Stanislav Korotky:

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

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

Для асинхронной работы есть OrderSendAsync. Кто хочет- тот им пользуется. Тут вопросов нет.
 
Alexander Bereznyak:

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

 

На реальном счете при вызове CTrade::PositionClose я пару раз поймал закрытие и переворот. Проанализировав логи, я увидел, что OrderSend внутри PositionClose отработал с кодом TRADE_RETCODE_DONE, но PositionsTotal() возвращала все равно 1 как до закрытия, так и после. Сейчас я добавил небольшой таймаут после вызова PositionClose и наблюдаю. Из всего этого я делаю вывод, что инфа по открытым позициям и история торговли обновляется с некоторой задержкой после вызова OrderSend и следовательно, называть эту функцию полностью синхронной во всех смыслах не стоит. Если я не прав, поправьте меня.
 
RickD:
На реальном счете при вызове CTrade::PositionClose я пару раз поймал закрытие и переворот. Проанализировав логи, я увидел, что OrderSend внутри PositionClose отработал с кодом TRADE_RETCODE_DONE, но PositionsTotal() возвращала все равно 1 как до закрытия, так и после. Сейчас я добавил небольшой таймаут после вызова PositionClose и наблюдаю. Из всего этого я делаю вывод, что инфа по открытым позициям и история торговли обновляется с некоторой задержкой после вызова OrderSend и следовательно, называть эту функцию полностью синхронной во всех смыслах не стоит. Если я не прав, поправьте меня.

функция синхронная, просто история обновляется не синхронно с завершением работы этой функции,

я вот так делаю, думаю это проще чем возиться с OnTrade(), и прочими заморочками:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+
 
Denis Sartakov:

функция синхронная, просто история обновляется не синхронно с завершением работы этой функции,

я вот так делаю, думаю это проще чем возиться с OnTrade(), и прочими заморочками:

Спасибо! Интересный способ.
 
Denis Sartakov:

функция синхронная, просто история обновляется не синхронно с завершением работы этой функции,

я вот так делаю, думаю это проще чем возиться с OnTrade(), и прочими заморочками:

Делаю похожим способом. Но жду появления сделки с заданным тикетом в истории.

Можно в цикле
while(PositionSelect(_Symbol))
добавить проверку
if (IsStopped()) break;

так же можно ограничить количество итераций в цикле. Правда ситуаций, когда этот бесконечный цикл может зависнуть, я не вижу.
 
RickD:
Делаю похожим способом. Но жду появления сделки с заданным тикетом в истории.

Можно в цикле
добавить проверку
if (IsStopped()) break;

так же можно ограничить количество итераций в цикле. Правда ситуаций, когда этот бесконечный цикл может зависнуть, я не вижу.
Вот это похоже оптимальное решение. Алгоритм ждет открытия позиции на месте, никуда не уходит. Гениально!