Миф об асинхронности функции OrderSendAsync() - страница 2

 
decashinv:

В итоге, в результате выполнения этого кода, в терминале я получаю 100 строк с удачным (или не удачным - не важно) выполнением операции и только ПОСЛЕ этого выводится сообщение "Test message", что мне кажется крайне нелогичным. Уж если функция асинхронная, то не должна прерывать программу. А по факту мы видим обратное. Никакой асинхронностью здесь и не пахнет.

 

Возникает вопрос. В чём же тогда дело? Кто-нибудь сталкивался с подобной проблемой?

Кто поможет разобраться с этой аномалией?  

А как должно быть по вашему?

Какой порядок Принты имеют, в том и выводятся. А результат уже придет позже в OnTrade()

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

 

В данном случае смысл ассинхронности в том, что программа не ждет ответа сервера.

Но это не значит, что функция не возвращает результата и что выполнение основного цикла продолжается в новом потоке.

Попробуйте использовать синхронный вариант и понаблюдайте за результатами. 

 
decashinv:

Я новичок в mql5, но опыт программирования на других языках у меня достаточно большой.

 

Сегодня столкнулся со следующей проблемой.

Функция OrderSendAsync(), если верить документации, "не должна приостанавливать работу программы в ожидании результата её (функции) выполнения".

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

Приведу пример своего кода:  

 

CTrade trade;

trade.SetExpertMagicNumber(123456);

trade.SetDeviationInPoints(10);

trade.SetAsyncMode(true); // Какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend()


for (int i=0; i<100; i++) {

    if(trade.Buy(0.01, "USDCAD.e")) {

        Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")");

    } else {

        Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription());

    };

};

 

Print("Test message"); 


 

В итоге, в результате выполнения этого кода, в терминале я получаю 100 строк с удачным (или не удачным - не важно) выполнением операции и только ПОСЛЕ этого выводится сообщение "Test message", что мне кажется крайне нелогичным. Уж если функция асинхронная, то не должна прерывать программу. А по факту мы видим обратное. Никакой асинхронностью здесь и не пахнет.

 

Возникает вопрос. В чём же тогда дело? Кто-нибудь сталкивался с подобной проблемой?

Кто поможет разобраться с этой аномалией?  

Вы спутали оператор GOTO с понятием асинхронности в МТ5. Логически подумайте: почему поток, если он встречает асинхронную функцию, должен завершить перебор цикла и перейти к функции Print()?

Асинхронный режим отправки ордера означает, что функция OrderSend отправит Ваш торговый запрос не дожидаясь ответа сервера.  Флаг возрата будет означать лишь то, удалось ли ей отправить торговый запрос или нет. Сам факт выполнения или невыполнения Вашего запроса будет известен позже, и его наступление Вы должны определить выйдя из текущего потока.

 
C-4:

Вы спутали оператор GOTO с понятием асинхронности в МТ5. Логически подумайте: почему поток, если он встречает асинхронную функцию, должен завершить перебор цикла и перейти к функции Print()?

Асинхронный режим отправки ордера означает, что функция OrderSend отправит Ваш торговый запрос не дожидаясь ответа сервера.  Флаг возрата будет означать лишь то, удалось ли ей отправить торговый запрос или нет. Сам факт выполнения или невыполнения Вашего запроса будет известен позже, и его наступление Вы должны определить выйдя из текущего потока.

Это лучший ответ!

Благодарю Вас за помощь :-)