Ключи коллекций.
Atom
14.05.2012
ASorokovoy


Здравствуйте.
Я использую сток шарп уже примерно пол года, причем последнее время очень активно.
В процессе активного использования я обнаружил некоторые проблемы и хотел бы осветить их в данном посте.

Использование 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)

Ниже обозначу обнаруженные проблемы с предлогаемым вариантом решения.

1) 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. кажеться это баг.

2) Portfolio
Как я понимаю ID портфеля есть его имя. Здесь тоже хотелось бы добавить имя источника данных.
Так же есть проблема с QUIKTrader. Как я понял Portfolio.Name а соответственно и ID портфеля совпадают с значением колонки торговый счет.
К сожалению, торговый счет не является уникальной характеристикой клиентов на ФОРТС из за существования так называемых разделов. (Группы клиентов имеющие те или иные привилегии, например пониженную комиссию)
В разных разделах могут существовать одинаковые торговые счета по факту принадлежащие разным людям. Разделы нумеруются по порядку от 0 до 99 номер раздела можно получить из колонки Фирма как последние две цифры.
Припаяв к торговому чету номер раздела, получим уникальный ID.
Предлогаю ключ: SourceName + PortfolioID
Для квика PortfolioID = торговый счет + Фирма


3) Trades
Исходя из сигнатуры функции
StockSharp.Algo.BaseTrader.GetTrade(StockSharp.BusinessEntities.Security, long TradeID, System.Func<long,StockSharp.BusinessEntities.Trade>)
номер сделки получается как сумма ID инструмента и номера сделки.
Однако на некоторых американских биржах нумерация заявок начинается ежедневно с 0. Так что возможно есть смысл добавить в ключ дату сделки TradeDate.
Предлагаю ключ: Инструмент + номер сделки + дата сделки

4) 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: Инструмент + номер заявки + дата заявки
Для биржи с "глобальной" нумерацией: Инструмент + номер заявки + (запрет на изменение кода класса и даты постановки заявки)

5) MyTrades
Здесь не совсем ясно какой ключ. Однако, как показывают тесты, в случае если два робота совершат сделку друг с другом
(одна при удовлетворении заявки на покупку, вторая удовлетворение заявки на продажу) которые отличаться только направлением порождающей сделку заявки
в таблице MyTrades мы увидим только дну сделку (хотя по факту их две).
Предлагаю ключ: Инструмент + номер сделки + дата сделки + направление порождающей заявки

Теги:


Спасибо: OvcharenkoVI


Mikhail Sukhov

Фотография
Дата: 14.05.2012
Ответить


Выглядит очень сложно. Например, не понятно, зачем разделять инструменты для разных источников.
Спасибо:

Alexander

Фотография
Дата: 14.05.2012
Ответить


Дополню ответ Михаила.

ASorokovoy
2) Portfolio
Как я понимаю ID портфеля есть его имя. Здесь тоже хотелось бы добавить имя источника данных.
Так же есть проблема с QUIKTrader. Как я понял Portfolio.Name а соответственно и ID портфеля совпадают с значением колонки торговый счет.
К сожалению, торговый счет не является уникальной характеристикой клиентов на ФОРТС из за существования так называемых разделов. (Группы клиентов имеющие те или иные привилегии, например пониженную комиссию)
В разных разделах могут существовать одинаковые торговые счета по факту принадлежащие разным людям. Разделы нумеруются по порядку от 0 до 99 номер раздела можно получить из колонки Фирма как последние две цифры.
Припаяв к торговому чету номер раздела, получим уникальный ID.
Предлогаю ключ: SourceName + PortfolioID
Для квика PortfolioID = торговый счет + Фирма



За 2.5 года работы с таким не встречались.
Покажите, пожалуйста, скриншоты 2х квиков, у которых будет совпадать торговый счёт, но различаться фирма.
И я пока не могу придумать ситуации, когда эти 2 квика будут запущены на 1м компьютере и использоваться Stock#.




ASorokovoy
3) Trades
Исходя из сигнатуры функции
StockSharp.Algo.BaseTrader.GetTrade(StockSharp.BusinessEntities.Security, long TradeID, System.Func<long,StockSharp.BusinessEntities.Trade>)
номер сделки получается как сумма ID инструмента и номера сделки.
Однако на некоторых американских биржах нумерация заявок начинается ежедневно с 0. Так что возможно есть смысл добавить в ключ дату сделки TradeDate.
Предлагаю ключ: Инструмент + номер сделки + дата сделки


На каких?
Эта проблема может возникнуть только если робот со S# запущен 24\5.




ASorokovoy
4) 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: Инструмент + номер заявки + дата заявки
Для биржи с "глобальной" нумерацией: Инструмент + номер заявки + (запрет на изменение кода класса и даты постановки заявки)


Сделки с вечерней сессии не приедут. Они фильтруются и обрабатываются внутри.





ASorokovoy
5) MyTrades
Здесь не совсем ясно какой ключ. Однако, как показывают тесты, в случае если два робота совершат сделку друг с другом
(одна при удовлетворении заявки на покупку, вторая удовлетворение заявки на продажу) которые отличаться только направлением порождающей сделку заявки
в таблице MyTrades мы увидим только дну сделку (хотя по факту их две).
Предлагаю ключ: Инструмент + номер сделки + дата сделки + направление порождающей заявки


Сделки, где оба контрагента одно и тоже лицо запрещены. Биржа их не пропустит. Будет ошибка про один и тот же ИНН.



То что вы предлагаете - это усложнение, которое, на данный момент, точно не актуально.
Возможно когда-нибудь к нему и придём, но сейчас нужды нет.
Спасибо:

ASorokovoy

Фотография
Дата: 17.05.2012
Ответить


Alexander Mukhanchikov

За 2.5 года работы с таким не встречались.
Покажите, пожалуйста, скриншоты 2х квиков, у которых будет совпадать торговый счёт, но различаться фирма.
И я пока не могу придумать ситуации, когда эти 2 квика будут запущены на 1м компьютере и использоваться Stock#.


Отправил скриншот "Portfolios.bmp" на info@stocksharp.com

Alexander Mukhanchikov

На каких?
Эта проблема может возникнуть только если робот со S# запущен 24\5.


Например на LSE
Предложенный ключ: Инструмент + номер сделки + дата сделки
При условии уникальности ключа инструмента обеспечит 100% унакальность ключа сделки и как следствие исключит возможность неожиданных потерь данных.


Alexander Mukhanchikov

ASorokovoy

7777 SPBFUT 24.04.12
на следующий день получим как минимум сразу две заявки
7777 SPBEVN 24.04.12 (изменился класс на SPBEVN)
7777 SPBFUT 25.04.12 (изменилась дата постановки)


Сделки с вечерней сессии не приедут. Они фильтруются и обрабатываются внутри.


призойдет update сделки 7777 и будет казаться что ее выставили 25.04.12 хотя по факту она была выставлена 24.04.12

сдесь важно добавить в ключ ID инструмента так как если грузить с разных бирж (используя разные коннекторы обьедененные в BasketTrader) вероятность совпадения номеров заявок достаточно велика.

Alexander Mukhanchikov

Сделки, где оба контрагента одно и тоже лицо запрещены. Биржа их не пропустит. Будет ошибка про один и тот же ИНН.


у меня может быть два разных счета зарегестрованных на два разных юридических лица (по факту одно и тоже)
Такая ситуация реальна. Отправил скриншот "MyDeals.bmp" на info@stocksharp.com (две сделки с одинаковым номером. Порядковые номера в таблице 17, 18)

Alexander Mukhanchikov

То что вы предлагаете - это усложнение, которое, на данный момент, точно не актуально.
Возможно когда-нибудь к нему и придём, но сейчас нужды нет.


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

Mikhail Sukhov

Выглядит очень сложно.


Требуемые доработки весьмы просты.
1) Изменить принцеп формирования Portfolio.name в QUIKTrader

2) Изменить сигнатуры функций
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# может вырости в нечно большее, намного большее. И возможно есть смысл заложить основание для будущего роста уже сейчас.



Спасибо:

Alexander

Фотография
Дата: 20.05.2012
Ответить


Действительно ли вам это сейчас необходимо при работе со StockSharp? Или вы заглядываете и думаете о будущем?

Если нужно сейчас - просьба расписать по приоритетам проблемы из вышеобозначенных, которые необходимо решить.
Спасибо:

ASorokovoy

Фотография
Дата: 21.05.2012
Ответить


Alexander Mukhanchikov
Действительно ли вам это сейчас необходимо при работе со StockSharp? Или вы заглядываете и думаете о будущем?

Если нужно сейчас - просьба расписать по приоритетам проблемы из вышеобозначенных, которые необходимо решить.


Приоритеты с точки зрения имеющихся ошибок.

  1. Реально обнаруженные проблемы
    - а) Проблема в QUIKTrader c Portfolio.Name
    - б) Ключ коллекции MyTrades
  2. Высокая вероятность возникновления ошибок.
    - а) Ключ коллекции Orders
    - б) Ключ коллекции Trades
    Вполне вероятно что ошибки есть но я их не вижу.
  3. Ошибки можно поправить собственным "костылем"
    - при использовании StockSharp.Algo.SecurityIdGenerator для QUIKTrader к примеру
    ID = QUIK_ClassCode@SecurCode
    если достать стакан то значение
    StockSharp.BusinessEntities.MarketDepth.Security.ID будет QUIK_QUIK_ClassCode@SecurCode.


Однако, я бы хотел обозначить некоторый подводный камень который мне видиться.
Построим диаграмму зависимости бизнес сущностей S# (какие являються базовыми а какие являються производными)
Зависимость бизнес сущностей

Рассмотрим к примеру Position он являеться производным от Portfolio и Security, соответсвенно имеет ключ
portfolio + security. При не уникальном ключе portfolio получим как следсвие не уникальный ключ position (Эту ошибку удаеться реально наблюдать). Я обозначаю эту проблему к тому, что если поправить ключ коллекции MyTrades не поправив ключ Trades (он останеться не уникальным) по факту мы просто закопаем ошибку глубже.

По этому ключи нужно поправлять идя по диаграмме с лева на право. Таким образом приоритеты изменения ключей коллекций, соблюдение которых гарантирует не появление новых ошибок.

  1. Проблема в QUIKTrader c Portfolio.Name
  2. Ключ коллекции Orders
    Предлагаю Ключ:
    Для биржи с ежедневной нумерацией с 0: Security.ID + номер заявки + дата заявки
    Для биржи с "глобальной" нумерацией: Security.ID + номер заявки + (запрет на изменение кода класса и даты постановки заявки)
  3. Ключ коллекции Trades
    Предлагаю ключ: ID = Security.ID + номер сделки + дата сделки
  4. Ключ коллекции MyTrades
    Предлагаю ключ: ID = Trade.ID + Order.Direction


Соответсвенно что бы вылечить ключ MyTrades (не уникальность которого проявляет себя в зарегистированных ошибках), по хорошему перед этим нужно вылечить все остальные ключи.

Mikhail Sukhov
Например, не понятно, зачем разделять инструменты для разных источников.

Важно разделять инструменты из разных источников, так как при выгрузке из разных источников ID инструметов может случайно совпасть и в силу того, что в иерархии зависимостей Security находиться в основании, это вызовет целый каскад ошибок, отыскать среди которых корень может оказаться сложно.
Спасибо:

Alexander

Фотография
Дата: 21.05.2012
Ответить


Не видна диаграмма.

И вы не ответили на главный вопрос - действительно ли вам это надо для работы? Или хочется сделать просто чтоб было?

Я так понимаю вы как юрлицо будете работать с библиотекой?
Спасибо:

ASorokovoy

Фотография
Дата: 21.05.2012
Ответить


Alexander Mukhanchikov
Не видна диаграмма.

Что то глючит. Нажмите F5.

Alexander Mukhanchikov
И вы не ответили на главный вопрос - действительно ли вам это надо для работы? Или хочется сделать просто чтоб было?


Доработка нужна для работы.

Alexander Mukhanchikov
Я так понимаю вы как юрлицо будете работать с библиотекой?


Работаю с библиотекой как физ лицо.
Спасибо:

Alexander

Фотография
Дата: 21.05.2012
Ответить


ASorokovoy
Alexander Mukhanchikov
Не видна диаграмма.

Что то глючит. Нажмите F5.

Alexander Mukhanchikov
И вы не ответили на главный вопрос - действительно ли вам это надо для работы? Или хочется сделать просто чтоб было?


Доработка нужна для работы.

Alexander Mukhanchikov
Я так понимаю вы как юрлицо будете работать с библиотекой?


Работаю с библиотекой как физ лицо.



Нажимал F5, у вас кривая ссылка на скриншот. Его нет.

Вы работаете с библиотекой как физ лицо, но выше писали о проблемах, которые возникают либо для юр лиц, либо для несуществующих пока коннекторов (к примеру, LSE).
В общем я пока не особо понимаю вашу заинтересованность и вашу необходимость.

Предлагаю пообщаться через скайп, amukhanchikov.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy