Скачать MetaTrader 5

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

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

 

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

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

Artem Temnikov
1041
Artem Temnikov  
decashinv:


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

 

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

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

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

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

decashinv
58
decashinv  
Fleder:

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

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

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

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

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

Alexander Laur
8147
Alexander Laur  
decashinv:

..... 

 У меня асинхронная функция открытия работает нормально. 7 ордеров отправляет за 7 мс. А вот результаты исполнения этих приказов (открытия) приходят через 150 - 250 мс.

У Вас в Print-ах ожидается код возврата. Может проблема в этих ожиданиях? 

Artem Temnikov
1041
Artem Temnikov  
decashinv:

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

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

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

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

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

Комбинатор
16466
Комбинатор  
decashinv:

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

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

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

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

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

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

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

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

Artem Temnikov
1041
Artem Temnikov  
decashinv:

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

Посмотрите здесь.
o_o
Модератор
24201
o_o  
decashinv:


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

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

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

пиши исчо :))

decashinv
58
decashinv  
sergeev:

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

пиши исчо :))

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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий