OrderSendAsync не возвращает номер тикета (OnTradeTransaction - ловля блох или асинхронных хаос? ) - страница 5

 
prostotrader:

:)

А если отложенный ордер и исполнился не полным объемом?

Михаил, (кажется так Вас зовут) если исполнился отложенный ордер, то в OnTradeTransaction() будет тип транзакции TRADE_TRANSACTION_DEAL_ADD и всё то-же самое. Позиция выбирается, проверяется объём и если не полностью исполнен, то при поступлении TRADE_TRANSACTION_REQUEST получаем retcode и принимаем решение.

Я так понимаю, это был небольшой экзамен. Уверяю вас, при острой необходимости я справлюсь.

Вы в этой теме не участвовали?

Вопрос о функции OnTradeTransaction
Вопрос о функции OnTradeTransaction
  • 2015.02.05
  • www.mql5.com
Вот и вытекает вопрос: А для чего тогда нужна эта функция обработки события?
 
prostotrader:

Причем тут позиция, если вообще нет никаких данных об ордере!

Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),

при этом нет не тикета не реквест айди ордера.

Я говорил о позициях.

   bool              PositionOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                                  const double price,const double sl,const double tp,const string comment="");
 
Alexey Viktorov:


Я с Вами вообще не вел диалога и не обращался к Вам.

Как работает OnTradeTransaction у меня есть четкое представление.

Почему-то все забывают, что приложения Клиент-Сервер имеют слабое звено.

И не важно OrderSend или OrderSendAsync мы отсылаем, ответ сервера не гарантирован из-за слабого звена.

Другой вопрос

Как контролировать отправленный ордер, если нет ответа сервера.

100% работающее решение этой проблемы я описывал.

https://www.mql5.com/ru/blogs/post/557544

Сейчас, этот механизм доработан и оптимизирован.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
prostotrader:

Я с Вами вообще не вел диалога и не обращался к Вам.

А тут вы разве не моё сообщение цитировали?

И в диалоге с Артёмом не обо мне?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderSendAsync не возвращает номер тикета (OnTradeTransaction - ловля блох или асинхронных хаос? )

prostotrader, 2020.03.20 21:44

Причем тут позиция, если вообще нет никаких данных об ордере!

Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),

при этом нет не тикета не реквест айди ордера.


 
Alexey Viktorov:

А тут вы разве не моё сообщение цитировали?


И в диалоге с Артёмом не обо мне?


Нет, не Вам

 
Alexey Viktorov:

А, простите, на кой дьявол вам requestID если в trans.type == TRADE_TRANSACTION_DEAL_ADD есть trans.position по которому можно проверить

Если true значит requestID 10009 и другого быть не может. В противном случае получим в trans.type ==TRADE_TRANSACTION_REQUEST requestID и будем принимать решение.

Для отложенных ордеров решение другое.

Ну, если вы так бьётесь за пару миллисекунд, то я умолкаю...

Ещё обратите внимание на статьи Артёма Тришкина. У него есть решение лучше, но сложное для моего возраста.

Алексей, мне приходит на ум старый анекдот, перефразировав который могу сказать, вы не читатель, вы - писатель... Я уже раз 10 написал, что на запрос OrderSendAsync вернет вам гарантировано ТОЛЬКО requestID и нет у вас тикета, и в этом случае все, что вам останется - ждать TRADE_TRANSACTION_REQUEST. Хорошо если в 10-20% случаев вам вернется тикет, но это просто везение и не более того.

И для справки, OrderSendAsync вернет вам только 10008. Все остальное ловить должны уже сами.

 
Vladimir Belozercev:

Алексей, мне приходит на ум старый анекдот, перефразировав который могу сказать, вы не читатель, вы - писатель... Я уже раз 10 написал, что на запрос OrderSendAsync вернет вам гарантировано ТОЛЬКО requestID и нет у вас тикета, и в этом случае все, что вам останется - ждать TRADE_TRANSACTION_REQUEST. Хорошо если в 10-20% случаев вам вернется тикет, но это просто везение и не более того.

И для справки, OrderSendAsync вернет вам только 10008. Все остальное ловить должны уже сами.

Уточните пожалуйста вы ставите отложенный ордер или позицию по маркету?

 
prostotrader:

Вы просто не умеете пользоваться описанными Вами функциями.

Здесь https://www.mql5.com/ru/forum/38456/page136#comment_15425184 (прикрепленные файлы)

рабочий код. Там все предельно ясно.

Откройте демо счет ФОРТС (фьючерсы) в Открытии или БКС и посмотрите, как нужно пользоваться функциями.

Добавлено

Если ничего не приходит в OnTradeTransaction (в коде этого нет)

То включается механизм проверки что случилось с ордером.

Если есть ордер, то ищем по ордеру, если нет ордера, то ищем по уникальному magic. 

Принцип - каждому ордеру присваивается уникальный magic, по которому 

идет проверка что произошло с ордером (в коде есть "ошметки" как это делается mem_time - для проверки интервала времени, mem_start_time - для поиска ордера в узком отрезке времени,

magic_storage - для хранения текущего magic). Automagic.mqh позволяет генерить уникальный начальный magic для символа и советника,

позволяющий хранить 254 magic

Михаил, во-первых, спасибо за код, во-вторых, Вы немного торопитесь с выводами... Ваш код код требует определенной детерминированности (парадигма, что в текущем потоке может быть только поток по одной сделке, терминированной типом TRADE_TRANSACTION_REQUEST). При большом рейте выставления сделок он будет "захлебываться" и терять моменты "фиксации" сделок, хотя опять же, он написан под определенный рынок. На Фьючерсах, думаю, он будет работать без проблем. Прекрасный пример принципа "Необходимо и достаточно", но когда за секунду генерится до 100-ни сделок - он точно не подойдет.

Но как я уже писал ранее, тут вопрос не в невозможности обработки (полноценный связанный список с объектами транзакций вполне решит проблему), а в ущербности асинхронного режима.

 
Alexey Viktorov:

Уточните пожалуйста вы ставите отложенный ордер или позицию по маркету?

Позицию.
 
Vladimir Belozercev:
Позицию.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderSendAsync не возвращает номер тикета (OnTradeTransaction - ловля блох или асинхронных хаос? )

Alexey Viktorov, 2020.03.20 19:04

А, простите, на кой дьявол вам requestID если в trans.type == TRADE_TRANSACTION_DEAL_ADD есть trans.position по которому можно проверить

if(PositionSelectByTicket(trans.position) && trans.volume == заданному) 

Если true значит requestID 10009 и другого быть не может. В противном случае получим в trans.type ==TRADE_TRANSACTION_REQUEST requestID и будем принимать решение.

Для отложенных ордеров решение другое.

Ну, если вы так бьётесь за пару миллисекунд, то я умолкаю...

Ещё обратите внимание на статьи Артёма Тришкина. У него есть решение лучше, но сложное для моего возраста.