Список задач
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 Ответов
< 1 2 3 4  >
aspirant

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


Описал метаданные по опционам. Вопрос к знающим: нужно описывать таблицу
opt_rejected_orders - Отвергнутые в клиринг заявки?
Спасибо:

lkor

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


добавил таблицу deal из FORTS_FUTTRADE_REPL

PS Таблица совпадает с deal из FORTS_OPTTRADE_REPL (опять отличие в разных вариантах значений поля status)
Спасибо:

lkor

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


таблица heartbeat из FORTS_FUTTRADE_REPL уже существует в виде PlazaHeartBeatColumns, собственно её не описываю.

добавил таблицы multileg_deal и multileg_orders_log из FORTS_FUTTRADE_REPL
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.01.2011
Ответить


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

PlazaFutCommonColumns:

  1. Наследования от базового класса PlazaColumns отсутствует.
  2. Cо статических полей переделать на обычные (иначе наследование работать не будет), и записать свою таблицу в PlazaColumns как статическое поле.
  3. Придерживаться .NET стиля. Тоесть, не Sess_id, а SessId, не status а Status.
  4. Если таблица одинаковая для опцов и фьючей, то и называть класс нужно Derivative, а не Futute. Как плюс, задел на будущее, что РТС расширит поля в одной из таблиц, и тогда они перестанут быть эквивалентными. Тогда можно будет сделать Derivative абстрактным и сделать два специфичных наследника.
  5. Таблицы FORTS_FUTCOMMON_REPL и FORTS_OPTCOMMON_REPL не одинаковы. Это значит что уже сейчас надо выносить в базовый класс общие поля и производить наследование. Особенно, обратить внимание на передачу типа таблицы в базовый класс. Как пример, PlazaDerivativeColumns и PlazaOptionColumns.


PlazaFutTradeDealColumns, PlazaFutTradeMultilegDealColumns, PlazaFutTradeMultiLegOrdersLogColumns, PlazaFutTradeOrdersLogColumns:

  1. Тоже самое, что и PlazaFutCommonColumns, кроме наследования от PlazaColumns.
  2. Везде указывается тип таблицы Trade. Так ли это?


PlazaHeartBeatColumns

  1. Неправильный тип таблицы у ServerTime.
  2. Это единственная таблица с системными данными? Если нет, то название System не подходит.
  3. Конструкторы у классов с метаданными лучше делать internal.


Насчет общего стиля именования. Предлагаю, писать полностью имена, тоесть:

OrdId -> OrderId
SessId -> SessionId
Dir -> Direction

Название ISIN можно писать как ISIN, Isin, но никак не IsIn. Аббревиатуры (в данном случае International Securities Identification Number) так не пишутся.

Предлагаю не писать тип данных в комментариях к поля (i) (t) и т.д.. Добавляет лишнюю смысловую нагрузку, которая по сути вряд ли будет использоваться из вне.
Автор топика
Спасибо:

skuvv

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


Mikhail Sukhov Перейти

Насчет общего стиля именования. Предлагаю, писать полностью имена, тоесть:

OrdId -> OrderId
SessId -> SessionId
Dir -> Direction

Название ISIN можно писать как ISIN, Isin, но никак не IsIn. Аббревиатуры (в данном случае International Securities Identification Number) так не пишутся.

Предлагаю не писать тип данных в комментариях к поля (i) (t) и т.д.. Добавляет лишнюю смысловую нагрузку, которая по сути вряд ли будет использоваться из вне.

А есть ли смысл менять названия полей? Поидее по документам plaza будет легче сопостовлять поля если они будут с оригинальными совпадать...
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.01.2011
Ответить


skuvv Перейти
А есть ли смысл менять названия полей? Поидее по документам plaza будет легче сопостовлять поля если они будут с оригинальными совпадать...


Названия я предлагаю не менять, а дописывать до полного... В любом случае, будет много, что не как в стандартном АПИ. Но нужно одновременно сделать удобным и работу с документацией Plaza, и дальнейшей работой с роботом. Мне кажется, что документация по Плазе нужна только в первое время. В дальнейшем видеть в коде названия ordid sessid и т.д. не очень приятно. Но это только мое мнение.
Автор топика
Спасибо:

aspirant

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


Mikhail Sukhov Перейти

PlazaHeartBeatColumns

  1. Неправильный тип таблицы у ServerTime.
  2. Это единственная таблица с системными данными? Если нет, то название System не подходит.
  3. Конструкторы у классов с метаданными лучше делать internal.



исправил


Mikhail Sukhov Перейти

Насчет общего стиля именования. Предлагаю, писать полностью имена, тоесть:

OrdId -> OrderId
SessId -> SessionId
Dir -> Direction

Название ISIN можно писать как ISIN, Isin, но никак не IsIn. Аббревиатуры (в данном случае International Securities Identification Number) так не пишутся.


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

Насчет IsIn'а я ступил. Предлагаю Isin, потому что, во-первых, кроме Isin'а еще будет переменная IsinId, а во-вторых, это в духе .Net'а, см. System.Xml.


Mikhail Sukhov Перейти

Предлагаю не писать тип данных в комментариях к поля (i) (t) и т.д.. Добавляет лишнюю смысловую нагрузку, которая по сути вряд ли будет использоваться из вне.


Пожалуй, это действительно был перебор, сейчас исправлю
Спасибо:

aspirant

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


Все исправил. Не знаю только, как правильно именовать:

/// <summary>
/// Базовое ГО под одну покрытую позицию подписчика (руб)
/// </summary>
public readonly PlazaColumn bgo_c = new PlazaColumn(PlazaTableTypes.Option, "bgo_c", typeof(decimal), true);

/// <summary>
/// Базовое ГО под одну непокрытую позицию подписчика (руб)
/// </summary>
public readonly PlazaColumn bgo_nc = new PlazaColumn(PlazaTableTypes.Option, "bgo_nc", typeof(decimal), true);
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.01.2011
Ответить


aspirant Перейти
Все исправил. Не знаю только, как правильно именовать:

/// <summary>
/// Базовое ГО под одну покрытую позицию подписчика (руб)
/// </summary>
public readonly PlazaColumn bgo_c = new PlazaColumn(PlazaTableTypes.Option, "bgo_c", typeof(decimal), true);

/// <summary>
/// Базовое ГО под одну непокрытую позицию подписчика (руб)
/// </summary>
public readonly PlazaColumn bgo_nc = new PlazaColumn(PlazaTableTypes.Option, "bgo_nc", typeof(decimal), true);


Главное, не с маленькой буквы, и_убрать_подчеркивания. BgoC, BgoNc. Вполне сойдет.
Автор топика
Спасибо:

aspirant

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


Еще вопрос. Что делать с этими переменными?

/// <summary>
/// Дата окончания обращения инструмента
/// </summary>
public readonly PlazaColumn DPG = new PlazaColumn(PlazaTableTypes.Option, "d_pg", typeof(DateTime), true);

/// <summary>
/// Дата начала экспирации инструмента
/// </summary>
public readonly PlazaColumn D_Exec_Beg = new PlazaColumn(PlazaTableTypes.Option, "d_exec_beg", typeof(DateTime), true);

/// <summary>
/// Дата окончания экспирации инструмента
/// </summary>
public readonly PlazaColumn D_Exec_End = new PlazaColumn(PlazaTableTypes.Option, "d_exec_end", typeof(DateTime), true);

Решарпить плазовские названия? Или писать что-то типа:

d_pg: ExerciseDate
d_exec_beg: ExpirationStartDate
d_exec_end: ExpirationEndDate

Если мы за читаемость, я все-таки предлагаю второй вариант
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.01.2011
Ответить


aspirant Перейти

d_pg d_exec_beg d_exec_end


Как они сами в таком ужасе разбираются?

aspirant Перейти

Если мы за читаемость, я все-таки предлагаю второй вариант


Согласен.
Автор топика
Спасибо:

aspirant

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


Mikhail Sukhov Перейти
aspirant Перейти

d_pg d_exec_beg d_exec_end


Как они сами в таком ужасе разбираются?

aspirant Перейти

Если мы за читаемость, я все-таки предлагаю второй вариант


Согласен.


Готово
Спасибо:

lkor

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


Mikhail Sukhov Перейти


PlazaFutCommonColumns:

  1. Наследования от базового класса PlazaColumns отсутствует.
  2. Cо статических полей переделать на обычные (иначе наследование работать не будет), и записать свою таблицу в PlazaColumns как статическое поле.
  3. Придерживаться .NET стиля. Тоесть, не Sess_id, а SessId, не status а Status.
  4. Если таблица одинаковая для опцов и фьючей, то и называть класс нужно Derivative, а не Futute. Как плюс, задел на будущее, что РТС расширит поля в одной из таблиц, и тогда они перестанут быть эквивалентными. Тогда можно будет сделать Derivative абстрактным и сделать два специфичных наследника.
  5. Таблицы FORTS_FUTCOMMON_REPL и FORTS_OPTCOMMON_REPL не одинаковы. Это значит что уже сейчас надо выносить в базовый класс общие поля и производить наследование. Особенно, обратить внимание на передачу типа таблицы в базовый класс. Как пример, PlazaDerivativeColumns и PlazaOptionColumns.


PlazaFutTradeDealColumns, PlazaFutTradeMultilegDealColumns, PlazaFutTradeMultiLegOrdersLogColumns, PlazaFutTradeOrdersLogColumns:

  1. Тоже самое, что и PlazaFutCommonColumns, кроме наследования от PlazaColumns.
  2. Везде указывается тип таблицы Trade. Так ли это?



1. привёл все поля к .NET стилю
2. со статических переделал на обычные
3. убрал из комментариев тип поля в Плазе ( (с7), (i4) и т.д. )
4. для Plaza*OrdersLogColumns изменил тип таблицы на Order
5. переимевал PlazaFutTradeDealColumns в PlazaDerivativeTradeDealColumns, PlazaFutTradeOrdersLogColumns в PlazaDerivativeTradeOrdersLogColumns
6. добавил соответсвующие поля в PlazaColumns для таблиц из FORTS_FUTTRADE_REPL. для таблиц из FORTS_OPTTRADE_REPL поля добавил и закоментировал, ибо не мой это поток. не надо - удалим.

вроде всё.

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.01.2011
Ответить


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

Далее, задачи с 2 по 5. Задачи 2 и 3 мне кажется схожи. Поэтому, предлагаю стаканы отложить до тех пор, пока не будет закончена задача 2. Если так окажется, что желающих больше чем задач (вряд ли, но все же), то предлагаю спуститься к задачам из третьестепенной группы (второстепенные задачи слишком тесно связаны с первостепенными).

Схема стандартная - пишем кто-что хочет делать и делаем.
Автор топика
Спасибо:

aspirant

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


В принципе по опционам за исключением стаканов описал все. Хотел бы перейти к п. 2
Спасибо:

lkor

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


смотрю в сторону п.4
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.01.2011
Ответить


lkor Перейти
смотрю в сторону п.4


Тогда я п5.
Автор топика
Спасибо:

skuvv

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


Буду доделывать метаданные...
Добавил FORTS_OPTORDERBOOK_REPL и FORTS_FUTORDERBOOK_REPL.
update:
FORTS_FUTTRADE_REPL - orders_log
FORTS_FUTTRADE_REPL - multileg_orders_log
FORTS_OPTTRADE_REPL - orders_log
Привел к использованию одного базового класса.
Есть косяк почти во всех мета - типа поля i8, это не int, a int64, за 32бита перевалило еще в декабре...
Есть предложение:
1) вынести все мета-файлы в отдельное место/папку для убоства навигации
2) придерживаться для мета-файлов общего наименования типа: Plaza-RerlicationName-Type-TableName-Columns, например PlazaOrderBookFutureOrdersColumns
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.01.2011
Ответить


skuvv Перейти

Есть косяк почти во всех мета - типа поля i8, это не int, a int64, за 32бита перевалило еще в декабре...


А в чем косяк? На C# есть эквивалент - long.

skuvv Перейти

Есть предложение:
1) вынести все мета-файлы в отдельное место/папку для убоства навигации
2) придерживаться для мета-файлов общего наименования типа: Plaza-RerlicationName-Type-TableName-Columns, например PlazaOrderBookFutureOrdersColumns


1. Поддерживаю.
2. Я бы сделал PlazaFutureOrderBookOrdersColumns, так как это ближе к спецификации Плазы.

Не забывайте про комментарии в коммите.
Автор топика
Спасибо:

aspirant

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


Mikhail Sukhov Перейти
skuvv Перейти

Есть косяк почти во всех мета - типа поля i8, это не int, a int64, за 32бита перевалило еще в декабре...


А в чем косяк? На C# есть эквивалент - long.



Я везде указывал эти данные (i8), как int. Буду исправлять.
Спасибо:

aspirant

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


Mikhail Sukhov Перейти


Я бы сделал PlazaFutureOrderBookOrdersColumns, так как это ближе к спецификации Плазы.



Поддерживаю.

Спасибо:

aspirant

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


Михаил,

Только что добавил класс PlazaStream. Это пока сырой вариант, потому что есть несколько неразрешенных вопросов. Поскольку логики много, я выделил класс в отдельный файл (я знаю, что вы уже создали приватный класс DerivativeStreams). Потом окончательную версию можно будет поместить, куда нужно.

Сначала комментарий: реализация алгоритма получения данных (метод Run) навеян примером BaselessClient, который шел вместе с тестовой версией Плазы.

Предложения:
  • Предлагаю из названий потоков сделать перечисление PlazaStreamName. Могу взять на себя. В файле с классом уже есть заготовка.
  • То же самое относится к схемам репликации (перечисление PlazaReplicationSchemeName).
  • Название таблицы пока передается как строковая переменная. В принципе могу свести все названия в одно перечисление. Пока не знаю, нужно ли?

Все эти три значения нужны для подписи к потокам

Вопросы:
  1. Какого типа исключений нужно генерить? PlazaException - это для внешних/сторонних пользователей или для кода внутри проекта мы их тоже выкидываем?
  2. Какие классы внутри проекта будут пользователем класса PlazaStream и в каком виде им нужно выдавать данные (по одной записи или сразу массив записей и т.д.)? Данные приходят в событиях StreamDataInserted / StreamDataDeleted, где есть параметр типа CP2Record, который содержит значения одной записи таблицы.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 21.01.2011
Ответить


aspirant Перейти
Михаил,

Только что добавил класс PlazaStream. Это пока сырой вариант, потому что есть несколько неразрешенных вопросов. Поскольку логики много, я выделил класс в отдельный файл (я знаю, что вы уже создали приватный класс DerivativeStreams). Потом окончательную версию можно будет поместить, куда нужно.


DerivativeStreams мне кажется подобием PlazaColumns, тоесть контейнер всех доступных стримов. Так что в логике пересечения не должно быть.

aspirant Перейти

Сначала комментарий: реализация алгоритма получения данных (метод Run) навеян примером BaselessClient, который шел вместе с тестовой версией Плазы.


Мы уже убедились, какого уровня программисты работают в РТС. Так что не стоит равняться на них, даже если речь идет о примерах.BigGrin

Что касается реализации, то могу сказать следующее. PlazaStream не должен содержать логики по управлению потоком (thread, и далее по тексту, чтобы не была путаница с потоками данных РТС, которые stream). В нем вообще не должно быть создание никаких потоков. В идеале у него должны быть пару методов Open Close, и события о получении новых данных, удалении, ошибке и т.д. А вот уже управлять стримами (в том числе и создавать единый поток для обработки всех стримов) нужно в PlazaTrader.



aspirant Перейти

Предложения:
  • Предлагаю из названий потоков сделать перечисление PlazaStreamName. Могу взять на себя. В файле с классом уже есть заготовка.
  • То же самое относится к схемам репликации (перечисление PlazaReplicationSchemeName).
  • Название таблицы пока передается как строковая переменная. В принципе могу свести все названия в одно перечисление. Пока не знаю, нужно ли?

Все эти три значения нужны для подписи к потокам


1. PlazaStreamName. Енумераторы обычно окончиваются на множественное число. Плюс по логике это никакие не Name (енумы не могут содержать стринги). Я бы назвал PlazaStreams.
2. PlazaReplicationSchemesRollEyes
3. А вот тут самое интересно. А для чего собственно писали PlazaTable и мучались с метаданными? Надо использовать по максимуму ООП. Я бы передавал в стрим PlazaTable.

+

4. Такие вещи как PlazaStream неплохо бы делать IDisposable. Советую наследоваться от Disposable (Ecng.Common), он по-функциональнее.
5. Зачем стриму знать, в каком он конфиге? За это должен отвечать соответствующий TableConfigParser. И он же так же должен принимать на вход PlazaTable.


aspirant Перейти

Вопросы:
  1. Какого типа исключений нужно генерить? PlazaException - это для внешних/сторонних пользователей или для кода внутри проекта мы их тоже выкидываем?
  2. Какие классы внутри проекта будут пользователем класса PlazaStream и в каком виде им нужно выдавать данные (по одной записи или сразу массив записей и т.д.)? Данные приходят в событиях StreamDataInserted / StreamDataDeleted, где есть параметр типа CP2Record, который содержит значения одной записи таблицы.


1. Лучше стандартные, которые в .NET. Честно говоря я не помню случаем, когда бы использовал другие исключения, вместо ArgExp, ArgOutExp, ArgNullExp, InvOptExp. Все остальные какие-то натянутые, и далекие от простых будней. Разделения на внешний и внутренний не понял.
2. А вот тут не могу сказать. Как удобнее, так и надо. Тоесть Плаза за раз отсылает только одну строчку?
Автор топика
Спасибо:

aspirant

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


Mikhail Sukhov Перейти


Что касается реализации, то могу сказать следующее. PlazaStream не должен содержать логики по управлению потоком (thread, и далее по тексту, чтобы не была путаница с потоками данных РТС, которые stream). В нем вообще не должно быть создание никаких потоков. В идеале у него должны быть пару методов Open Close, и события о получении новых данных, удалении, ошибке и т.д. А вот уже управлять стримами (в том числе и создавать единый поток для обработки всех стримов) нужно в PlazaTrader.



Дело в том, что работа с плазовским стримом построена по принципу windows message loop: в неком методе программа вызывает метод CP2ConnectionClass.ProcessMessage(out cookie, PollInterval) в бесконечном цикле, а вся информация приходит через события. Если выводить создание и управление thread'ами, это нужно делать в отдельном классе. Иначе, если придется подключаться к стримам в нескольких местах, придется дублировать много кода.


Mikhail Sukhov Перейти


1. PlazaStreamName. Енумераторы обычно окончиваются на множественное число. Плюс по логике это никакие не Name (енумы не могут содержать стринги). Я бы назвал PlazaStreams.
2. PlazaReplicationSchemes



Насчет Name вы правы - уберу. По поводу множественного числа: рекомендация MS - енумераторы в множественном числе, только если они битовые флаги, поэтому все-таки настаиваю на единственном.

Mikhail Sukhov Перейти


3. А вот тут самое интересно. А для чего собственно писали PlazaTable и мучались с метаданными? Надо использовать по максимуму ООП. Я бы передавал в стрим PlazaTable.



Я помню о настраиваемости. Пока в черновом варианте я передаю путь к файлу, чтобы сразу можно было протестировать логику подключения, опроса, получения сообщений и т.д.
С метаданными такая вещь: стримы в Плазе настраиваются из файлов, даже по умолчанию (методы TableSet.InitFromIni / TableSet.InitFromIni2). Если передавать классу PlazaStream в конструкторе PlazaTable, тогда внутри PlazaStream некий класс TableConfigParser должен будет генерить файл с нужной схемой, чтобы передать ее TableSet.InitFromIni. Здесь такой момент: предлагаю в SpecialFolder.ApplicationData создать путь Stocksharp\PlazaTrader\Scheme, в котором хранить свои конфиг-схемы-файлы или их создавать в папке TEMP. Создавать их в подпапке самой Плазы не стоит: требуется админский доступ.

Mikhail Sukhov Перейти


4. Такие вещи как PlazaStream неплохо бы делать IDisposable. Советую наследоваться от Disposable (Ecng.Common), он по-функциональнее.



Сделаю

Mikhail Sukhov Перейти


1. Лучше стандартные, которые в .NET. Честно говоря я не помню случаем, когда бы использовал другие исключения, вместо ArgExp, ArgOutExp, ArgNullExp, InvOptExp. Все остальные какие-то натянутые, и далекие от простых будней. Разделения на внешний и внутренний не понял.



Чтобы понимать в будущем, в каких случаях мы выкидываем PlazaException?


Mikhail Sukhov Перейти


2. А вот тут не могу сказать. Как удобнее, так и надо. Тоесть Плаза за раз отсылает только одну строчку?



Насколько я понял, есть два варианта:
  1. По одной строчке в событии StreamDataInserted. В этом случае ты получаешь в качестве параметра CP2Record, который потом нужно опрашивать для каждой колонки с помощью методов GetValAsХХХ(string fieldName) / GetValAsХХХByIndex(uint fieldIndex)
  2. Подсоединять к стриму CP2DataBufferClass, который накапливает данные. Потом у него нужно вызывать метод get_TableRecords(string tableName), который возвращает CP2RecordEnumClass, что есть IEnumerable<CP2Record>
И там, и сям Hello, COM world!

На мой взгляд вызовы GetValAsХХХ(string fieldName) / GetValAsХХХByIndex(uint fieldIndex) нужно реализовать внутри PlazaStream, а мне чтобы дальше писать это класс нужно понимать:
  1. PlazaStream - это служебный класс, или им смогут пользоваться клиенты (читай, сторонние разработчики, использующие PlazaTrader)?
  2. В каком виде выдавать данные классам, которые будут использовать PlazaStream? Через события по одной строчке с конвертацией CP2Record в массив object'ов? Или попробовать сделать что-то типа реализации интерфейса IDataReader с использованием CP2DataBufferClass?


И последнее насчет фильтрации данных в потоке. Есть предложение это тоже сделать внутри PlazaStream. Тогда при конвертации данных с помощью GetValAsХХХ() / GetValAsХХХByIndex() можно будет проверять только колонки, по которым идет фильтрация, и, если запись не подходит, не выдавать ее клиентскому коду.
Спасибо:

aspirant

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


Вчера разбирался со схемами таблиц потоков. Хочу выложить мои соображения:

В класс PlazaStream в конструкторе нужно будет передавать PlazaTable вместо четырех параметров: потока репликации, схемы репликации, названия таблицы и пути к конфиг-файлу.

Для PlazaTable я напишу PlazaTableSerializer на основе Ecng.Serialization.ISerializer, который будет сохранять/считывать данные в родном формате Плазы. Таким образом PlazaStream при помощи PlazaTableSerializer будет создавать временный конфиг-файл из переданного PlazaTable и с помощью этого конфига инициализировать CP2DataStreamClass.TableSet.

В связи с этим есть пара нюансов:
  • В PlazaTable нужно будет добавить свойства ReplicationStream и ReplicationScheme (Name уже есть). Они понадобятся для создания конфигов.
  • В конфиге обязательно нужно указывать тип поля таблицы в формате Плазы (i4, i8 и т.д.). Без этого CP2DataStreamClass.TableSet инициализироваться отказывается (пробовал вчера). Практически все типы данных можно сгенерить из .Net-овских (long => i8 и т.д.). Загвоздка с decimal: очень много вариантов точности и количества знаков после запятой, например, field=sell_fee,d7.3, volat_min,d20.15, synth_base_go,d26.2 и т.д. Указывать единое значение, похоже, не получится. Вчера пробовал менять значение одного поля в таблице rts_index: CP2DataStreamClass.TableSet инициализируется, но при получении данных валятся ошибки, а данных нет. Кстати, по аналогии похожая проблема будет и со строковыми полями: там тоже разные значения длины поля. Пока видится только один выход: для каждой колонки типа decimal (и скорее всего string) указывать свое значение.
Спасибо:
< 1 2 3 4  >

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

loading
clippy