← Zurück

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

Здравствуйте! В правиле 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()? Спасибо!

War dieses Thema hilfreich?

Thema teilen

Kommentare (10)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

esper
esper

Посмотрите вот это.

NewMan
NewMan Autor

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

  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
esper

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

esper
esper

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

NewMan
NewMan Autor

Я думаю, баг не в 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
esper

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

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

NewMan
NewMan Autor

По поводу 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
esper

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

NewMan
NewMan Autor

После фикса:

.................... 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.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 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
esper

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.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 items) Покажите полное сообщение, вместо многоточия должен быть еще текст.

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