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


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


Михаил, добрый день.
Обращаюсь по привычке к Вам, так как не в курсе, поддерживает ли 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/fo...et-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