Список задач
Atom Ответить
29.12.2010


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

Задачи сгруппировал по группам (копировал из соседней ветки https://stocksharp.ru/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).

Теги:


Спасибо:




78 Ответов
<< < 2 3 4 
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. Составные инструменты.
из
Цитата:
Третьестепенная группа:
Спасибо:
<< < 2 3 4 

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

loading
clippy