Ускорить одновременную отправку ордеров

 

Столкнулась с проблемой, хотела узнать существует ли вообще решение?

Советник по заданным параметрам должен открывать ордера одновременно на 3 парах.

Т.е. 1 советник 3 пары - на каждый по ордеру.

Скорее всего я что-то делаю не так, но получается так: пока не откроется 1 ордер 2 ожидает. В связи с чем разница между временем открытия бывает до 4 секунд.
Т.е. 1 ордер в 21:00:00 а 3 ордер в 21:00:08
что иногда меняет результат не в лучшую сторону.

Имеется ли решение ассинхронного открытия ордеров.
Советник простой всего 1 пара открыта но следит за 3 парами и на 3 пары открывает ордера.

 
Документация по MQL5: Торговые функции / OrderSendAsync
Документация по MQL5: Торговые функции / OrderSendAsync
  • www.mql5.com
OrderSendAsync - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Это не поможет. Судя по терминам, речь идёт о mql4, а там нету такой функции…

 
Alexey Viktorov #:

Это не поможет. Судя по терминам, речь идёт о mql4, а там нету такой функции…

Совершенно верно, речь о МТ4, так как у брокера нет МТ5
Значит для МТ4 не возможно ускорить отправку?
 
Natalya Smirnova:

Столкнулась с проблемой, хотела узнать существует ли вообще решение?

Советник по заданным параметрам должен открывать ордера одновременно на 3 парах.

Т.е. 1 советник 3 пары - на каждый по ордеру.

Скорее всего я что-то делаю не так, но получается так: пока не откроется 1 ордер 2 ожидает. В связи с чем разница между временем открытия бывает до 4 секунд.
Т.е. 1 ордер в 21:00:00 а 3 ордер в 21:00:08
что иногда меняет результат не в лучшую сторону.

Имеется ли решение ассинхронного открытия ордеров.
Советник простой всего 1 пара открыта но следит за 3 парами и на 3 пары открывает ордера.

во первых переформулируйте задачу так как она в стоит в торговле : открыть позиции на 3-х инструментах по их ценам на момент X. Или наиболее близко к оным. И сразу просится простейшее решение - в момент X создаём  (опция тралим) "виртуальные" ордера. 

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

и наконец проблема на 90% вызвана обильными и длительными вычислениями в OnTick. Вы пока выявляете сигнал, цена уходит и первый-же OrderSend лагает, проскальзывает или просто не срабатывает. Меняйте логику советника

 

про ping еще ничего не указанно

если ping 100, то как раз 3 ордера укладываются в это время

асинхронный ордер сократил бы, только в двое, максимум


add

правильно ли я перевел ping?)

 

шалом!

Если советник только по времени ограничен (без индикаторов-паттернов и прочих причиндалов) - то должен открыть мгновенно в то же время три ордера.

Если есть запаздывание- то в коде есть какой фильтр, который и "мешает".


Как то таг.

 
Natalya Smirnova:

Столкнулась с проблемой, хотела узнать существует ли вообще решение?

Советник по заданным параметрам должен открывать ордера одновременно на 3 парах.

Т.е. 1 советник 3 пары - на каждый по ордеру.

Скорее всего я что-то делаю не так, но получается так: пока не откроется 1 ордер 2 ожидает. В связи с чем разница между временем открытия бывает до 4 секунд.
Т.е. 1 ордер в 21:00:00 а 3 ордер в 21:00:08
что иногда меняет результат не в лучшую сторону.

Имеется ли решение ассинхронного открытия ордеров.
Советник простой всего 1 пара открыта но следит за 3 парами и на 3 пары открывает ордера.

Да, решение в MT4 есть. На сервер можно послать до 8 ордеров, обработка которых будет видеться со стороны терминала вовсе не как поочередная, а как параллельная. При посылке 9 запросов на 9-м будете стабильно получать отказ "Торговый поток занят". Но посылать их нужно каждый из своего советника. Свой советник должен ждать получения результата своего запроса к серверу, и общий результат может оказаться таким, например: из 8 отправленных запросов 6 выполнены, у двух отказ.
 
Alexander Ivanov #:

шалом!

Если советник только по времени ограничен (без индикаторов-паттернов и прочих причиндалов) - то должен открыть мгновенно в то же время три ордера.

Если есть запаздывание- то в коде есть какой фильтр, который и "мешает".


Как то таг.

У советника есть 2 условия цвет свечи (восходящая или нисходящая) и данные стохастика.
Но как писали выше, я думаю стоит действительно разделить на 2 советника

1 следит за ситуацией и посылает команду
2 только открывает ордера

и даже сокращение в 2 раза для меня важно.

 
Maxim Kuznetsov #:

во первых переформулируйте задачу так как она в стоит в торговле : открыть позиции на 3-х инструментах по их ценам на момент X. Или наиболее близко к оным. И сразу просится простейшее решение - в момент X создаём  (опция тралим) "виртуальные" ордера. 

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

и наконец проблема на 90% вызвана обильными и длительными вычислениями в OnTick. Вы пока выявляете сигнал, цена уходит и первый-же OrderSend лагает, проскальзывает или просто не срабатывает. Меняйте логику советника

Спасибо большое я так примерно и думала. Разделить. Так как каждый тик действительно уходит лишнее время на повторное прочтение кода, который следует до команды открытия ордера
 
Alexander Ivanov #:

шалом!

Если советник только по времени ограничен (без индикаторов-паттернов и прочих причиндалов) - то должен открыть мгновенно в то же время три ордера.

Если есть запаздывание- то в коде есть какой фильтр, который и "мешает".


Как то таг.

OrderSend в MQL4 асинхронная операция. Как только начала исполняться команда отсылки запроса на сервер, код советника дальше не исполняется. Советник начнет исполнять следующую строку только после возвращения из OrderSend результата.

Справка по OrderSend в MQL4 :
"Возвращаемое значение
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError()."

Поэтому отправить одновременно из одного советника 3 запроса нельзя, только поочередно. Один советник ("ведущий") пишет в песочницу терминала сигнальный файл и отправляет один из запросов. Стоит, ждет. Все ведомые советники постоянно сканируют песочницу - не пришло ли для него задание в сигнальном файле. Пришло - отправляет запрос и встает в ожидание. Одновременность такова, каков период опроса песочницы ведомыми советниками. Вполне реально сделать период опроса 11 миллисекунд, параметр Sleep. Точнее мне не надо было.

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