OnTradeTransaction - страница 9

 
Aleksey Mavrin:

Да, вы правы, т.к. в данном случае речь об идентификаторе позиции, постоянном в течение всей её жизни. Я спутал с тикетом позиции, который меняется при ролловерах и на неттинге.

вот только не понял - при частичном закрытии позиции - тикет не меняется чтоли на тикет последнего повлиявшего на позицию ордера?

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

К вопросу о "потерянном ордере", которого нет ни в списке текущих ни в списке исторических: Мне кажется это никакой не баг, просто надо внимательно посмотреть на особенности работы

связки Терминал-Сервер МТ-Рынок (В случае инстант исполнения рынок отпадает). Я думаю так, смотрите - терминал отправляет рыночный ордер, в случае синхронной функции  - ждёт и получает ответ от сервера,

если не ошибка, то ответом может быть только TRADE_RETCODE_DONE (в случае инстант еще реквоты, но пока про рыночный тип исполнения), который по сути означает что сервер отправил ордер дальше в рынок и сам

ждёт ответа. Состояние ордера в этот момент ORDER_STATE_STARTED если не ошибаюсь, и известен его тикет. Если ордер исполнился, то сервер присылает в терминал OnTradeTransaction и статус ордера меняется ORDER_STATE_FILLED и становится известна сделка

и позиция. Только в этот момент терминал ордер записывает в историю. Раньше он этого не делает, т.к. нет определенности что с ним стало, первичный ответ сервера он и так уже дал.

Вот это время пока ордера исполняются в ECN-сети или ещё где, их и нет ни в одном из двух списков. Т.е. в случае рыночного ордера он вообще только в истории появляется (не уверен насчёт случая реквот при инстант исполнении), 

в списке открытых его и не будет никогда. А при отложке когда она срабатывает, то она удаляется из списка открытых, потому что она же уже стала рыночным ордером, и также ждет что ответит рынок-сервер, а потом записывается в историю.

Верно рассуждаю?

Не совсем.
 
Aleksey Mavrin:

Верно рассуждаю?

Андрей хорошо расписал.

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

OnTradeTransaction

Andrey Khatimlianskii, 2019.12.17 08:24

Нет, дела обстоят хуже.

Ордер в момент превращения из отложенного (или маркет) в исторический (исполненный или отмененный) на какое-то время пропадает из терминала вообще. Его нет ни среди отложенных (или "стартовавших" маркетов), ни среди исторических.

То есть дело не в исполнении, а в синхронизации этих двух таблиц. Ответ от сервера пришел ("ордер исполнен, породил сделку такую-то"), из одной таблицы он удаляется, а в другую не вносится.


Дело не в OrderSend. Стоял давно BuyLimit. И вдруг ни его, ни Buy-позиции нет нигде. Вот примерно подобная ситуация случается.

 
fxsaber:

Андрей хорошо расписал.


Дело не в OrderSend. Стоял давно BuyLimit. И вдруг ни его, ни Buy-позиции нет нигде. Вот примерно подобная ситуация случается.


Artyom Trishkin:
Не совсем.

Понял. Даже рыночный ордер какое то время присутствует в списке текущих (только он видимо в принципе не отображается в терминале на вкладке торговля?)

Тогда в момент когда ордер исполнен и приходит соответствующая транзакция от сервера, терминал выполняет следующие действия

1. удаляет ордер из текущих

2. записывает ордер в исторические

3. записывает сделку в список

4.записывает в список позицию

поскольку на эти действия требуется хоть и малое но какое-то время. и учитывая что советник и сам терминал работают в независимых параллельных потоках, то и происходит так, если в этот малый промежуток времени запросить

позицию, то её ещё не будет. Как я уже писал, если бы это происходило по стандартам  СУБД, то такого бы не было, поскольку все 4 операции там были бы объединены в одну транзакцию, и нельзя было бы напороться на "промежуточные состояния".

Верно? А меня собственно интересует - если опираться на OnTrade and OnTradeTransaction, то в этих обработчиках ведь не должно быть лага, они ведь происходят по факту записи изменений в соответствующие таблицы?

Или Терминал просто по мере получения событий передаёт их эксперту и параллельно изменяет таблицы? В последнем случае это конечно неправильно и требует исправления, тем более если OnTradeTransaction, из которой бы можно было получать актуальную информацию, не гарантирована.

 
Aleksey Mavrin:

Понял. Даже рыночный ордер какое то время присутствует в списке текущих (только он видимо в принципе не отображается в терминале на вкладке торговля?)

Иногда можно даже глазами его там увидеть в состоянии Стартед. А с помощью робота отследить вообще легко.


Aleksey Mavrin:

поскольку на эти действия требуется хоть и малое но какое-то время. и учитывая что советник и сам терминал работают в независимых параллельных потоках, то и происходит так, если в этот малый промежуток времени запросить позицию, то её ещё не будет.

О позиции речи не идет, только об ордерах.

Времени на добавление записи в таблицу нужно сильно меньше, чем иногда получается. Да и не серьезно это, нет ни каких гарантий получения правильного торгового окружения.


Aleksey Mavrin:

А меня собственно интересует - если опираться на OnTrade and OnTradeTransaction, то в этих обработчиках ведь не должно быть лага, они ведь происходят по факту записи изменений в соответствующие таблицы?

Или Терминал просто по мере получения событий передаёт их эксперту и параллельно изменяет таблицы? В последнем случае это конечно неправильно и требует исправления, тем более если OnTradeTransaction, из которой бы можно было получать актуальную информацию, не гарантирована.

ОнТрейд в чистом виде не поможет.

Можно комбинировать ожидание синхронизации таблиц ордеров и в нем, дело вкуса. Но ждать все равно нужно.

 
Aleksey Mavrin:

К вопросу о "потерянном ордере", которого нет ни в списке текущих ни в списке исторических: Мне кажется это никакой не баг, просто надо внимательно посмотреть на особенности работы связки Терминал-Сервер МТ-Рынок (В случае инстант исполнения рынок отпадает). Я думаю так, смотрите - терминал отправляет рыночный ордер, в случае синхронной функции  - ждёт и получает ответ от сервера, если не ошибка, то ответом может быть только TRADE_RETCODE_DONE (в случае инстант еще реквоты, но пока про рыночный тип исполнения), который по сути означает что сервер отправил ордер дальше в рынок и сам ждёт ответа. Состояние ордера в этот момент  ORDER_STATE_STARTED если не ошибаюсь, и известен его тикет. Если ордер исполнился, то сервер присылает в терминал OnTradeTransaction и статус ордера меняется ORDER_STATE_FILLED и становится известна сделка и позиция. Только в этот момент терминал ордер записывает в историю.

Рынок здесь не при чем.

МТ-сервер отправил ордер на ECN или еще куда-то, получил ответ, отправил его в терминал. А уже в терминале получается рассинхрон.