Изменение Order.Balance после того, как заявка получила OrderStates == Done

Изменение Order.Balance после того, как заявка получила OrderStates == Done
Atom
24.01.2011
Maxim


Михаил, добрый день. Обращаюсь по привычке к Вам, так как не в курсе, поддерживает ли S# еще кто либо. Если я ошибаюсь, поправьте меня.

Михаил, прошу помочь разобраться в следующем. Ситуация:

  1. Проверяю состояние заявки.
  2. Если состояние заявки Active, отменяю асинхронно заявку.
  3. Дожидаюсь события OrdersChanged, когда заявка станет Done.
  4. Проверяю Balance, он равен Volume.
  5. Проверяю в Квике состояние заявки, заявка оказывается полностью удовлетворена. То-есть Balance должен был быть равен нулю в пункте 4.

Если между пунктом 3 и 4 сделать пауза в 1 секунду, то Balance будет равен нулю.

Из этого я могу предположить, что Balance может изменится после того, как заявка приобрела статус Done. Хотя в мануале написано: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»

Так ли это? Сталкивались ли Вы с этим?


Теги:


Спасибо:


<< < 2 3 4 5  >
Mikhail Sukhov

Фотография
Дата: 26.04.2011
Ответить


Ок, по данным все ок. По выводу в сообщении тоже все нормально. Я пропустил проблему? Если да, куда смотреть?

Спасибо:

Maxim

Фотография
Дата: 26.04.2011
Ответить


Я выше писал. Но наверно нить диалога потерялась и запуталась. Напишу суть еще разок.

Глобальная проблема Глобальная проблема заключается в том, что при покупке моя программа покупает или продает больше лотов, чем это необходимо. Делает это она не всегда. На глаз могу сказать, что одна заявка из пяти выполняется некорректно. Причина этого — заявка получила статус Done, программа учла сколько было реализовано в заявке бумаг, а после этого пришли дополнительные сделки. То есть, косяк в том, что заявка изменяется после того, как она получила статус Done. В частности это можно наблюдать в логах OrdersChanged, которые я приводил в этом комментарии: http://stocksharp.com/posts/m/7659/ Собрать полноценный лог (с данными по DDE) по этой ошибке в рабочем Квике пока не получается. Над этим работаю.

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

В процессе анализа проблемы на тестовом Квике я заметил две ошибки, которые возможно связаны с глобальной проблемой. И решив эти ошибки решится и глобальная. А может и нет.

Промежуточная ошибка номер Раз — неверное время Order.Time «0001-01-01 00:00:00.0000000» В экселе «44300176 and 44300177.xls» можно посмотреть данные по заявке 44300177. В первой записи , в которой Order.State поменялся на Done, Order.Time равно «0001-01-01 00:00:00.0000000».

2011-04-26 12:20:33.4339766	OrdersChanged    TransactionId: 44300177 Balance: 0 Volume: 39 State: Done CancelTime:  Status: Accepted

В файлике свойства Order.Time не видно. Но это точно так, потому что как только заявка становится Done, она у меня логируется в SQL. И в SQL Order.Time для этой заявки равно «0001-01-01 00:00:00.0000000».

Позже я исправил это упущение и в коде, который я привел раньше, Order.Time логируется в Debug. Но, к сожалению, на момент создания эксель файликов этого изменения еще не было.

Итак, основная мысль, что на момент, когда заявка становится Done время заявки Order.Time некорректно. Эта же ошибка уже встречалась здесь: http://stocksharp.com/forum/878/Order-Time-vozvrashchaiet-00-00-00-0001-ghoda/

Заявка 44300176 в экселике имеет корректное свойство Order.Time. Сравнивая DDE данные для заявок 44300177 и 44300176 я обнаружил, что перед первым событием OrdersChanged когда статус становиться равным Done для заявки 44300176 данные по DDE пришли, а для 44300177 нет. То есть заявка 44300177 произвольно поменяла значение статуса на Done. Это мои предположения, возможно они не верны.

Элемент данных DDE для 44300177, когда статус стал Done, а соответствующих данных DDE нет:


2011-04-26 12:20:33.3871010	PreProcessDdeData   String: мои сделки
2011-04-26 12:20:33.3871010	PreProcessDdeData   Row: 0
2011-04-26 12:20:33.3871010	PreProcessDdeData              Column: 0 Object: 127278
2011-04-26 12:20:33.3871010	PreProcessDdeData              Column: 1 Object: 12:20:33
2011-04-26 12:20:33.3871010	PreProcessDdeData              Column: 2 Object: SBER03
2011-04-26 12:20:33.3871010	PreProcessDdeData              Column: 3 Object: EQBR
2011-04-26 12:20:33.4027262	PreProcessDdeData              Column: 4 Object: 102.19
2011-04-26 12:20:33.4027262	PreProcessDdeData              Column: 5 Object: 39
2011-04-26 12:20:33.4027262	PreProcessDdeData              Column: 6 Object: 259356
2011-04-26 12:20:33.4027262	PreProcessDdeData              Column: 7 Object: 26.04.2011
2011-04-26 12:20:33.4027262	PreProcessDdeData              Column: 8 Object: BUY
2011-04-26 12:20:33.4183514	PreProcessDdeData   String: все сделки
2011-04-26 12:20:33.4183514	PreProcessDdeData   Row: 0
2011-04-26 12:20:33.4183514	PreProcessDdeData              Column: 0 Object: 127273
2011-04-26 12:20:33.4183514	PreProcessDdeData              Column: 1 Object: 12:20:32
2011-04-26 12:20:33.4183514	PreProcessDdeData              Column: 2 Object: SBER03
2011-04-26 12:20:33.4339766	PreProcessDdeData              Column: 3 Object: EQBR
2011-04-26 12:20:33.4339766	PreProcessDdeData              Column: 4 Object: 102.19
2011-04-26 12:20:33.4339766	OrdersChanged    TransactionId: 44300177 Balance: 0 Volume: 39 State: Done CancelTime:  Status: Accepted

Элемент данных DDE для 44300176, когда статус стал Done, но соответствующие данные DDE есть:


2011-04-26 12:20:32.2777118	PreProcessDdeData   String: заявки
2011-04-26 12:20:32.2777118	PreProcessDdeData   Row: 0
2011-04-26 12:20:32.2933370	PreProcessDdeData              Column: 0 Object: 259271
2011-04-26 12:20:32.2933370	PreProcessDdeData              Column: 1 Object: SBER03
2011-04-26 12:20:32.3089622	PreProcessDdeData              Column: 2 Object: EQBR
2011-04-26 12:20:32.3089622	PreProcessDdeData              Column: 3 Object: 102.22
2011-04-26 12:20:32.3089622	PreProcessDdeData              Column: 4 Object: 39
2011-04-26 12:20:32.3245874	PreProcessDdeData              Column: 5 Object: 0
2011-04-26 12:20:32.3245874	PreProcessDdeData              Column: 6 Object: B
2011-04-26 12:20:32.3402126	PreProcessDdeData              Column: 7 Object: FILLED
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 8 Object: 12:20:31
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 9 Object: 
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 10 Object: L01-00000F00
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 11 Object: LSW
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 12 Object: 6014//S#
2011-04-26 12:20:32.3558378	PreProcessDdeData              Column: 13 Object: 44300176
2011-04-26 12:20:32.3714630	PreProcessDdeData              Column: 14 Object: 26.04.2011
2011-04-26 12:20:32.3714630	PreProcessDdeData              Column: 15 Object: 6014
2011-04-26 12:20:32.3714630	PreProcessDdeData   String: [стакан]SBER03-EQBR
2011-04-26 12:20:32.3714630	PreProcessDdeData   Row: 0
2011-04-26 12:20:32.3870882	PreProcessDdeData              Column: 0 Object: 0
2011-04-26 12:20:32.3870882	PreProcessDdeData              Column: 1 Object: 101.66
2011-04-26 12:20:32.3870882	PreProcessDdeData              Column: 2 Object: 40
2011-04-26 12:20:32.3870882	PreProcessDdeData   Row: 1
2011-04-26 12:20:32.3870882	PreProcessDdeData              Column: 0 Object: 0
2011-04-26 12:20:32.3870882	PreProcessDdeData              Column: 1 Object: 102.03
2011-04-26 12:20:32.4027134	PreProcessDdeData              Column: 2 Object: 94
2011-04-26 12:20:32.4027134	OrdersChanged    TransactionId: 44300176 Balance: 0 Volume: 39 State: Done CancelTime:  Status: Accepted

Промежуточная ошибка номер Два — время Order.CancelTime отсутствует, а должно быть. В экселе «44300189 and 44300190.xls» можно посмотреть данные по заявке 44300190. Когда пришло первое событие OrdersChanged для этой заявки с статусом Done, свойство Order.CancelTime было пустым. В следующем событии это время уже не пустое.


Date	Message
2011-04-26 12:21:39.4660718	OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Active CancelTime:  Status: Accepted
2011-04-26 12:21:39.5754482	OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Active CancelTime:  Status: Accepted
2011-04-26 12:21:44.5286366	OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Done CancelTime:  Status: Accepted
2011-04-26 12:21:45.1848950	OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Done CancelTime: 26.04.2011 12:21:44 Status: Accepted

Аналогично предыдущему случаю, если посмотреть данные DDE то перед третьим событием OrdersChanged данные DDE для заявки не приходят. Из чего я делаю вывод, что заявка меняет статус на Done самопроизвольно:


2011-04-26 12:21:43.8567530	PreProcessDdeData   String: все сделки
2011-04-26 12:21:43.8567530	PreProcessDdeData   Row: 0
2011-04-26 12:21:43.8567530	PreProcessDdeData              Column: 0 Object: 128200
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 1 Object: 12:21:43
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 2 Object: SBER03
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 3 Object: EQBR
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 4 Object: 102.12
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 5 Object: 10
2011-04-26 12:21:43.8723782	PreProcessDdeData              Column: 6 Object: BUY
2011-04-26 12:21:43.8880034	PreProcessDdeData              Column: 7 Object: 26.04.2011
2011-04-26 12:21:43.8880034	PreProcessDdeData   String: все сделки
2011-04-26 12:21:43.8880034	PreProcessDdeData   Row: 0
2011-04-26 12:21:43.8880034	PreProcessDdeData              Column: 0 Object: 128201
2011-04-26 12:21:43.9036286	PreProcessDdeData              Column: 1 Object: 12:21:43
2011-04-26 12:21:43.9036286	PreProcessDdeData              Column: 2 Object: SBER03
2011-04-26 12:21:43.9036286	PreProcessDdeData              Column: 3 Object: EQBR
2011-04-26 12:21:43.9036286	PreProcessDdeData              Column: 4 Object: 102.12
2011-04-26 12:21:43.9036286	PreProcessDdeData              Column: 5 Object: 2
2011-04-26 12:21:43.9192538	PreProcessDdeData              Column: 6 Object: BUY
2011-04-26 12:21:43.9192538	PreProcessDdeData              Column: 7 Object: 26.04.2011
2011-04-26 12:21:44.5286366	OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Done CancelTime:  Status: Accepted

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

Спасибо:

Mikhail Sukhov

Фотография
Дата: 27.04.2011
Ответить


Ок, я кажется понял в чем проблема. Буду фиксить.

Но есть ряд моментов, которые нужно прояснить. Order.Time не всегда сразу инициализируется. В асинхронном режиме это чаще всего, потому что callback приходит раньше, чем ответ через ДДЕ. При это callback не несет информацию о времени регистрации.

Что касается записи:

2011-04-26 12:21:39.4660718    OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Active CancelTime:  Status: Accepted
2011-04-26 12:21:39.5754482    OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Active CancelTime:  Status: Accepted
2011-04-26 12:21:44.5286366    OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Done CancelTime:  Status: Accepted
2011-04-26 12:21:45.1848950    OrdersChanged    TransactionId: 44300190 Balance: 1 Volume: 1 State: Done CancelTime: 26.04.2011 12:21:44 Status: Accepted

то судя по логу, ДДЕ не присылал время снятия. Единственно, что тут неправильно - это выставление Done преждевременно. Ошибка, как я понял, в слишком раннем выставлении Done для заявки. По сути это можно трактовать как и правильно поведение (ведь заявка реально была снята). Но неправильность начинается как раз в том случае, если после снятия заявки начинают приходить по ней сделки. И тогда баланс начинает уменьшаться для уже Done заявки. Это я исправлю. Но всегда остается тот вариант, когда Квик пришлет уведомление по ДДЕ для уже Done заявки (например, в Квик добавлена колонки, которые тикают для уже исполненных заявок). Баланс уменьшаться не будет, но OrdersChanged все равно вызовется.

Спасибо:

Maxim

Фотография
Дата: 27.04.2011
Ответить


Mikhail Sukhov: Но есть ряд моментов, которые нужно прояснить. Order.Time не всегда сразу инициализируется. В асинхронном режиме это чаще всего, потому что callback приходит раньше, чем ответ через ДДЕ. При это callback не несет информацию о времени регистрации.

Наверно надо тогда внести пояснение в документацию, о том что в некоторых случаях заявка все таки может изменяться после изменения статуса на Done. Или реализовать так, что бы до появления Order.Time заявка не становилась Done. Или ввести опцию, которая позволяла выбирать из двух вариантов поведения один определенный.

Mikhail Sukhov: Но всегда остается тот вариант, когда Квик пришлет уведомление по ДДЕ для уже Done заявки (например, в Квик добавлена колонки, которые тикают для уже исполненных заявок). Баланс уменьшаться не будет, но OrdersChanged все равно вызовется.

То что придет событие OrdersChanged не страшно на мой взгляд. Главное, что бы поведение заявки совпадало с документацией. Это я о не изменении после Done. В противном случае рассчитываешь на одно, а в реалии получается другое.

Maxim:

Mikhail Sukhov: Order.State Но зная Order.State нельзя определить, была ли отменена заявка, правильно? Получается, что единственный признак того, что заявка была отменена, это наличие Order.CancelTime? Или я ошибаюсь?

Михаил, не ответили на вопрос. Он не критичен, но для общего развития не помешает узнать ответ.

Повторюсь, что все второстепенные ошибки лично для меня пока не критичны. Возможно в будущем и придется с ними столкнутся , если они останутся, но на данные момент они не мешают.

Основная проблема, которая мешает — это в изменении баланса, после того заявка стала Done.

Спасибо:

Maxim

Фотография
Дата: 29.04.2011
Ответить


Михаил, так и не ответили. Спрошу еще раз, что бы закрыть вопрос.

Зная Order.State, нельзя определить, была ли отменена заявка, правильно? Получается, что единственный признак того, что заявка была отменена, это наличие Order.CancelTime? Или я ошибаюсь?

Спасибо:

Mikhail Sukhov

Фотография
Дата: 29.04.2011
Ответить


Maxim: Михаил, так и не ответили. Спрошу еще раз, что бы закрыть вопрос.

Зная Order.State, нельзя определить, была ли отменена заявка, правильно? Получается, что единственный признак того, что заявка была отменена, это наличие Order.CancelTime? Или я ошибаюсь?

Да, можно по Order.CancelTime.

Спасибо:

Maxim

Фотография
Дата: 03.05.2011
Ответить


Михаил, есть ошибка.

При выставлении и быстром снятии заявки статус остается Active.

Кусочек логов. Записи идут в хронологическом порядке (забыл время добавить в лог). Это последние данные по этой заявке.


PreProcessDdeData   String: заявки
PreProcessDdeData   Row: 0
PreProcessDdeData              Column: 0 Object: 446183
PreProcessDdeData              Column: 1 Object: SBER03
PreProcessDdeData              Column: 2 Object: EQBR
PreProcessDdeData              Column: 3 Object: 97.66
PreProcessDdeData              Column: 4 Object: 6
PreProcessDdeData              Column: 5 Object: 6
PreProcessDdeData              Column: 6 Object: B
PreProcessDdeData              Column: 7 Object: KILLED
PreProcessDdeData              Column: 8 Object: 15:02:54
PreProcessDdeData              Column: 9 Object: 15:02:54
PreProcessDdeData              Column: 10 Object: L01-00000F00
PreProcessDdeData              Column: 11 Object: LSQ
PreProcessDdeData              Column: 12 Object: 6014//S#
PreProcessDdeData              Column: 13 Object: 54114804
PreProcessDdeData              Column: 14 Object: 03.05.2011
PreProcessDdeData              Column: 15 Object: 6014
OrdersChanged    TransactionId: 54114804 Balance: 6 Volume: 6 State: Active CancelTime: 03.05.2011 15:02:54 Status: Accepted

Спасибо:

Mikhail Sukhov

Фотография
Дата: 03.05.2011
Ответить


Maxim: Михаил, есть ошибка.

Случаем не это http://stocksharp.com/posts/m/7845/

Спасибо:

Maxim

Фотография
Дата: 04.05.2011
Ответить


Mikhail Sukhov:

Maxim: Михаил, есть ошибка.

Случаем не это http://stocksharp.com/posts/m/7845/

Ситуация вроде похожа. Вроде бы тоже проблема в том, что после отмены заявка не становится Done.

Скачал последнюю версию, запустил. Ситуация не изменилась. Все так же отмененные заявки не становятся Done. Возможно связано стем, что Trader.IsAsyncMode у меня true? В приведенном Вами случае у пользователя Garry был случай с false.

При QuikTrader.CancelOrderInstantly = true все работает нормально.

Отдельный вопрос. А зачем свойство QuikTrader.CancelOrderInstantly ? Если заявка отменилась, то почему сразу не переводить ее в Done? Зачем ждать данных из DDE?

Спасибо:

Mikhail Sukhov

Фотография
Дата: 04.05.2011
Ответить


Maxim: Ситуация вроде похожа. Вроде бы тоже проблема в том, что после отмены заявка не становится Done.

Скачал последнюю версию, запустил.

Сегодня скачали? Может нужно пересобрать проект? Вдруг старые dll закэшировались.

Maxim: Ситуация не изменилась. Все так же отмененные заявки не становятся Done.

Теперь Done будет выставляться только тогда, когда пришел поток ДДЕ с признаком KILLED. Что у вас и происходит по логу.[glare]

Maxim: Отдельный вопрос. А зачем свойство QuikTrader.CancelOrderInstantly ? Если заявка отменилась, то почему сразу не переводить ее в Done? Зачем ждать данных из DDE?

Чтобы не было вашей ситуации, когда баланс начинает чудесным образом обновляться после отмены.

Спасибо: Maxim
<< < 2 3 4 5  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy