Здравствуйте. Я использую сток шарп уже примерно пол года, причем последнее время очень активно. В процессе активного использования я обнаружил некоторые проблемы и хотел бы осветить их в данном посте.
Использование S# в модели, когда информация из многих источников "сливаеться" через BasketTrader в один я заметил бесседную пропаже некоторых данных, что навело меня на мысли о не уникальности используемых клчючей коллекций основных бизнес сущностей. А именно Security, Portfolio, Trades, Positions, Orders, OrderFail, MyTrades. О ключах коллекций вышеперечисленных сущностей я судил исходя из функций: StockSharp.Algo.BaseTrader.GetSecurity(string ID) StockSharp.Algo.BaseTrader.GetPortfolio(string ID) StockSharp.Algo.BaseTrader.GetOrderByTransactionId(long ID ) StockSharp.Algo.BaseTrader.GetPosition(StockSharp.BusinessEntities.Portfolio, StockSharp.BusinessEntities.Security) StockSharp.Algo.BaseTrader.GetTrade(StockSharp.BusinessEntities.Security, long TradeID, System.Func<long,StockSharp.BusinessEntities.Trade>) StockSharp.Algo.BaseTrader.AddMyTrade(StockSharp.BusinessEntities.Security, long, long, StockSharp.BusinessEntities.Trade)
Ниже обозначу обнаруженные проблемы с предлогаемым вариантом решения.
- Security. Отметим, что S# предоставляет возможность самостоятельно реализовать свой генератор ID интсрументов через StockSharp.Algo.SecurityIdGenerator Однако я все же обозначу проблемы связанные с использованием генератора по умолчанию. ID = ClassCode@SecurCode Данный генератор не обеспечивает уникальность так как, к примеру, для фьючерсов фортс ежегодно данный ID будет повторяться, что не есть гуд. Более того при выгрузке из разных источников данное значение тоже может совпасть. я бы предложил следующую схему построения ID инструмента: Предлогаю ключ: SourceName + DateTime.Now.Year@ + lassCode + SecurCode Где SourceName Имя источника данных, из которого выгружен инструмент.
P.S. при использовании StockSharp.Algo.SecurityIdGenerator для QUIKTrader к примеру ID = QUIK_ClassCode@SecurCode если достать стакан то значение StockSharp.BusinessEntities.MarketDepth.Security.ID будет QUIK_QUIK_ClassCode@SecurCode. кажеться это баг.
Portfolio Как я понимаю ID портфеля есть его имя. Здесь тоже хотелось бы добавить имя источника данных. Так же есть проблема с QUIKTrader. Как я понял Portfolio.Name а соответственно и ID портфеля совпадают с значением колонки торговый счет. К сожалению, торговый счет не является уникальной характеристикой клиентов на ФОРТС из за существования так называемых разделов. (Группы клиентов имеющие те или иные привилегии, например пониженную комиссию) В разных разделах могут существовать одинаковые торговые счета по факту принадлежащие разным людям. Разделы нумеруются по порядку от 0 до 99 номер раздела можно получить из колонки Фирма как последние две цифры. Припаяв к торговому чету номер раздела, получим уникальный ID. Предлогаю ключ: SourceName + PortfolioID Для квика PortfolioID = торговый счет + Фирма
Trades Исходя из сигнатуры функции StockSharp.Algo.BaseTrader.GetTrade(StockSharp.BusinessEntities.Security, long TradeID, System.Func<long,StockSharp.BusinessEntities.Trade>) номер сделки получается как сумма ID инструмента и номера сделки. Однако на некоторых американских биржах нумерация заявок начинается ежедневно с 0. Так что возможно есть смысл добавить в ключ дату сделки TradeDate. Предлагаю ключ: Инструмент + номер сделки + дата сделки
Order С ордерами чуть более сложная ситуация чем со всем остальным, так как на некоторых биржах (например на ФОРТС) заявки выставленные в вечерню сессию приедут к нам на следующий день. Здесь ситуация следующая к примеру заявка с номером 7777 на фортс (класс SPBFUT) предположим 24.04.12 7777 SPBFUT 24.04.12 на следующий день получим как минимум сразу две заявки 7777 SPBEVN 24.04.12 (изменился класс на SPBEVN) 7777 SPBFUT 25.04.12 (изменилась дата постановки) еще может приехать сама 7777 SPBFUT 24.04.12 Поэтому ключ, который напрашивается: Инструмент + номер заявки + дата заявки. Начнет плодить лишние заявки. Предлагаю Ключ: Для биржи с ежедневной нумерацией с 0: Инструмент + номер заявки + дата заявки Для биржи с "глобальной" нумерацией: Инструмент + номер заявки + (запрет на изменение кода класса и даты постановки заявки)
MyTrades Здесь не совсем ясно какой ключ. Однако, как показывают тесты, в случае если два робота совершат сделку друг с другом (одна при удовлетворении заявки на покупку, вторая удовлетворение заявки на продажу) которые отличаться только направлением порождающей сделку заявки в таблице MyTrades мы увидим только дну сделку (хотя по факту их две). Предлагаю ключ: Инструмент + номер сделки + дата сделки + направление порождающей заявки
Comentários (8)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
Выглядит очень сложно. Например, не понятно, зачем разделять инструменты для разных источников.
Дополню ответ Михаила.
За 2.5 года работы с таким не встречались. Покажите, пожалуйста, скриншоты 2х квиков, у которых будет совпадать торговый счёт, но различаться фирма. И я пока не могу придумать ситуации, когда эти 2 квика будут запущены на 1м компьютере и использоваться Stock#.
На каких? Эта проблема может возникнуть только если робот со S# запущен 24\5.
Сделки с вечерней сессии не приедут. Они фильтруются и обрабатываются внутри.
Сделки, где оба контрагента одно и тоже лицо запрещены. Биржа их не пропустит. Будет ошибка про один и тот же ИНН.
То что вы предлагаете - это усложнение, которое, на данный момент, точно не актуально. Возможно когда-нибудь к нему и придём, но сейчас нужды нет.
Отправил скриншот "Portfolios.bmp" на info@stocksharp.com
Например на LSE Предложенный ключ: Инструмент + номер сделки + дата сделки При условии уникальности ключа инструмента обеспечит 100% унакальность ключа сделки и как следствие исключит возможность неожиданных потерь данных.
призойдет update сделки 7777 и будет казаться что ее выставили 25.04.12 хотя по факту она была выставлена 24.04.12
сдесь важно добавить в ключ ID инструмента так как если грузить с разных бирж (используя разные коннекторы обьедененные в BasketTrader) вероятность совпадения номеров заявок достаточно велика.
у меня может быть два разных счета зарегестрованных на два разных юридических лица (по факту одно и тоже) Такая ситуация реальна. Отправил скриншот "MyDeals.bmp" на info@stocksharp.com (две сделки с одинаковым номером. Порядковые номера в таблице 17, 18)
В своей программе я наблюдаю целый каскад ошибок. Утилита Verifier генерирует список ошибок на несколько сотен строк. Вышеописанные проблемы есть их источник (возможно не только они). Возможно эти проблемы возникают не только у меня, просто они не отмечены на форуме. Однако с ростом числа коннекторов и людей работающих с ними в связке ошибки начнут возникать не только у меня.
Требуемые доработки весьмы просты.
Изменить принцеп формирования Portfolio.name в QUIKTrader
Изменить сигнатуры функций StockSharp.Algo.BaseTrader.GetOrderByTransactionId(long ID ) StockSharp.Algo.BaseTrader.GetTrade(StockSharp.BusinessEntities.Security, long TradeID, System.Func<long,StockSharp.BusinessEntities.Trade>) StockSharp.Algo.BaseTrader.AddMyTrade(StockSharp.BusinessEntities.Security, long, long, StockSharp.BusinessEntities.Trade) и несколько поменять операции выборки в нутри них. Правда после этого предеться немного изменить все существующие коннекторы, однако возможно это лучше сделать сейчас.
Для 2) как вариант можно еще заменить ВСЕ ключи коллекций на string и подобно StockSharp.Algo.SecurityIdGenerator Сделать string TradeIDGenerator.GenerateID(Security iSecur, long iNum, string date); string OrderIdGenerator.GenerateID(Security iSecur, long iNum, string date); string MyTradeIDGenerator.GenerateID(Trade iTrade, Order iOrder); Предоствив пользователю возможность сочинять какие угодно ключи.
Все вышеописанные доработки я готов выполнить лично.
P.S. Да, для ориентированного на людей торгущих на ММВБ и РТС с одного двух счетов существующей версии S# вполне достаточно. Однако, благодоря крайне высокому качеству имеющейся кодовой базы (как с точки зрения архитектуры, так и с точки зрения оформелния кода), потрясающе ясным интерфейсам, со временем S# может вырости в нечно большее, намного большее. И возможно есть смысл заложить основание для будущего роста уже сейчас.
Действительно ли вам это сейчас необходимо при работе со StockSharp? Или вы заглядываете и думаете о будущем?
Если нужно сейчас - просьба расписать по приоритетам проблемы из вышеобозначенных, которые необходимо решить.
Приоритеты с точки зрения имеющихся ошибок.
Однако, я бы хотел обозначить некоторый подводный камень который мне видиться. Построим диаграмму зависимости бизнес сущностей S# (какие являються базовыми а какие являються производными)
Рассмотрим к примеру Position он являеться производным от Portfolio и Security, соответсвенно имеет ключ portfolio + security. При не уникальном ключе portfolio получим как следсвие не уникальный ключ position (Эту ошибку удаеться реально наблюдать). Я обозначаю эту проблему к тому, что если поправить ключ коллекции MyTrades не поправив ключ Trades (он останеться не уникальным) по факту мы просто закопаем ошибку глубже.
По этому ключи нужно поправлять идя по диаграмме с лева на право. Таким образом приоритеты изменения ключей коллекций, соблюдение которых гарантирует не появление новых ошибок.
Соответсвенно что бы вылечить ключ MyTrades (не уникальность которого проявляет себя в зарегистированных ошибках), по хорошему перед этим нужно вылечить все остальные ключи.
Не видна диаграмма.
И вы не ответили на главный вопрос - действительно ли вам это надо для работы? Или хочется сделать просто чтоб было?
Я так понимаю вы как юрлицо будете работать с библиотекой?
Доработка нужна для работы.
Работаю с библиотекой как физ лицо.
Нажимал F5, у вас кривая ссылка на скриншот. Его нет.
Вы работаете с библиотекой как физ лицо, но выше писали о проблемах, которые возникают либо для юр лиц, либо для несуществующих пока коннекторов (к примеру, LSE). В общем я пока не особо понимаю вашу заинтересованность и вашу необходимость.
Предлагаю пообщаться через скайп, amukhanchikov.