OrderSendAsync не возвращает номер тикета (OnTradeTransaction - ловля блох или асинхронных хаос? ) - страница 2
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Алексей, спасибо за Ваш комментарий. Я понял Вашу мысль, но увы, это не тот случай...
Это чистый эксперимент без каких бы то ни было инфлюэнций. Отправка одной позиции - ловля транзакций (лог приложил, если любопытно - можете взглянуть). И поверьте, в этой теме я давно, и даже используя OrderSend я завершение операции "выставляю" ТОЛЬКО по транзакции. Я бы наверно и продолжал не нем "сидеть", если бы не "поведенческие" изменения в демо-сервере MetaQuotes, которые я описал выше. И, отчасти, я даже благодарен этому обстоятельству, потому что это позволило выявить слабые места в обработке, но к сожалению, из доступных методов, нормального решения и получается, поэтому и появился этот тред.
Вопрос ведь не в том, что в OnTradeTransactionпридут не все транзакции. При правильной обработке, не нарушая поточности обработки, вы получите их ВСЕ, но... Вопрос в том, что при работе с OrderSendAsync, из идентификационных параметров вы гарантировано получаете только result.request_id. При этом result.request_id в транзакции фигурирует только в типе TRADE_TRANSACTION_REQUEST, который вам придет ОДИН раз.
Все остальные транзакции по этому приказу вы сможете идентифицировать только по номеру тикета. При этом, если ТОРГОВЫЕ ТРАНЗАКЦИИ прошли раньше, чем ТРАНЗАКЦИЯ ЗАПРОСА, то их идентификация превращается в весьма витиеватое занятие.
Ну я не знаю чего можно не получить из
Вот результат
В этом случае только одна проблема. Для ловли закрытия позиции надо ловить их по TRADE_TRANSACTION_DEAL_ADD, по TRADE_TRANSACTION_REQUEST этого не отловить.
Использую только OrderSendAsync при реальной торговле на МОЕХ. Причина - различное время исполнения заявок от нескольких миллисекунд до десятков секунд.
То, что OrderSendAsync исполняет заявки быстрее - распространенное заблуждение. Обе функции OrderSend и OrderSendAsync строго равны по производительности, но...
конкретно на moex есть такая проблема, ответ может доходить несколько десятков секунд, хотя сделка по факту уже открыта. И тогда разорвать цепочку Запрос - ответ, с помощью OrderSendAsync становится полезным. Это я к тому, что по сути OrderSendAsync многими используется как хак и как способ обойти этот глюк, хотя правильное решение должно быть на совести разработчиков серверной части МetaTrader 5 для Moex.
Владимир, большое спасибо за развернутый ответ! Но, к Вашему счастью и к моему сожалению, у Вас ситуация немного проще. У Вас все приказы "обезличены", т.е. выполнены по принципу - "выстрелил-и забыл".
У меня немного другой случай. Мне каждый приказ нужно привязать к "источнику" сигнала, для последующего управления, при этом, если ТОРГОВЫЕ ТРАНЗАКЦИИ прошли раньше, чем ТРАНЗАКЦИЯ ЗАПРОСА, то их идентификация, без предварительной буферизации всех полученных, невозможна. А с буферизацией почти все преимущества использования OrderSendAsync теряются из-за появления больших вычислительных расходов.
Привязать запрос и сделку к источнику сигнал не проблема.
Отслеживание открытия, закрытия и изменения позиций без хранения временных параметров этих позиций весьма проблематично, как например через историю ордеров и сделок.
Гораздо проще все необходимые параметры хранить в отдельной структуре.
То, что OrderSendAsync исполняет заявки быстрее - распространенное заблуждение. Обе функции OrderSend и OrderSendAsync строго равны по производительности, но...
конкретно на moex есть такая проблема, ответ может доходить несколько десятков секунд, хотя сделка по факту уже открыта. И тогда разорвать цепочку Запрос - ответ, с помощью OrderSendAsync становится полезным. Это я к тому, что по сути OrderSendAsync многими используется как хак и как способ обойти этот глюк, хотя правильное решение должно быть на совести разработчиков серверной части МetaTrader 5 для Moex.
Дело не в том, какой метод быстрее выполняет заявки, а в том что OrderSend ожидает ответа от сервера, что совсем не нужно в моих торговых алгоритмах.
Ну я не знаю чего можно не получить из
Вот результат
В этом случае только одна проблема. Для ловли закрытия позиции надо ловить их по TRADE_TRANSACTION_DEAL_ADD, по TRADE_TRANSACTION_REQUEST этого не отловить.
Алексей, к сожалению Вы не прочли внимательно мой ответ и пост в целом... Посмотрите хронологию событий:
2020.03.17 20:42:10 (Srv 15:42:10) ;------------Request :
Request: TRADE_ACTION_DEAL
Order ticket: 547197733
2020.03.17 20:42:10 (Srv 2020.03.17 15:42:10) ;------------Result :
TradeResult 10009 Desc=Заявка выполнена
Request ID: 2
Order ticket: 547197733
Deal ticket: 524982252
OrderSendAsync в результирующей структуре не вернул тикет. Из хронологии транзакций видно, что ключевой элемент для идентификации транзакций торгового исполнения (первые 4-ре) появился после того, как они произошли, в самом конце, в TRADE_TRANSACTION_REQUEST.
Привязать запрос и сделку к источнику сигнал не проблема.
Отслеживание открытия, закрытия и изменения позиций без хранения временных параметров этих позиций весьма проблематично, как например через историю ордеров и сделок.
Гораздо проще все необходимые параметры хранить в отдельной структуре.
Да хранение - не проблема. Это все есть. Проблема как раз в привязке (см. временную диаграмму выше).
То, что OrderSendAsync исполняет заявки быстрее - распространенное заблуждение. Обе функции OrderSend и OrderSendAsync строго равны по производительности, но...
конкретно на moex есть такая проблема, ответ может доходить несколько десятков секунд, хотя сделка по факту уже открыта. И тогда разорвать цепочку Запрос - ответ, с помощью OrderSendAsync становится полезным. Это я к тому, что по сути OrderSendAsync многими используется как хак и как способ обойти этот глюк, хотя правильное решение должно быть на совести разработчиков серверной части МetaTrader 5 для Moex.
Безусловно, с большинством недостатков OrderSend можно мириться, но я столкнулся с тем, что функция переставала отвечать более МИНУТЫ (подтверждается логированием исполнения: GetTickCount до и после), без видимых на то причин !
Вот с этим "бонусом" я мириться уже не мог... И вот я тут.
Безусловно, с большинством недостатков OrderSend можно мириться, но я столкнулся с тем, что функция переставала отвечать более МИНУТЫ (подтверждается логированием исполнения: GetTickCount до и после), без видимых на то причин !
Вот с этим "бонусом" я мириться уже не мог... И вот я тут.
Вы не первый. Почитайте посты Михаила. Он много об этом писал здесь несколько лет назад. Ему вроде попробовали отвечать разрабы, но поезд и ныне там. И он кстати тоже использует асинхронную отправку заявок.
Не испытывал совсем проблем с OrderSend. Возможно, по причине отсутствия MOEX.
Но если бы нужен был OrderSendAsync, то не использовал бы OnTradeTransaction, а воспользовался бы подобным решением.
Ну я не понимаю в чём трудности.
Вот код советника
И вот результат выполнения на счёте Netting.
Никаких трудностей с получением тикета позиции не вижу.