Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AddOrderByCancelationId fix #271

Closed
wants to merge 1 commit into from
Closed

AddOrderByCancelationId fix #271

wants to merge 1 commit into from

Conversation

risty
Copy link
Contributor

@risty risty commented Oct 15, 2016

У меня без этого фикса в свойствах сделки указан другой ордер, чем по которому было сообщение о сделке от коннектора.
Например

2016/05/16 10:00:00.956|       |MQS_SIM6@FORTS_Backtest|Правило 'Изменение стакана инструмента SIM6@FORTS (0x230DF28)'. Активация.
2016/10/15 13:58:25.111|       |SecurityMarketEmulator|Заявка 23. Исполнение объема 30 по цене 65467.
2016/10/15 13:58:25.111|       |SecurityMarketEmulator|Заявка 23 полностью исполнена.
2016/10/15 13:58:25.111|       |SecurityMarketEmulator|Сделка 2 заявки 23 P=65467 V=30.
2016/05/16 10:00:00.961|       |HistoryEmulationConnector|Order changed: 23/16 Продажа Цена=65467 Объем=30 Сост=Done Бал=0 
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Полное исполнение 23/16 (0x2EA3945)'. Активация.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Заявка 23 (0x1BC827E) полностью исполнилась. Оставшийся объем 0.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Заканчиваем котирование.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Стратегия останавливается. [0,1]. Позиция 0.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Изменение стакана инструмента SIM6@FORTS (0x230DF28)'. Приостановлено.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'MQS_SIM6@FORTS_Backtest - останавливается (0x2CA7492)'. Активация.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'MQS_SIM6@FORTS_Backtest - останавливается (0x2CA7492)'. Удаление.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Ожидание снятия всех активных заявок.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Изменение стакана инструмента SIM6@FORTS (0x230DF28)'. Удалено.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Изменение позиции (0x2E5CE74)'. Удалено.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Полное исполнение 23/16 (0x2EA3945)'. Удаление.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Правило 'Ошибка регистрации.  23/16 (0x1B33FE9)'. Удаление.
2016/05/16 10:00:00.961|       |CollectionTestingStrategy|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, Backtest)=-15.
2016/05/16 10:00:00.961|       |NoviksIndicatorStrategy|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, Backtest)=-15.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, Backtest)=-30.
2016/05/16 10:00:00.961|       |CollectionTestingStrategy|Новая Sell сделка 2 по цене 65467 на 30 заявки 22.
2016/05/16 10:00:00.961|       |NoviksIndicatorStrategy|Правило 'Новые сделки стратегии NoviksIndicatorStrategy (0x1F43FD2)'. Активация.
2016/05/16 10:00:00.961|       |NoviksIndicatorStrategy|Новая Sell сделка 2 по цене 65467 на 30 заявки 22.
2016/05/16 10:00:00.961|       |MQS_SIM6@FORTS_Backtest|Новая Sell сделка 2 по цене 65467 на 30 заявки 22.

В приведенном примере полностью исполнилась заявка 23, а сделка пришла по заявке 22.
Этот баг коммент и фиксит.

@mikasoukhov
Copy link
Contributor

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

@risty
Copy link
Contributor Author

risty commented Oct 17, 2016

Неа, при регистрации заявка добавляется с ключом в виде кортежа transactionId, isCancel=false.
А эта строчка добавляет ордер с ключом transactionId, isCancel=true.

Поведение.
Работает котировщик.
При регистрации заявки(метод RegisterOrder класса Connector) вызывается метод AddOrderByTransactionId класса EntityCache и в словарь _allOrdersByTransactionId добавляется запись с ключом в виде кортежа(transactionId, false) и значением - ордером. Пусть transactionId будет равно единице, и ордер = ордер_1
Далее происходит перерегистрация заявки (метод ReRegisterOrder класса Connector). Вызывается тот же AddOrderByTransactionId и в словарь _allOrdersByTransactionId добавляется ключ (2,false) и значение ордер_2. Далее в словарь добавляется ключ (2,true) и значение ордер_1.
Далее происходит сделка. в коннектор (метод ProcessExecutionMessage) приходит ExecutionMessage (HasTradeInfo = true, OrderId = 2, OriginalTransactionId =2), но для этого сообщения в строке 1675 метод GetOrder(ExecutionMessage message, out long transactionId) возвращает ордер_1, вместо ордера_2, по которому реально была совершена сделка.

@mikasoukhov
Copy link
Contributor

Возможно есть какая-то проблема, но она точно не связана с заменой кода на _entityCache.AddOrderByCancelationId(oldOrder, oldOrder.TransactionId) Транзакция на отмену будет иметь номер newOrder.TransactionId. Номер транзакции по старой заявке - это номер ее регистрации. Для отмены или для замены используются свои номера.

@risty
Copy link
Contributor Author

risty commented Oct 19, 2016

Проблему обозначил, решение предложил. Дальше как хотите.

@mikasoukhov
Copy link
Contributor

Вы как раз проблему не обозначили. А именно как воспроизвести.

@risty
Copy link
Contributor Author

risty commented Oct 20, 2016

Соль в том, что вам, чтобы увидеть указанную тут ошибку, придется или пофиксить Issue #223 и Issue #248 самостоятельно (в рамках всех канонов) или воспользоваться моими фиксами.
Качаете архив, разблокируете.
Файлы *.cs кладете в папку с примером SampleHistoryTesting релиза 4.3.17. Правите референсы, собираете, запускаете.
Указываете путь к истории, выбираете тестирование на "тиках и стаканах" и запускаете тест.
История для тестирования так же в архиве.
На случай, если пофиксить Issue #223 и Issue #248 самостоятельно не удастся - в архиве же собранные Algo и Algo.Strategies с моими фиксами.
Отлично воспроизводится:

2016/10/20 21:39:23.966|       |SecurityMarketEmulator|Заявка 13. Исполнение объема 30 по цене 65823.
2016/10/20 21:39:23.966|       |SecurityMarketEmulator|Заявка 13 полностью исполнена.
2016/10/20 21:39:23.966|       |SecurityMarketEmulator|Сделка 5 заявки 13 P=65823 V=30.
2016/06/06 10:00:01.000|       |HistoryEmulationConnector|Order changed: 13/6 Покупка Цена=65823 Объем=30 Сост=Done Бал=0 
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Заявка 13 (0x22D8B66) полностью исполнилась. Оставшийся объем 0.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Заканчиваем котирование.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Стратегия останавливается. [0,1]. Позиция 0.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Правило 'Изменение стакана инструмента SIM6@FORTS (0x3D3E7F3)'. Приостановлено.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Ожидание снятия всех активных заявок.
2016/06/06 10:00:01.000|       |SS_SIM6@FORTS_test account|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, test account)=30.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, test account)=30.
2016/06/06 10:00:01.000|       |SS_SIM6@FORTS_test account|Новая Buy сделка 5 по цене 65823 на 30 заявки 12.
2016/06/06 10:00:01.000|       |MQS_SIM6@FORTS_test account|Новая Buy сделка 5 по цене 65823 на 30 заявки 12.

Исполнилась заявка 13, а сделка пришла по 12ой

К слову, ещё вот такое всплывает:

2016/06/06 00:00:00.000|Error  |HistoryEmulationConnector|System.NullReferenceException: Object reference not set to an instance of an object.
   at StockSharp.Messages.Extensions.GetServerTime(Message message)
   at StockSharp.Algo.Testing.HistoryMessageAdapter.SendOutMessage(Message message) in C:\Users\RN\Documents\Visual Studio 2015\Projects\StockSharp_Fork\StockSharp\Algo\Testing\HistoryMessageAdapter.cs:line 507
   at StockSharp.Algo.Testing.HistoryMessageAdapter.SendOutMessage() in C:\Users\RN\Documents\Visual Studio 2015\Projects\StockSharp_Fork\StockSharp\Algo\Testing\HistoryMessageAdapter.cs:line 494
   at StockSharp.Algo.Testing.HistoryEmulationConnector.HistoryEmulationMessageChannel.<Open>b__9_1() in C:\Users\RN\Documents\Visual Studio 2015\Projects\StockSharp_Fork\StockSharp\Algo\Testing\HistoryEmulationConnector.cs:line 112

@mikasoukhov
Copy link
Contributor

Я правильно понимаю, что если не фиксить вашим способом #223 и #248 , то ошибки не возникает?

@risty
Copy link
Contributor Author

risty commented Oct 21, 2016

Не знаю, не могу проверить. Из за указанных ишью дочернии стратеги и котировщик не работают.

@risty
Copy link
Contributor Author

risty commented Oct 24, 2016

Сделал другой пример. Проверил. Тот же косяк на совершенно чистом релизе 4.3.17 без каких либо фиксов. Действуете по инструкции выше, но берете этот
SmaStrategy.txt, переименовываете в *.cs
Получается:

2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Регистрация новой  (0x7C37C) заявки на Buy с ценой 65785 и объемом 30. 
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|RegisterOrder: 0/ Покупка Цена=65785 Объем=30 Сост=None Бал=0 
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|New order: 8/ Покупка Цена=65785 Объем=30 Сост=Pending Бал=30 
2016/10/24 17:20:24.511|       |SecurityMarketEmulator|Заявка 8 зарегистрирована.
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|Order changed: 8/1 Покупка Цена=65785 Объем=30 Сост=Active Бал=30 
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Перерегистрация заявки 8 (0x7C37C) с ценой 65785 на цену 65865. 
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|New order: 9/ Покупка Цена=65865 Объем=30 Сост=Pending Бал=30 
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, test account)=0.
2016/10/24 17:20:24.850|       |SecurityMarketEmulator|Заявка 8 снята.
2016/10/24 17:20:24.850|       |SecurityMarketEmulator|Заявка 9 зарегистрирована.
2016/10/24 17:20:24.858|       |SecurityMarketEmulator|Заявка 9. Исполнение объема 20 по цене 65816.
2016/10/24 17:20:24.858|       |SecurityMarketEmulator|Заявка 9. Исполнение объема 10 по цене 65818.
2016/10/24 17:20:24.859|       |SecurityMarketEmulator|Заявка 9 полностью исполнена.
2016/10/24 17:20:24.861|       |SecurityMarketEmulator|Сделка 1 заявки 9 P=65816 V=20.
2016/10/24 17:20:24.878|       |SecurityMarketEmulator|Сделка 2 заявки 9 P=65818 V=10.
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|Order changed: 8/1 Покупка Цена=65785 Объем=30 Сост=Done Бал=30 
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Заявка 8 (0x7C37C) больше не активна.
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, test account)=0.
2016/06/06 20:50:02.000|       |HistoryEmulationConnector|Order changed: 9/2 Покупка Цена=65865 Объем=30 Сост=Done Бал=0 
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|| OrderLock = False
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Заявка 9 (0x2F90EFD) больше не активна.
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Новая позиция: (S#:SIM6@FORTS, Native:,Type:, test account)=30.
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Новая Buy сделка 1 по цене 65816 на 20 заявки 8.

@risty
Copy link
Contributor Author

risty commented Nov 10, 2016

Михаил, подскажите, удалось воспроизвести баг?

@mikasoukhov
Copy link
Contributor

После НГ будем разбирать ошибку.

@mikasoukhov
Copy link
Contributor

Запустил код. Ошибок явных не получил. Есть ли какие-то проверки в коде? Или как нужно найти ошибку по другому?

@risty
Copy link
Contributor Author

risty commented Dec 7, 2016

Релиз 4.3.19.2 содержит устаревшие примеры.
Кроме этого:

System.NullReferenceException: Object reference not set to an instance of an object.
   at StockSharp.Messages.Extensions.GetServerTime(Message message)
   at StockSharp.Algo.Testing.HistoryMessageAdapter.SendOutMessage(Message message)
   at StockSharp.Algo.Testing.HistoryMessageAdapter.SendOutMessage()
   at StockSharp.Algo.Testing.HistoryEmulationConnector.HistoryEmulationMessageChannel.<Open>b__9_1()

При добавлении дочерней стратегии котирования падает с

System.InvalidOperationException: Инструмент SIM6@FORTS не подписан на получение отфильтрованного стакана котировок.
   at StockSharp.Algo.Connector.GetFilteredMarketDepth(Security security)
   at StockSharp.Algo.Strategies.Quoting.QuotingStrategy.GetFilteredQuotes(Sides side)
   at StockSharp.Algo.Strategies.Quoting.QuotingStrategy.get_BestPrice()
   at StockSharp.Algo.Strategies.Quoting.MarketQuotingStrategy.get_BestPrice()
   at StockSharp.Algo.Strategies.Quoting.BestByPriceQuotingStrategy.NeedQuoting(Nullable`1 currentPrice, Nullable`1 currentVolume, Decimal newVolume)
   at StockSharp.Algo.Strategies.Quoting.QuotingStrategy.ProcessQuoting()
   at StockSharp.Algo.Strategies.Quoting.QuotingStrategy.OnStarted()
   at StockSharp.Algo.Strategies.Strategy.set_ProcessState(ProcessStates value)

Регистрация фильтрованных стаканов выражением Connector.RegisterFilteredMarketDepth(Security); не приносит успеха.
А так то надо следить на приходящей сделкой и смотреть по какой заявке была сделка. Далее по этому номеру заявки искать её в заявках стратегии и если заявка с таким номером Done и баланс !=0 вывадить аллерт. Я бы все это написал, но обозначенные выше ошибки мешают.
В приведенном выше фращменте лога стратегии проблема, если выбросить лишнее, выглядит так:

2016/10/24 17:20:24.850|       |SecurityMarketEmulator|Заявка 8 снята.
2016/10/24 17:20:24.850|       |SecurityMarketEmulator|Заявка 9 зарегистрирована.
2016/10/24 17:20:24.859|       |SecurityMarketEmulator|Заявка 9 полностью исполнена.
2016/10/24 17:20:24.861|       |SecurityMarketEmulator|Сделка 1 заявки 9 P=65816 V=20.
2016/10/24 17:20:24.878|       |SecurityMarketEmulator|Сделка 2 заявки 9 P=65818 V=10.
2016/06/06 20:50:02.000|       |SS_SIM6@FORTS_test account|Новая Buy сделка 1 по цене 65816 на 20 заявки 8.

@mikasoukhov
Copy link
Contributor

Что означает фраза "устаревшие примеры"?

@mikasoukhov
Copy link
Contributor

Котирование не будет работать, фильтрация выключена стакана.

Ошибка в бэктестере как-то связана с котированием? Это не дубликает ошибки #248 ?

@risty
Copy link
Contributor Author

risty commented Dec 8, 2016

Про "устаревшие примеры" - я погорячился, криво референсы подцепились. С примерами все норм.
Отключенный фильтрованный стакан, да,у видел в исходниках.
Ошибка в бэктестере, фикс которой тут описан, связан с перерегистрацией заявки(ReRegisterOrder), которая используется в котировании. Т.к. котирование сейчас не работает, мне прям оперативно не проверить существует ли баг в последнем релизе.
Ошибка #248 на мой взгляд не связана с этой.

@mikasoukhov
Copy link
Contributor

Само котирование судя по сообщения не работает правильно. Тоесть используется неработающий модуль для проверки другого модуля. Это приводит к неправильным результатам.

@mikasoukhov
Copy link
Contributor

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

@risty risty deleted the devel branch December 10, 2016 11:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants