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-ы.
|
|
Спасибо:
|
|
|
|