Ошибки, баги, вопросы - страница 3202
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я не понимаю зачем вы это делаете, ищете скрупулёзно баги ? Идеально ничего не будет, если ищут то находят баги и в CPU, но миллиарды умеют в такой среде работать и весь мир не идеален!
вот именно. у меня первой мысль была именно такой.
OrderSend () заявлена как синхронная функция, в этом её несомненная прелесть, но ведёт себя так не у всех брокеров.
Большое спасибо за логи и код - в них содержится вся необходимая информация для обсуждения.
Функция OrderSend() во всех случаях отработала в соответствии с документацией, т.е. правильно. И вернула в каждом из случаев всё, что могла на момент выполнения. Я ниже попробую объяснить, почему так считаю и в чем её отличие от асинхронной версии. Если я в чём то не прав - буду очень благодарен, если меня поправят. Понимание схемы работы этих функций очень важно для меня, т.к. позволяет избежать ошибок в работе роботов.
Схема взаимосвязи терминала со Срочной секцией MOEX. В части работы OrderSend() и OrderSendAsync() нет разницы какой брокер/биржа рассматриваются:
| зона ответственности Биржи || зона ответственности Брокера || интернет || клиент |
[биржа (MOEX)] <==> [шлюз Plaza2] <===> [шлюз в MOEX] <=> [MT5 торговый сервер] <=> [Точка доступа] <================> [Терминал] - true OrderSend()
[биржа ( MOEX)] <==> [шлюз Plaza2] <===> [шлюз в MOEX] <=> [MT5 торговый сервер] <=> [Точка доступа] <================> [Терминал] - true OrderSendAsync()
Золотым цветом выделена зона успешного выполнения OrderSend() и OrderSendAsync(), т.е. участок, который выполнен успешно, в случае, если они вернули true.
Цена рыночной сделки (и она сама) формируется на бирже (в данном случае MOEX). OrderSend() в нормальной ситуации, не должен возвращать цену и тикет сделки т.к. сам о ней пока ничего не знает. Сделка происходит позже и в нормальном случае - в другом месте (не на сервере МТ5).
Ваши логи подтверждают схему выше, кроме одного случая - в котором [MT5 торговый сервер] знает цену сразу - т.е. дальше запрос скорее всего уже не идет (это догадки). Я кстати, не утверждаю, что это плохо. Схемы работы "брокера" бывают разные, у всех есть свои достоинства и недостатки.
То что левее [MT5 торговый сервер] во всех случаях разное. Каждый брокер городит свою инфраструктуру, как может.
Вся инфа на основе анализа/наблюдений и из открытых источников.
Ваши логи подтверждают схему выше, кроме одного случая - в котором [MT5 торговый сервер] знает цену сразу - т.е. дальше запрос скорее всего уже не идет (это догадки). Я кстати, не утверждаю, что это плохо. Схемы работы "брокера" бывают разные, у всех есть свои достоинства и недостатки.
а что мешает брокеру отправить ответ уже после того, как заявка будет исполнена, или же сообщение об ошибке? - хитропопость?))
а что мешает брокеру отправить ответ уже после того, как заявка будет исполнена, или же сообщение об ошибке? - хитропопость?))
Так он и отправляет. Когда сам получит её. Но это уже к OrderSend() не имеет отношение.
Практический вывод - после OrderSend() результат быстрее всего можно получить в OnTrade(), ну или ждать по аналогии с проверочным кодом выше.
А на структуру возврата лучше основную логику алгоритма не завязывать.
Но Вы это и без меня знаете. Я думаю у Вас завязка на структуру возврата связана с каким-то замороченным алгоритмом или чужим кодом.
Как и предполагалось, сделки не было. Ордер отправлен, его тикет есть. Но по какой цене он реально исполнится, еще не известно.
Хочешь трушный синхронный ордерсенд — запили его сам с помощью предложенного бесконечного цикла.
Так он и отправляет. Когда сам получит её. Но это уже к OrderSend() не имеет отношение.
Практический вывод - после OrderSend() результат быстрее всего можно получить в OnTrade(), ну или ждать по аналогии с проверочным кодом выше.
А на структуру возврата лучше основную логику алгоритма не завязывать.
Но Вы это и без меня знаете. Я думаю у Вас завязка на структуру возврата связана с каким-то замороченным алгоритмом или чужим кодом.
так вот и хотелось бы изменить это. зачем трейдеру все промежуточные шаги от отправки торгового приказа до приходя отчета об итогах сделки? - тем более если трейдер никак на это повлиять не может!))) для более детального ковыряния в процессах торговли есть специализированные функции OrderSendAsync() и типа OnTrade().
OrderSend () должен быть полностью синхронным, трейдер отправил приказ а назад получить отчет о результатах сделки и всех промежуточных шагов брокера, поставщика ликвидности и за что вообще захочет отчитываться брокер. Всё.
Хочешь трушный синхронный ордерсенд — запили его сам с помощью предложенного бесконечного цикла.
мы программисты - народ плечистый, запилено уже давно. но не правильно это, не по людски как то.
Хочешь трушный синхронный ордерсенд — запили его сам
Есть даже стресс-тест, который трушный синхронный OrderSend не пройдет.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)
fxsaber, 2021.05.05 02:04
Запустите этот код на пустом демо-счете и убедитесь в открытии двух позиций через несколько секунд.
Эта же логика на MT4 выглядит так.
Понятно, что такой код на MT4 не вызовет задвоения позиции. Но не на MT5.
Потому что в MT5 асинхронность повсюду:
Есть даже стресс-тест, который трушный синхронный OrderSend не пройдет.
Потому что в MT5 асинхронность повсюду:
вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.
так вот и хотелось бы изменить это. зачем трейдеру все промежуточные шаги от отправки торгового приказа до приходя отчета об итогах сделки? - тем более если трейдер никак на это повлиять не может!))) для более детального ковыряния в процессах торговли есть специализированные функции OrderSendAsync() и типа OnTrade().
OrderSend () должен быть полностью синхронным, трейдер отправил приказ а назад получить отчет о результатах сделки и всех промежуточных шагов брокера, поставщика ликвидности и за что вообще захочет отчитываться брокер. Всё.
наличие OrderSendSync() в дополнение к имеющимся OrderSend() и OrderSendAsync() упростило бы код в простых/односимвольных экспертах.
Но у меня голова уже "заточилась" под текущую/имеющуюся схему работы и она кажется мне вполне удобной.
OrderSend() точно переделывать не надо.
вот. так к чему в добавок к OrderSendAsync() ещё и НедоSendAsync ()?
подобное положение вещей порождает кучу проблем и торговых рисков там, где казалось бы проблем быть недолжно никогда и ни при каких обстоятельствах, если торговая логика чуть сложнее, чем торговля по MA.