От выставления заявки до её исполнения. Правильное отслеживание заявок. - страница 2

 
JRandomTrader #:

Если отправлять асинхронно, то тикета нет. Только ловить по request_id. А если вдруг пропустил эту транзакцию, то однозначной привязки отправленного запроса к ордеру просто нет.

При этом всё ещё хуже, TRADE_TRANSACTION_ORDER_ADD может придти (и обычно приходит) раньше, чем TRADE_TRANSACTION_REQUEST с request_id. В итоге получаем новый ордер, но пока не знаем, куда его приписать.

TRADE_TRANSACTION_ORDER_ADD обязательно придёт раньше чем TRADE_TRANSACTION_REQUEST. Но не обязательно этот ордер будет исполнен, теоретически. 

 
Alexey Viktorov #:

TRADE_TRANSACTION_ORDER_ADD обязательно придёт раньше чем TRADE_TRANSACTION_REQUEST. Но не обязательно этот ордер будет исполнен, теоретически. 

И в TRADE_TRANSACTION_ORDER_ADD впервые появляется тикет ордера. Но не появляется request_id.

 
vbymrf:

Попробуйте подобную идею.

TradeTransactions
TradeTransactions
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 
Alexey Viktorov #:

Ну так тикет ордера и магик по любому есть… А если заморочиться покруче, то можно использовать 

request_id

Идентификатор запроса, проставляемый терминалом при отсылке на торговый сервер

Смотря где. В том то и дело.  Что структуры не заполняются полностью. В TRADE_TRANSACTION_REQUEST есть магик. Потому что заполняется request. А вот во всех ордерах, сделках и позициях (ORDER_ADD и т.д) request не заполняется. Либо либо. 

Для всех. Кто будет писать алгоритмы. Исполнение отложенных ордеров смотрите в TRADE_TRANSACTION_REQUEST, а исполнение сделок в TRADE_ACTION_DEAL И никак иначе! Отследить можно по ордеру, забрать можно с OrderSend структуры. Или можно использовать комментарии. Т.е. сами их записывать и их же читать. Создав список своих вызовов. 

Что делать с обновлениями (UPDATE) сделок - не знаю. Так природа их появления в принципе не ясна. На демо вижу их. Там ничего нового нет.  Но на демо даже дублируются  TRADE_ACTION_DEAL иногда! Засада на засаде.

 
vbymrf:

В момент успешного вызова OrderSend() мы имеем выставленную заявку. Еще нет ни ордера, ни его исполнения, ничего. В этот момент можно повторно вызвать функцию, без необходимости в этом. Мы же работаем в цикле, может и 30 раз за секунду!

Результат понятен - и это плохо. Нет нигде в мета трейдере возможности проверить, был ли подобный вызов на тике? Т.е. мгновенно. Потому что все работает слишком быстро и эта мгновенность ломает мозг. 

На брокере Открытие работает мой робот нормально. На Финаме в какой то момент дублируются две рыночные заявки. Хорошо хоть события частые. Что удалось их отследить. А если нет? Что оказалось:

В момент между TRADE_TRANSACTION_REQUEST где приходит retcode = 10009 и TRADE_TRANSACTION_DEAL_ADD вклинивается исполнение нового тика где и происходит повторный вызов. Сделки то еще нет! Но мое слежение говорит. Что ответ - исполнено. Я бы лучше смотрел на  TRADE_TRANSACTION_DEAL_ADD. Но заполнение структур то разное. И там нет того, что мне нужно. Почему нет нормального подхода к отслеживанию заявок? Потому что держать логику на OnTick() нельзя. Но увидеть нужно. Проблему то решаема. Но она должна описана быть на первом месте во всех инструкциях.

Как вы отслеживаете заявки, ордера, сделки, позиции?

Для одного робота все нормально, проблема решена. Он знает, что он делает. Но он не знает. Что делает его брат. И мое решение не надежное. Мне нужно видеть не  TRADE_TRANSACTION_DEAL_ADD или что либо другое. А сам вызов OrderSend() . Они же могут совершить два вызова  OrderSend(). И делают они это настолько быстро, что я даже примерно не вижу решения.

Каждый ордер имеет свой тикет.

Если Вы посылаете асинхронные ордера, то нужно генерить свой маджик, привязанный к инструменту + какой-либо признак советника.

например, как это

https://www.mql5.com/ru/code/17523

Это тоже полезно прочитать

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

AutoMagic
AutoMagic
  • www.mql5.com
Библиотека позволяет автоматически присваивать magic советнику на любом символе и любом таймфрейме. Позволяет иметь в одном советнике одновременно 65535 magic(ов).