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

 

Я новичок в 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", что мне кажется крайне нелогичным. Уж если функция асинхронная, то не должна прерывать программу. А по факту мы видим обратное. Никакой асинхронностью здесь и не пахнет.

 

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

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

 
decashinv:


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

 

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

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

Так и должно быть.

Сначала отработает цикл, а потом принт. 

 
Fleder:

Так и должно быть.

Сначала отработает цикл, а потом принт. 

Цикл должен отработать - с этим я не спорю.

Но Print, которые выводится внутри цикла должны отрабатывать после того, как отработает Print("Test message");

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

 
decashinv:

Цикл должен отработать - с этим я не спорю.

Но Print, которые выводится внутри цикла должны отрабатывать после того, как отработает Print("Test message");

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

Как может то, что стоит в конце отработать раньше того, что стоит в начале?

Операторы и функции выполняются последовательно в порядке их написания в коде. 

 
decashinv:

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

C потоками бы вам еще поразбираться...
 
Fleder:

Как может то, что стоит в конце отработать раньше того, что стоит в начале?

Операторы и функции выполняются последовательно в порядке их написания в коде. 

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

Вот так и может то что стоит в начале отработать позже того, что стоит в конце. 

 
TheXpert:
C потоками бы вам еще поразбираться...

Что Вы имеете в виду? Есть ссылки по этой теме? 

 
decashinv:

Что Вы имеете в виду? Есть ссылки по этой теме? 

Посмотрите здесь.
 
decashinv:


опыт программирования у меня достаточно большой.
+

Print, которые внутри цикла должны отрабатывать после Print("Test message");

:))) настроение поднял на весь оставшийся день.

пиши исчо :))

 
sergeev:

:))) настроение поднял на весь оставшийся день.

пиши исчо :))

Ну объясните тогда в чём у меня неточность, модератор. Сам хоть посмеюсь, как осознаю.

Я на форум пришёл, чтобы помощь получить, а не едкие замечания в свою сторону.

И тут уж пропадает всякое желание "писать исчо".

 
decashinv:

Ну объясните тогда в чём у меня неточность, модератор. Сам хоть посмеюсь, как осознаю.

1.  у вас неточность в осознании "асинхронности" функции OrderSendAsync

2. вы не осознаете чем отличается "цикл в потоке" и "два потока".

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