Несответствие данных, получаемых по AddInfoLog() и AddOrderInfoLog()
Atom Ответить
20.12.2012


Здравствуйте!
В правиле order.WhenRegistered() (успешная регистрация заявки) используя this.AddInfoLog() вывожу:
18:28:23.060 | Strategy1 | AddInfoLog: Order=66102994/3150125547, State=Active, Balance=2

Следом для этого же ордера используя this.AddOrderInfoLog() получаю:
18:28:23.060 | Strategy1 | AddOrderInfoLog: 66102994/3150125547 Продажа Цена=153090 Объем=2 Сост=Done Бал=0

Для одного и того же ордера имеем разные значения для состояния заявки и баланса.
AddOrderInfoLog() выдает свежие (последние) значения.

Как получить свежие значения для order.State и order.Balance аналогичные тем, что выдает AddOrderInfoLog()?
Спасибо!

Теги:


Спасибо:




10 Ответов
esper

Фотография
Программист
Дата: 21.12.2012
Ответить


Посмотрите вот это.
Спасибо:

NewMan

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


Вопрос не касается транзакционности при работе с заявками.
Речь идет о том, что библиотека имеет текущую (свежую) информацию о заявке, но передает ее в стратегию (польэователю) значительно позже.
Рассмотрим выдержку из лог-файла:

1. 19:36:25.742| |Strategy1 |Регистрация новой заявки на Buy с ценой 152080 и объемом 1.
2. 19:36:25.743| |PlazaTrader|RegisterOrder: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
3. 19:36:25.959| |PlazaTrader|New order: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
4. 19:36:25.964| |Strategy1 |<WhenRegistered> AddInfoLog: Order=9914079/1519181401, State=Active, Balance=1
5. 19:36:25.964| |Strategy1 |<WhenRegistered> AddOrderInfoLog: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
6. 19:36:25.968| |Strategy1 |Перегистрация заявки 9914079 с ценой 152080 на цену 152070.
7. 19:36:25.975| |Strategy1 |Новая Buy сделка 7773983 по цене 152070 на 1 заявки 69914079.
8. 19:36:25.976| |PlazaTrader|Order changed: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
9. 19:36:25.978| |PlazaTrader|Order changed: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
10. 19:36:25.978| |Strategy1 |Новая позиция: ABCDEFG-RIH3@RTS=1.
11. 19:36:26.002| |Strategy1 |<WhenMatched> 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
12. 19:36:26.002| |Strategy1 |Заявка 9914079 больше не активна.
13. 19:36:26.111| |PlazaTrader|OrderCancelFailed: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'.
14. 19:36:26.112| |PlazaTrader|OrderFailed: 9914081/0 Покупка Цена=152070 Объем=1 Сост=Failed Бал=1
StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'.
15. 19:36:26.112|Error |Strategy1 |Заявка 9914081 не была принята по причине StockSharp.Plaza.PlazaException:
Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..
16. 19:36:26.112| |Strategy1 |Заявка 9914081 больше не активна.
17. 19:36:26.112|Error |Strategy1 |Заявка 9914079 не была отменена по причине StockSharp.Plaza.PlazaException:
Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..

В 25.743сек PlazaTrader сообщает о регистрации заявки с присвоенным Id и Сост=Done Бал=0.
Это информация говорит о том, что заявка исполнилась по рынку.
Правило WhenRegistered было активировано в 25.964сек. В AddInfoLog используя order.State и order.Balance получаю State=Active, Balance=1.
Но эти данные не соответствуют реальному состоянию заявки.
В следующей строке кода AddOrderInfoLog выдает Сост=Done Бал=0, подтверждая данные PlazaTrader, сообщенные раньше на 219 милисек.
В 25.968сек используя недостоверную информацию о состоянии заявки (State=Active) стратегия дает команду MoveOrder на перерегистрацию заявки 9914079/1519181401.
Вместо этого нужно было выполнить AddOrder, т.к. реальное состояние заявки Сост=Done Бал=0, и все было бы ОК.
В 25.975сек библиотека сообщает о новой сделке по этой заявке и в 26.002сек активируется WhenMatched, но заявка на перерегистрацию уже улетела.
Активация произошла через 259милисек после сообщения PlazaTrader о регистрации заявки с Сост=Done Бал=0. Это долго.
В 26.111-26.112 библиотека сообщает об ошибках перерегистрации заявки 9914079 на 9914081 на серверах биржи.
Из-за недостоверности предоставленной библиотекой информации стратегия потеряла время на выставление заранее обреченной заявки,
а сервера биржи выполнили лишнюю и ненужную работу.

Так как все-таки получить свежие значения для order.State и order.Balance аналогичные тем, что выдает AddOrderInfoLog()?
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 22.12.2012
Ответить


Приведите минимальный код с выводом всех этих данных.
Спасибо:

esper

Фотография
Программист
Дата: 23.12.2012
Ответить


Код более не нужен. Это баг в AddOrderInfoLog, она выводит неверные данные. Используйте пока this.AddInfoLog(), в ближайшие несколько дней будет фикс на кодеплексе.
Спасибо:

NewMan

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


Я думаю, баг не в AddOrderInfoLog, поскольку в 25.743сек PlazaTrader сообщает о регистрации исполненной заявки с Сост=Done Бал=0.
Далее AddOrderInfoLog только подтверждает эту информацию. AddInfoLog противоречит сообщению от PlazaTrader.
Если вы исправите AddOrderInfoLog, то он также будет показывать недостоверную информацию.
Вот код с указанными выше правилами.

order
.WhenRegistered()
.Do(_order =>
{
this.AddInfoLog("<WhenRegistered> AddInfoLog:" + " Order=" +_order.TransactionId + "/" + _order.Id + ", State=" + _order.State + ", Balance=" + _order.Balance);
this.AddOrderInfoLog(_order, "<WhenRegistered> AddOrderInfoLog:");
})
.Once()
.Apply(this);

order
.WhenMatched()
.Do(_order =>
{
this.AddOrderInfoLog(_order, "<WhenMatched>");
})
.Once()
.Apply(this);

Нужно, чтобы по _order.State я смог бы получить состояние заявки, соответствующее тому, что выдает PlazaTrader. Тогда я смогу делать addOrder вместо moveOrder и не будет указанных выше ошибок.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 23.12.2012
Ответить


NewMan Перейти
Я думаю, баг не в AddOrderInfoLog, поскольку в 25.743сек PlazaTrader сообщает о регистрации исполненной заявки с Сост=Done Бал=0.


Вот именно здесь и ошибка, не может в данном месте заявка иметь биржевой номер.
Спасибо:

NewMan

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


По поводу
2. 19:36:25.743| |PlazaTrader|RegisterOrder: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
стало понятно. библиотека заглянула в будущее и увидела ID заявки.
Но в строке
3. 19:36:25.959| |PlazaTrader|New order: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
PlazaTrader сообщает о том, что получен новый ордер, у которого Сост=Done Бал=0
Затем активируется WhenRegistered. и здесь строка
5. 19:36:25.964| |Strategy1 |<WhenRegistered> AddOrderInfoLog: 9914079/1519181401 Покупка Цена=152080 Объем=1 Сост=Done Бал=0
показывает Сост и Баланс такой же, как в 3 строке,
а в строке
4. 19:36:25.964| |Strategy1 |<WhenRegistered> AddInfoLog: Order=9914079/1519181401, State=Active, Balance=1
State=Active, Balance=1, когда на самом деле Сост=Done Бал=0
Вот в чем вопрос.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 24.12.2012
Ответить


Залил фикс на кодеплекс.
Спасибо:

NewMan

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


После фикса:

....................
12:16:15.530| |PlazaTrader|New order: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Active Бал=1
12:16:15.530| |Strategy1 |<WhenRegistered>: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Active Бал=1
12:16:15.568| |PlazaTrader|Order changed: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Active Бал=1
12:16:15.586| |Strategy1 |Перерегистрация заявки 43860581 с ценой 151890 на цену 151920.
12:16:15.586| |Strategy1 |Перерегистрация проскальзывания заявки 43860581 (0x22A95D) на заявку (0x5EF497).
12:16:15.619| |Strategy1 |Новая Sell сделка 7869195 по цене 151890 на 1 заявки 43860581.
12:16:15.626| |PlazaTrader|Order changed: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Done Бал=0
12:16:15.626| |Strategy1 |Новая позиция: ABCDEFG-RIH3@RTS=1.
12:16:15.626| |Strategy1 |<WhenMatched>: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Done Бал=0
12:16:15.626| |Strategy1 |Заявка 43860581 больше не активна.
12:16:15.757| |PlazaTrader|OrderCancelFailed: 43860581/3153200118 Продажа Цена=151890 Объем=1 Сост=Done Бал=0
StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'.
12:16:15.757| |PlazaTrader|OrderFailed: 43860583/0 Продажа Цена=151920 Объем=1 Сост=Failed Бал=1
StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'.
12:16:15.757|Error |Strategy1 |Заявка 43860583 (0x5EF497) не была принята по причине StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..
12:16:15.786|Error |PlazaTrader|System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: order
в StockSharp.Algo.Slippage.SlippageManager...
в StockSharp.Algo.Slippage.SlippageManager...
в StockSharp.Algo.Slippage.SlippageManager.RegisterFailed(OrderFail fail)
в StockSharp.Algo.Strategies.Strategy...
в StockSharp.Algo.Strategies.Strategy...
в System.Action`1.Invoke(T obj)
в Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
в Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items)
12:16:15.786|Error |Strategy1 |Заявка 43860581 не была отменена по причине StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..
....................

Появились сообщения о перерегистрации проскальзывания заявок (на 15.586милисек) - раньше их не было.
Стали появляться в лог-файле сообщения в десяток строк (на 15.786милисек) о System.ArgumentNullException в StockSharp.Algo.Slippage.SlippageManager и
одновременно эти сообщения дублируются в MessageBox, забивая экран.
В коде стратегии нет ни одного вызова MessageBox.

Просьба: отменить или заблокировать вывод сообщений от SlippageManager - очень мешают, да и логи забиваются ненужной информацией.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 26.12.2012
Ответить


NewMan Перейти
12:16:15.786|Error |PlazaTrader|System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: order
в StockSharp.Algo.Slippage.SlippageManager...
в StockSharp.Algo.Slippage.SlippageManager...
в StockSharp.Algo.Slippage.SlippageManager.RegisterFailed(OrderFail fail)
в StockSharp.Algo.Strategies.Strategy...
в StockSharp.Algo.Strategies.Strategy...
в System.Action`1.Invoke(T obj)
в Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
в Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items)

Покажите полное сообщение, вместо многоточия должен быть еще текст.

NewMan Перейти
одновременно эти сообщения дублируются в MessageBox, забивая экран.
В коде стратегии нет ни одного вызова MessageBox.

Смотрите у себя в обвязке стратегии, где у вас могут выводиться MessageBox-ы.
Спасибо:


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

loading
clippy