Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Если отправлять асинхронно, то тикета нет. Только ловить по request_id. А если вдруг пропустил эту транзакцию, то однозначной привязки отправленного запроса к ордеру просто нет.
При этом всё ещё хуже, TRADE_TRANSACTION_ORDER_ADD может придти (и обычно приходит) раньше, чем TRADE_TRANSACTION_REQUEST с request_id. В итоге получаем новый ордер, но пока не знаем, куда его приписать.
TRADE_TRANSACTION_ORDER_ADD обязательно придёт раньше чем TRADE_TRANSACTION_REQUEST. Но не обязательно этот ордер будет исполнен, теоретически.
TRADE_TRANSACTION_ORDER_ADD обязательно придёт раньше чем TRADE_TRANSACTION_REQUEST. Но не обязательно этот ордер будет исполнен, теоретически.
И в TRADE_TRANSACTION_ORDER_ADD впервые появляется тикет ордера. Но не появляется request_id.
Попробуйте подобную идею.
Ну так тикет ордера и магик по любому есть… А если заморочиться покруче, то можно использовать
request_id
Идентификатор запроса, проставляемый терминалом при отсылке на торговый сервер
Смотря где. В том то и дело. Что структуры не заполняются полностью. В TRADE_TRANSACTION_REQUEST есть магик. Потому что заполняется request. А вот во всех ордерах, сделках и позициях (ORDER_ADD и т.д) request не заполняется. Либо либо.
Для всех. Кто будет писать алгоритмы. Исполнение отложенных ордеров смотрите в TRADE_TRANSACTION_REQUEST, а исполнение сделок в TRADE_ACTION_DEAL И никак иначе! Отследить можно по ордеру, забрать можно с OrderSend структуры. Или можно использовать комментарии. Т.е. сами их записывать и их же читать. Создав список своих вызовов.
Что делать с обновлениями (UPDATE) сделок - не знаю. Так природа их появления в принципе не ясна. На демо вижу их. Там ничего нового нет. Но на демо даже дублируются TRADE_ACTION_DEAL иногда! Засада на засаде.
В момент успешного вызова 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