вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.
так вот и хотелось бы изменить это. зачем трейдеру все промежуточные шаги от отправки торгового приказа до приходя отчета об итогах сделки? - тем более если трейдер никак на это повлиять не может!))) для более детального ковыряния в процессах торговли есть специализированные функции OrderSendAsync() и типа OnTrade().
OrderSend () должен быть полностью синхронным, трейдер отправил приказ а назад получить отчет о результатах сделки и всех промежуточных шагов брокера, поставщика ликвидности и за что вообще захочет отчитываться брокер. Всё.
наличие OrderSendSync() в дополнение к имеющимся OrderSend() и OrderSendAsync() упростило бы код в простых/односимвольных экспертах.
Но у меня голова уже "заточилась" под текущую/имеющуюся схему работы и она кажется мне вполне удобной.
вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.
Именно базовые функции терминала разработчиков MT не сильно беспокоят. Какие-то рюшечки будут пилить, а базовый функционал - нет.
Вот и сейчас, реакции от разрабов за несколько дней не последовало, хотя, стоило прокомментировать ситуацию с псевдоасинхронной функцией.
Оно и понятно, не от доходов трейдеров живёт индустрия, а наоборот.
В качестве предложения разработчикам, с учетом обсуждения, добавить OrderSendSync():
Надо?
наверное, да, как компромисс, что бы не ломать имеющееся, было бы целесообразно ввести полностью синхронную функцию. либо новую, либо качественно обёрнутую разработчиками OrderSend ().
Когда цена до него дошла, он был отправлен на исполнение.
В определенный момент в Терминале не стало открытого BuyLimit1, но и Buy1 не появился.
В этой ситуации (отсутствие отложенного ордера и позиции) ТС выставляет новый BuyLimit2, т.к. того требует торговая логика.
Появляется Buy1-позиция.
Выставленный BuyLimit2 отправляется брокером на исполнение и порождает Buy2.
Как итог, был изначально только BuyLimit1, а стало две позиции: Buy1 и Buy2.
По пункту 3:
В момент срабатывания BuyLimit1 появляется маркет-ордер. Если память мне не изменяет - с тем же тикетом (могу ошибаться из-за давности проверок этой логики).
По нему можно понять, что сработал BuyLimit1: нету BuyLimit1, нету Buy1, но есть BuyMarket1, который и породит сделку.
В момент срабатывания BuyLimit1 появляется маркет-ордер. Если память мне не изменяет - с тем же тикетом (могу ошибаться из-за давности проверок этой логики).
По нему можно понять, что сработал BuyLimit1: нету BuyLimit1, нету Buy1, но есть BuyMarket1, который и породит сделку.
Если ошибаюсь - поправьте.
Не знаю как на FX (может зависить от брокера)- а на бирже никакого маркет-ордера здесь быть НЕ МОЖЕТ!!!
Есть даже стресс-тест, который трушный синхронный OrderSend не пройдет.
Потому что в MT5 асинхронность повсюду:
вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.
так вот и хотелось бы изменить это. зачем трейдеру все промежуточные шаги от отправки торгового приказа до приходя отчета об итогах сделки? - тем более если трейдер никак на это повлиять не может!))) для более детального ковыряния в процессах торговли есть специализированные функции OrderSendAsync() и типа OnTrade().
OrderSend () должен быть полностью синхронным, трейдер отправил приказ а назад получить отчет о результатах сделки и всех промежуточных шагов брокера, поставщика ликвидности и за что вообще захочет отчитываться брокер. Всё.
наличие OrderSendSync() в дополнение к имеющимся OrderSend() и OrderSendAsync() упростило бы код в простых/односимвольных экспертах.
Но у меня голова уже "заточилась" под текущую/имеющуюся схему работы и она кажется мне вполне удобной.
OrderSend() точно переделывать не надо.
вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.
Как и предполагалось, сделки не было. Ордер отправлен, его тикет есть. Но по какой цене он реально исполнится, еще не известно.
Хочешь трушный синхронный ордерсенд — запили его сам с помощью предложенного бесконечного цикла.
Тогда почему код ответа 10009 а не
10008
TRADE_RETCODE_PLACED
Ордер размещен
В качестве предложения разработчикам, с учетом обсуждения, добавить OrderSendSync() :
| зона ответственности Биржи || зона ответственности Брокера || интернет || клиент |
[биржа (MOEX)] <==> [шлюз Plaza2] <===> [шлюз в MOEX] <=> [MT5 торговый сервер] <=> [Точка доступа] <================> [Терминал] - > true OrderSendSync()
[биржа (MOEX)] <==> [шлюз Plaza2] <===> [шлюз в MOEX] <=> [MT5 торговый сервер] <=> [Точка доступа] <================> [Терминал] - > true OrderSend()
[биржа ( MOEX)] <==> [шлюз Plaza2] <===> [шлюз в MOEX] <=> [MT5 торговый сервер] <=> [Точка доступа] <================> [Терминал] - > true OrderSendAsync()
Надо?
В качестве предложения разработчикам, с учетом обсуждения, добавить OrderSendSync()
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)
fxsaber, 2021.06.03 06:10
Пожалуй, на данный момент это самая сложная задача из всех легко формулируемых задач в этой ветке.
Очень сильная проверка владения торговой частью MQL5.
Там в ветке значительно конструктивнее было обсуждение различных вариантов поведения MT5.
В качестве предложения разработчикам, с учетом обсуждения, добавить OrderSendSync() :
Надо?
наверное, да, как компромисс, что бы не ломать имеющееся, было бы целесообразно ввести полностью синхронную функцию. либо новую, либо качественно обёрнутую разработчиками OrderSend ().
надо.
Всё это происходит от того, что существуют 2 базы данных. Один на сервере брокера, другой у вас.
И между ними стоят МТ5. Если обмен данными происходит через интернет, или сервера работают медленно, то всякое может произойти.
У меня раньше из-за OrderSend были и двойные сделки, и обратные сделки.
И поэтому сейчас уже как 4 года использую Стандартную библиотеку CTrade.
Например: CTrade trade;
trade.Sell(), trade.Buy(), trade.PositionModify() и trade.PositionClose()
Они не требуют задать или проверить тип исполнения, политика заполнения и не надо заполнить какие-то структуры;
Это очень просто и работают прекрасно :)
Есть даже стресс-тест, который трушный синхронный OrderSend не пройдет.
Потому что в MT5 асинхронность повсюду:
По пункту 3:
В момент срабатывания BuyLimit1 появляется маркет-ордер. Если память мне не изменяет - с тем же тикетом (могу ошибаться из-за давности проверок этой логики).
По нему можно понять, что сработал BuyLimit1: нету BuyLimit1, нету Buy1, но есть BuyMarket1, который и породит сделку.
Если ошибаюсь - поправьте.
По пункту 3:
В момент срабатывания BuyLimit1 появляется маркет-ордер. Если память мне не изменяет - с тем же тикетом (могу ошибаться из-за давности проверок этой логики).
По нему можно понять, что сработал BuyLimit1: нету BuyLimit1, нету Buy1, но есть BuyMarket1, который и породит сделку.
Если ошибаюсь - поправьте.