Многократный приход одних и тех же сделок при тестировании на исторических данных в HistoryEmulationConnector
Здравствуйте!
Смотрю примеры и нашел явный баг в логике чтения исторических данных при использовании HistoryEmulationConnector.
Проще всего воспроизвести на вашем примере SampleHistoryTesting. Достаточно подписаться на событие connector.NewTrade и посмотреть, какие сделки приходят в него после запуска теста на тиках. Будет хорошо видно, что каждая сделка приходит дважды подряд (по идентификатору транзакции и другим полям видно, что это одна и та же сделка). Так происходит для каждой сделки из источника данных.
Я поизучал код пару часов и нашел причину такого поведения.
Проблема в том, как обрабатываются сообщения о подписке в методе HistoryMessageAdapter.ProcessMarketDataMessage(MarketDataMessage message). Обратите внимание на строку:
https://github.com/Stock...yMessageAdapter.cs#L443
В примере SampleHistoryTesting сообщение MarketDataTypes.Trades и флагом IsSubscribe приходит дважды: первый раз при подписке на Security в коннекторе и второй раз при запуске генерации свечей на этом же инструменте. Фактически, оба раза выполняется такой код: BasketStorage.AddStorage(StorageRegistry.GetTickMessageStorage(security, Drive, StorageFormat)), т.е. в BasketStorage дважды добавляется один и тот же источкник данных, возвращаемый методом StorageRegistry.GetTickMessageStorage(). Далее во время работы у каждой из копий источника в BasketStorage получается своя копия одной и той же сделки.
На первый взгляд правильным решением было бы, вместо того чтобы добавлять в BasketStorage копии одного и того же источника на каждое сообщение о подписке, проверять, что такой источник уже был добавлен и инкрементировать некий счетчик ссылок, чтобы правильно отрабатывать подписку / отписку. Сообщения об отписке должны декрементировать этот счетчик ссылок.
Текущее положение не дает возможности нормально тестировать свой код, т.к. в нормальном состоянии, разумеется, не должны приходить копии одной и той же сделки несколько раз.
Известный ли это баг и планируется это к исправлению? Или может есть известные способы обхода этой ситуации?