Список задач
Atom
29.12.2010
Mikhail Sukhov


И так, предлагаю подытожить то, что нужно сделать и в каком порядке.

Задачи сгруппировал по группам (копировал из соседней ветки http://stocksharp.com/forum/1275/&p=2). Первая группа - самая приоритетная. Без нее делать задачи из следующей бессмысленно. Сами задачи внутри этой группы так же выстроены по очередности.

Базовая группа:

  1. Описать основные метаданные, как это сделано для Квика (DdeSecurityColumns, DdeTradeColumns и т.д.). Я это уже показал на примере класса PlazaFutureColumns, но там колонки не реальные. Предлагаю прямо разобрать по названию таблиц потоков, кто за какие будет отвечать (описывать в коде). Таблицы только основные: инструменты, заявки, сделки и т.д.
  2. Подписываться на произвольные потоки + отписываться.
  3. Получать стаканы. Производная от предыдущей задача. Выделил ее отдельно.
  4. Заявки (регистрация, снятие и перемещение). Я уже сделал через класс Message заполнение полей для отправки транзакций. Это дело надо доделать.
  5. Парсинг ответа от транзакций (внимание! всех транзакций, а не только, что в предыдущем пункте). Я не знаю, в каком виде они приходят, но могу сказать, какой результат должен быть. Это должно быть PlazaException с кодом ошибки (чтобы не мучится сравнение строчек в коде). И код не ввиде числа (что не так уж лучше строчки), а нормального перечисления (enum).


Первую задачу предлагаю сделать сообща. Остальные - разбираем по тем признакам, кто какие таблицы описывал (например, кто описал стакан, тот занимается задачей 3, кто инструменты - задачей 2, кто заявки - задачей 4).

Второстепенная группа:

  1. Дописать все остальные метаданные (позиции, счета, волатильность, маржа, клиринг, доп информация о деривативах, индексы).
  2. Фильтрация потоков. Так как Плаза не дает фильтр (камрад skuvv написал об этом), но в клиентском коде прописывать фильтры дело не благодарное, предлагаю это симулировать через RegisterXXX + UnRegisterXXX.
  3. Возможность задавать глубину стакана (как я понял, это влияет на то, к какому потоку необходимо цепляться).
  4. Поддержка агрегированного стакана и обычного. Для этого можно использовать GroupedQuote (внутри себя он будет содержать не агрегированные котировки).


Третьестепенная группа:

  1. С помощью метаданных научиться строить конфиги ini. Как вариант, через PlazaTable (куда собственно и будут добавляться колонки из пункта 1 пред группы). Сейчас ini файлы программно редактировать нельзя. И если роботу нужны спец колонки нужно менять формат ini схем. Я предлагаю до загрузки этих схем давать возможность менять из программно (парсить и менять ini файлы на лету). + как фича автоматически сканировать директорию при старте и создавать с правильным набором колонок сами PlazaTable. Возможно, здесь поможет TableSet.
  2. Время биржи.
  3. Все остальные транзакции (FutChangeClientMoney, OptChangeExpiration и т.д.).
  4. Составные инструменты.
  5. На форуме доступна x64 версия. Нужна прозрачная поддержка (без перекомпиляции) x86 и x64.
  6. Обертка над роутером (чтобы так же, не ручками править конфиги, а программно).
  7. Документация (как xml, так и обычная). Если нужно сделать как у S#, то необходимо использовать Sandcastle.


Особенности в работе.

Старайтесь писать так, как это принято в .NET и в частности C# коде.
Публичные методы классы и т.д. описывайте xml комментариями (лучше не сочинять, а копировать из документации Плазы, чтобы быть не с планеты Юпитер, а ближе к тем, кто будет это использовать и вторым глазом подглядывать в документацию).
Предлагаю использовать R# как средство для контроля качества кода.
Пишите юнит тесты (заведите отдельный проект в sln).

Теги:


Спасибо:


<< < 6 7 8 
aspirant

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


Михаил,

Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для наглядности выложить пример на WPF. Как это лучше сделать?

Еще, если я залью на сервер изменения, я так понимаю, их же можно будет потом назад откатить?
Спасибо:

Mikhail Sukhov

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


aspirant

Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для наглядности выложить пример на WPF. Как это лучше сделать?


Написать сюда или картинку вставить.

aspirant

Еще, если я залью на сервер изменения, я так понимаю, их же можно будет потом назад откатить?


Можно, но муторно как и любой откат.
Спасибо:

aspirant

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


Что я предлагаю:
  1. Сейчас все метаданные описаны классами-наследниками PlazaColumns, что не совсем соответствует иерархии метаданных самой Плазы. Я предлагаю создать абстрактный класс PlazaReplicationStream (название можно как-нибудь сократить, например PlazaReplStream), наследники которого будут соответствовать потокам репликации, например, FortsOptTradeReplicationStream - FORTS_OPTTRADE_REPL, RtsIndexReplicationStream - RTS_INDEX_REPL и т.д. По аналогии со структурой PlazaColumns в самом PlazaReplicationStream будут открытые переменные readonly для каждого потока репликации, например
    Код
    public static readonly FortsOptTradeReplicationStream FortsOptTradeRepl = new FortsOptTradeReplicationStream();
    public static readonly RtsIndexReplicationStream RtsIndexRepl = new RtsIndexReplicationStream();

  2. PlazaColumns предалагю переименовать в PlazaTable, потому что это все-таки таблицы, а не наборы колоннок, которые можно между собой смешивать (но это лишь моя интерпретация названия PlazaColumns). В каждом классе потоке репликации будут свои наследники PlazaTable, что будет соответствовать содержанию самих потоков репликации в Плазе. Так, что если в FORTS_OPTTRADE_REPL есть таблицы orders_log, deal, heartbeat, в классе FortsOptTradeReplicationStream будут такие поля:
    Код
    public readonly PlazaOptionOrdersLogColumns OrdersLog = new PlazaOptionOrdersLogColumns();
    public readonly PlazaOptionDealColumns Deal = new PlazaOptionDealColumns();
    public readonly PlazaHeartBeatColumns HeartBeat;

    Теперь, если нужно подписаться на весь поток FORTS_OPTTRADE_REPL и получать данные по всем таблицам, это можно сделать так:
    Код
    _plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl);

    А, если нужно подписаться только на одну таблицу, например orders_log, это можно сделать так
    Код
    _plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl.OrdersLog);

    Если нужно передать только отдельные колонки, то это делатется так:
    Код
    _plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl.OrdersLog, columns1);

    где columns1 это
    Код
    var columns1 = new PlazaColumn[]
    {
        PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplId,
        PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplRev,
        PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplAct,
        PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Price,
        PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Hedge
    };

    Кстати, уже сейчас по ходу написания родилась мысль, что в последнем примере вместо IEnumerable<PlazaColumn> можно будет передавать новый класс, называющийся, например, PlazaColumnListBuilder, который, во-первых, будет за клиента автоматом добавлять первыми тремя колонками служебные колонки ReplId, ReplRev, ReplAct (это обязательно, иначе не подключишься), а, во-вторых, будет проверять, чтобы все колонки были одной таблицы.
  3. Нынешний PlazaTable предлагаю переименовать в PlazaTableConfiguration. Он будет уметь сохранять заданную конфигурацию таблицы (читай нужный набор колоннок) в ini-файле в формате Плазы, а также создаваться из таких файлов для последующего подключения к потокам репликации.
  4. PlazaTableTypes нужно, наверное, либо прицепить к наследникам PlazaReplicationStream, либо убрать вообще.

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

Mikhail Sukhov

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


Не могу сейчас развернуто вникнуть в суть проблемы.

1. Я думаю это неправильно. Иерархия Плазы как раз сама по себе избыточная (я так понимаю тогда задача стояла сделать что то по быстрому, а не что-то стоящее). Идти за их иерархией - просто повторять их ошибки.

2. PlazaTable - это то что конфигурируется пользователем. PlazaColumns - базовый класс, содержащийся основные поля. Даже не представляю, как одно может заменить другое... Плюс дальше по описанию вижу, что пользователю предлагается вынести управление потоками. Я однозначно понял за последнее время - этого делать не нужно. Лучше придерживать принципа инкапсуляции. Разрушить его можно в любое время (что опять же не очень хорошо).

3. Скажу так, все эти PlazaColumnListBuilder PlazaTableConfiguration говорит о том, что уже начался овер дизайн.[biggrin] Надо как-то проще. Потому что сейчас уже не совсем понятно. Что будет потом? А что будет с теми пользователями, которые захотят переползти с голой Плазы? Одно сложное на другое сложно не меняют.
Спасибо:

aspirant

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


Похоже я нагородил кучу лишнего. Короче все это нужно отринуть.

МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы? Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable? А если не он, то что это будет за класс, и как он будет связан с PlazaTable?

По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее:
  1. Создать буфер накопления входящих данных стрима.
  2. Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.
  3. Фильтрация входящих данных.
  4. Создание пула CP2ConnectionClass'ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.


Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи. Самым сложным и интересным вижу пункт 3.
Спасибо:

Mikhail Sukhov

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


aspirant
Похоже я нагородил кучу лишнего. Короче все это нужно отринуть.

МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы? Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable? А если не он, то что это будет за класс, и как он будет связан с PlazaTable?


Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться?

aspirant

По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее:
  1. Создать буфер накопления входящих данных стрима.
  2. Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.
  3. Фильтрация входящих данных.
  4. Создание пула CP2ConnectionClass'ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.


Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи. Самым сложным и интересным вижу пункт 3.


Ок, тогда по первому задавать вопросы не буду.

2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream?
3. Распиши, как ты это видишь и где это нужно сделать.
4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])
Спасибо:

aspirant

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


Mikhail Sukhov

Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться?

Просто, чтобы понимать куда передавать данные дальше. Сейчас они приходят по одной записи/строчке в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) класса PlazaStream.

Mikhail Sukhov

2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream?


Да, причем, на мой взгляд, клиентскому коду лучше не давать доступа к PlazaTableSerializer. Пускай он это лучше делает через методы Load/Save класса PlazaTable. Формат ini-файлов это внутренность Плазы, и ее лучше, хотя бы на первых порах, инкапсулировать от клиентского кода.


Mikhail Sukhov

3. Распиши, как ты это видишь и где это нужно сделать.


Создать интерфейс IPlazaStreamFilter, у которого будет метод bool Validate(object value) и свойство string ColumnName. В конструктор PlazaTable передавать IEnumerable<IPlazaStreamFilter>, который, в свою очередь будет эту энумерацию передавать в конструктор PlazaStream. Внутри себя PlazaStream в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) будет перебирать эту энумерацию, вызывать для каждого элемента метод Validate(object Value) и передавать данные, приходящие в потоке репликации, дальше (в клиентский код) только, если все вызовы Validate(object Value) возвращают true. Но это только верхушка айсберга, потому что, оперируя понятиями SQL, мы только реализуем AND связки, например, price>100 AND code_vcb=xyz. А нужно еще предосмотреть, как минимум связку OR, например, price>100 OR code_vcb=xyz. Дальше я пока над этим не думал.


Mikhail Sukhov

4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])

Да, это точно на потом. Сначала нужно с первыми тремя задачами разобраться.
Спасибо:

guk

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


Взял
Цитата:
4. Составные инструменты.
из
Цитата:
Третьестепенная группа:
Спасибо:
<< < 6 7 8 

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

loading
clippy