Асинхронные запросы к серверу

 

Наблюдал торговлю лидеров на конкурсе, где дают инвестиционный пароль для этого. У одного сегодня заметил 19 сделок с совпадающим временем открытия в секундах. Как он мог это сделать?

Помню, года два назад (не говорю об MQL5) появилась возможность слать запросы на открытие сделок "одновременно" до 8 штук. Как, не описывали, но, похоже, это возможно лишь запуском 8 советников на 8 графиках. А как сделать 19 "одновременных" запросов - может быть, ограничение в 8 запросов уже расширено? Или у этого трейдера VPS находится в Нидерландах, рядом с конкурсным сервером, и его запросы исполняются очень быстро?

 
Реальный брокер может забанить за частые запросы.   Или ошибка  8   ERR_TOO_FREQUENT_REQUESTS   Слишком частые запросы
 
 
LRA:
Реальный брокер может забанить за частые запросы.   Или ошибка  8   ERR_TOO_FREQUENT_REQUESTS   Слишком частые запросы
 

Вообще-то я и не знаю, где это нужно в реальной торговле. Разве что торговля группой из n валют (не пар) против другой группы из m валют, тогда в подходящий момент потребуется открывать сделки сразу на n*m валютных парах. Однако интересно, как разработчики сейчас видят возможность одновременных запросов и сколько их можно делать, не получая сообщения о занятости торгового потока.

На конкурсе-то понятно, там искусственные условия. В наблюдаемом мной случае ограничен объем каждой сделки, но ограничения общего объема открытых одновременно сделок по паре нет.

 


Не дождавшись ответа разработчиков, выяснил возможности асинхронных подачи и исполнения запросов в MQL4 опытным путем. Только для открытия сделок. Сгенерировал советники по числу богатырей в отряде дядьки Черномора, завел столько же графиков, на которых запустил эти советники. Они ждут появления сигнального файла, с его появлением пытаются открыть сделку. Демосчет. В 5 попытках из 5 открывались ровно 8 сделок с одной и той же секундой во времени открытия, остальные 26 советников давали ошибку ERR_TRADE_CONTEXT_BUSY (146, Подсистема торговли занята). Тикеты вновь открывшихся сделок шли в каждой попытке подряд.

К разработчикам все равно остался вопрос. Асинхронное открытие сделок в MQL4 так и будет возможным только таким изуверским способом? Есть ли намерение реализовать эту возможность в одном советнике, например, так же, как в MQL5?

 
Vlad143:

Не дождавшись ответа разработчиков, выяснил возможности асинхронных подачи и исполнения запросов в MQL4 опытным путем. Только для открытия сделок. Сгенерировал советники по числу богатырей в отряде дядьки Черномора, завел столько же графиков, на которых запустил эти советники. Они ждут появления сигнального файла, с его появлением пытаются открыть сделку. Демосчет. В 5 попытках из 5 открывались ровно 8 сделок с одной и той же секундой во времени открытия, остальные 26 советников давали ошибку ERR_TRADE_CONTEXT_BUSY (146, Подсистема торговли занята). Тикеты вновь открывшихся сделок шли в каждой попытке подряд.

К разработчикам все равно остался вопрос. Асинхронное открытие сделок в MQL4 так и будет возможным только таким изуверским способом? Есть ли намерение реализовать эту возможность в одном советнике, например, так же, как в MQL5?

О количестве запросов одновременно написано в документации. Проведённый тобой эксперимент подтверждает правдивость документации по этому поводу, ровно 8 одновременных потоков.

OrderSendAsync() это не то о чём ведёшь речь. Посылая асинхронный запрос МТ не ждёт ответа от сервера о выполнении  и только этим отличается от OrderSend(). По сути, в МТ4 есть возможность проверить выполнение запроса, а при запросе OrderSendAsync() такой возможности нет. Открылись ордера - хорошо, а не открылись, ну и не надо.

 
LRA:
Реальный брокер может забанить за частые запросы.   Или ошибка  8   ERR_TOO_FREQUENT_REQUESTS   Слишком частые запросы
 
При запросах OrderModify() с неизменными параметрами могут и забанить и правильно сделают. А если без паузы пытаться открыть ордер и за это вдруг забанят, это уже просто реальная кухня.
 
AlexeyVik:

О количестве запросов одновременно написано в документации. Проведённый тобой эксперимент подтверждает правдивость документации по этому поводу, ровно 8 одновременных потоков.

OrderSendAsync() это не то о чём ведёшь речь. Посылая асинхронный запрос МТ не ждёт ответа от сервера о выполнении  и только этим отличается от OrderSend(). По сути, в МТ4 есть возможность проверить выполнение запроса, а при запросе OrderSendAsync() такой возможности нет. Открылись ордера - хорошо, а не открылись, ну и не надо.

Рылся-рылся - не нашел. Не будете так добры уточнить местонахождение того, что написано в документации?

Относительно OrderSendAsync() - отчего же нет возможности проверить ход исполнения запроса, для этого как будто и введено событие OnTradeTransaction, если верить справке по MQL5. Или оно чем-то не подходит? Я не пробовал, поделитесь опытом...

 
Vlad143:

Рылся-рылся - не нашел. Не будете так добры уточнить местонахождение того, что написано в документации?

Относительно OrderSendAsync() - отчего же нет возможности проверить ход исполнения запроса, для этого как будто и введено событие OnTradeTransaction, если верить справке по MQL5. Или оно чем-то не подходит? Я не пробовал, поделитесь опытом...

Что-то я тоже не нашёл. Возможно что об этом писали только в презентации обновления, но точно я читал о восьми одновременных запросах.

Относительно OnTradeTransaction делиться в общем-то нечем. Сам сейчас бьюсь в непониманиях. Вот последнее наблюдение:

Открываю позицию. Сразу за ней отложенный ордер...

Хочется увидеть в OnTradeTransaction последовательно открытие позиции со всеми её параметрами в структурах, ан нет... в структурах параметры отложки.

Так-что для использования OnTradeTransaction надо с учётом этого строить весь свой алгоритм программы.

И в документации чётко написано что последовательность транзакций пришедших в OnTradeTransaction не гарантирована.

Один торговый запрос, отправленный из терминала вручную или через торговые функции OrderSend()/OrderSendAsync(), может порождать на торговом сервере несколько последовательных торговых транзакций. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других.


 
AlexeyVik:

Что-то я тоже не нашёл. Возможно что об этом писали только в презентации обновления, но точно я читал о восьми одновременных запросах.

Относительно OnTradeTransaction делиться в общем-то нечем. Сам сейчас бьюсь в непониманиях. Вот последнее наблюдение:

Открываю позицию. Сразу за ней отложенный ордер...

Хочется увидеть в OnTradeTransaction последовательно открытие позиции со всеми её параметрами в структурах, ан нет... в структурах параметры отложки.

Так-что для использования OnTradeTransaction надо с учётом этого строить весь свой алгоритм программы.

И в документации чётко написано что последовательность транзакций пришедших в OnTradeTransaction не гарантирована.


У меня тоже воспоминание, что в справке число 8 не появлялось. Получается, что где-то объявленную и работающую возможность отсылать до 8 асинхронных запросов следует считать недокументированной.

Разработчики, так ли это? Если так, то почему? В частности, можно ли на эту возможность опираться в написании скриптов и советников MQL4? Пусть и через 8 окошек...

Почитал https://www.mql5.com/ru/articles/1111, https://www.mql5.com/ru/articles/40, https://www.mql5.com/ru/docs/trading/ordersendasync. У людей OnTradeTransaction вроде работает. Уважаемый AlexeyVik, у вас в приходящих структурах с разными идентификаторами торгового запроса request_id приходит одна и та же информация, относящаяся к запросу выставления отложенного ордера? Или с request_id запроса открытия позиции вообще ничего не приходит?

 
Читайте классиков. Рустам года полтора-два назад рассказывал. 
 

Vlad143:

AlexeyVik, у вас в приходящих структурах с разными идентификаторами торгового запроса request_id приходит одна и та же информация, относящаяся к запросу выставления отложенного ордера? Или с request_id запроса открытия позиции вообще ничего не приходит?

А кто говорил что OnTradeTransaction не работает? Просто надо понять как это работает, понимать что последовательность событий не соответствует последовательности запросов к серверу...

По-моему request_id бесполезная приблуда. Возможно просто пока я не понял как её можно использовать. По моим наблюдениям это какой-то счётчик. Я его принтовал и получал каждый принт следующее число.