Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, вы правы, т.к. в данном случае речь об идентификаторе позиции, постоянном в течение всей её жизни. Я спутал с тикетом позиции, который меняется при ролловерах и на неттинге.
вот только не понял - при частичном закрытии позиции - тикет не меняется чтоли на тикет последнего повлиявшего на позицию ордера?
Использование сделок тогда избыточно, пересмотрю свои коды, спасибо. Не зря на форум залез)
К вопросу о "потерянном ордере", которого нет ни в списке текущих ни в списке исторических: Мне кажется это никакой не баг, просто надо внимательно посмотреть на особенности работы
связки Терминал-Сервер МТ-Рынок (В случае инстант исполнения рынок отпадает). Я думаю так, смотрите - терминал отправляет рыночный ордер, в случае синхронной функции - ждёт и получает ответ от сервера,
если не ошибка, то ответом может быть только TRADE_RETCODE_DONE (в случае инстант еще реквоты, но пока про рыночный тип исполнения), который по сути означает что сервер отправил ордер дальше в рынок и сам
ждёт ответа. Состояние ордера в этот момент ORDER_STATE_STARTED если не ошибаюсь, и известен его тикет. Если ордер исполнился, то сервер присылает в терминал OnTradeTransaction и статус ордера меняется ORDER_STATE_FILLED и становится известна сделка
и позиция. Только в этот момент терминал ордер записывает в историю. Раньше он этого не делает, т.к. нет определенности что с ним стало, первичный ответ сервера он и так уже дал.
Вот это время пока ордера исполняются в ECN-сети или ещё где, их и нет ни в одном из двух списков. Т.е. в случае рыночного ордера он вообще только в истории появляется (не уверен насчёт случая реквот при инстант исполнении),
в списке открытых его и не будет никогда. А при отложке когда она срабатывает, то она удаляется из списка открытых, потому что она же уже стала рыночным ордером, и также ждет что ответит рынок-сервер, а потом записывается в историю.
Верно рассуждаю?
Верно рассуждаю?
Андрей хорошо расписал.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
OnTradeTransaction
Andrey Khatimlianskii, 2019.12.17 08:24
Нет, дела обстоят хуже.
Ордер в момент превращения из отложенного (или маркет) в исторический (исполненный или отмененный) на какое-то время пропадает из терминала вообще. Его нет ни среди отложенных (или "стартовавших" маркетов), ни среди исторических.
То есть дело не в исполнении, а в синхронизации этих двух таблиц. Ответ от сервера пришел ("ордер исполнен, породил сделку такую-то"), из одной таблицы он удаляется, а в другую не вносится.
Дело не в OrderSend. Стоял давно BuyLimit. И вдруг ни его, ни Buy-позиции нет нигде. Вот примерно подобная ситуация случается.
Андрей хорошо расписал.
Дело не в OrderSend. Стоял давно BuyLimit. И вдруг ни его, ни Buy-позиции нет нигде. Вот примерно подобная ситуация случается.
Не совсем.
Понял. Даже рыночный ордер какое то время присутствует в списке текущих (только он видимо в принципе не отображается в терминале на вкладке торговля?)
Тогда в момент когда ордер исполнен и приходит соответствующая транзакция от сервера, терминал выполняет следующие действия
1. удаляет ордер из текущих
2. записывает ордер в исторические
3. записывает сделку в список
4.записывает в список позицию
поскольку на эти действия требуется хоть и малое но какое-то время. и учитывая что советник и сам терминал работают в независимых параллельных потоках, то и происходит так, если в этот малый промежуток времени запросить
позицию, то её ещё не будет. Как я уже писал, если бы это происходило по стандартам СУБД, то такого бы не было, поскольку все 4 операции там были бы объединены в одну транзакцию, и нельзя было бы напороться на "промежуточные состояния".
Верно? А меня собственно интересует - если опираться на OnTrade and OnTradeTransaction, то в этих обработчиках ведь не должно быть лага, они ведь происходят по факту записи изменений в соответствующие таблицы?
Или Терминал просто по мере получения событий передаёт их эксперту и параллельно изменяет таблицы? В последнем случае это конечно неправильно и требует исправления, тем более если OnTradeTransaction, из которой бы можно было получать актуальную информацию, не гарантирована.
Понял. Даже рыночный ордер какое то время присутствует в списке текущих (только он видимо в принципе не отображается в терминале на вкладке торговля?)
Иногда можно даже глазами его там увидеть в состоянии Стартед. А с помощью робота отследить вообще легко.
поскольку на эти действия требуется хоть и малое но какое-то время. и учитывая что советник и сам терминал работают в независимых параллельных потоках, то и происходит так, если в этот малый промежуток времени запросить позицию, то её ещё не будет.
О позиции речи не идет, только об ордерах.
Времени на добавление записи в таблицу нужно сильно меньше, чем иногда получается. Да и не серьезно это, нет ни каких гарантий получения правильного торгового окружения.
А меня собственно интересует - если опираться на OnTrade and OnTradeTransaction, то в этих обработчиках ведь не должно быть лага, они ведь происходят по факту записи изменений в соответствующие таблицы?
Или Терминал просто по мере получения событий передаёт их эксперту и параллельно изменяет таблицы? В последнем случае это конечно неправильно и требует исправления, тем более если OnTradeTransaction, из которой бы можно было получать актуальную информацию, не гарантирована.
ОнТрейд в чистом виде не поможет.
Можно комбинировать ожидание синхронизации таблиц ордеров и в нем, дело вкуса. Но ждать все равно нужно.
К вопросу о "потерянном ордере", которого нет ни в списке текущих ни в списке исторических: Мне кажется это никакой не баг, просто надо внимательно посмотреть на особенности работы связки Терминал-Сервер МТ-Рынок (В случае инстант исполнения рынок отпадает). Я думаю так, смотрите - терминал отправляет рыночный ордер, в случае синхронной функции - ждёт и получает ответ от сервера, если не ошибка, то ответом может быть только TRADE_RETCODE_DONE (в случае инстант еще реквоты, но пока про рыночный тип исполнения), который по сути означает что сервер отправил ордер дальше в рынок и сам ждёт ответа. Состояние ордера в этот момент ORDER_STATE_STARTED если не ошибаюсь, и известен его тикет. Если ордер исполнился, то сервер присылает в терминал OnTradeTransaction и статус ордера меняется ORDER_STATE_FILLED и становится известна сделка и позиция. Только в этот момент терминал ордер записывает в историю.
Рынок здесь не при чем.
МТ-сервер отправил ордер на ECN или еще куда-то, получил ответ, отправил его в терминал. А уже в терминале получается рассинхрон.