Комментарии и предложения

Комментарии и предложения
Atom
3/11/2011
skuvv


Заметил пару нюансов по PlazaTrader: 1)


_plazaStreamManager = new PlazaStreamManager(_plazaConnectionPool, TRequestType.RT_COMBINED_DYNAMIC, 1000);

Почему рекваест тайп фиксированный? надо конкретно задавать, например у меня так было:

"FORTS_FUTAGGR20_REPL" - RT_REMOTE_ONLINE "FORTS_FUTTRADE_REPL" - RT_REMOTE_ONLINE "FORTS_FUTINFO_REPL" - RT_COMBINED_DYNAMIC "FORTS_FUTCOMMON_REPL" - RT_REMOTE_ONLINE "FORTS_POS_REPL" - RT_COMBINED_DYNAMIC "FORTS_PART_REPL" - RT_COMBINED_DYNAMIC "FORTS_VM_REPL" - RT_COMBINED_DYNAMIC Допустим если FORTS_FUTCOMMON_REPL задать в RT_COMBINED_DYNAMIC, то при реконнекте будет перекачиваться весь поток заново. +Revision тоже надо указывать в некоторых потоках.

  1. в PlazaStreamManager void Run() Не обрабатывает состояния типа DS_STATE_ERROR или DS_STATE_CLOSE, те в случае чего будет затык и поток будет висеть закрытым или с ошибкой. Я для себя брал реализацию с примера(могу выложить если что) PS У меня несколько сместились приоритеты - придется задержаться на квике, но постораюсь не пропадать.

Tags:


Thanks:


< 1 2 3 4  > >>
skuvv

Avatar
Date: 3/18/2011
Reply


Пофиксил _dataStream.Close(); не нужно в OnStreamLifeNumChanged

Thanks:

skuvv

Avatar
Date: 3/18/2011
Reply


Проверил и пофиксил все таблицы(метаданные) начинающиеся на Futures. Можно принимать.

Thanks:

skuvv

Avatar
Date: 3/25/2011
Reply


События OnNewDataFromFuturesSessionContents и OnNewDataFromOptionSessionContents иногда не заполняют полностью Security - только создается new Security по id. Возможно метод GetSecurity не thread safe

Thanks:

Mikhail Sukhov

Avatar
Date: 3/25/2011
Reply


skuvv: События OnNewDataFromFuturesSessionContents и OnNewDataFromOptionSessionContents иногда не заполняют полностью Security - только создается new Security по id. Возможно метод GetSecurity не thread safe

Больше вероятность, что при инициализации происходит ошибка. А GetSecurity сначала добавляется Security, и только уже потом вызывается делегат на заполнение полей. Вот там видимо и падает. Подозреваю, что не все понял проводятся. Например:

sec.MaxPrice = record[metadata.LimitUp].To<double>();

может упасть, если неправильный тип данных (например, РТС прислала пустое значение). Посмотрите на ProcessDataError.

Thanks:

aspirant

Avatar
Date: 3/25/2011
Reply


Mikhail Sukhov: может упасть, если неправильный тип данных (например, РТС прислала пустое значение) Если будет неправильный тип данных, внутри обработчиков OnNewDataFromFuturesSessionContents и OnNewDataFromOptionSessionContents произойдет исключение. Я сначала пытался конвертировать данные из потока в DateTime через extenstion-метод To<DateTime>(). У меня срабатывало исключение. Потому уже воспользовался любезно кем-то добавленным PlazaRecord.GetAsDateTime().

Еще: надо было мне конечно предупредить, что я еще не дописал методы StartExport и StopExport. Сейчас, когда начал заливать PlazaTrader, увидел обновления skuvv'a. Вроде все вместе смержил.

Вопросы: все стандартные потоки добавлены?
Предложенная skuvv'ом фильтрация подойдет? Я вроде видел, что у PlazaTrader есть свой стандартный интерфейс влкючения/выключения фильтрации (RegisterSecurity/UnregisterSecurity)?

Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2011
Reply


aspirant: Предложенная skuvv'ом фильтрация подойдет? Я вроде видел, что у PlazaTrader есть свой стандартный интерфейс влкючения/выключения фильтрации (RegisterSecurity/UnregisterSecurity)?

Мне не нравиться:

  1. Делается тоже самое, что и через RegisterXXX, но требует изменение внешнего контракта.
  2. Я думал фильтр передается внутрь стрима. Делать фильтр в самой PlazaTrader как-то не очень.
  3. Операция Exists очень медленная (фактически там полный перебор). На потоке тиков и стаканов все помрет.
Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2011
Reply


aspirant: Я сначала пытался конвертировать данные из потока в DateTime через extenstion-метод To(). У меня срабатывало исключение. Потому уже воспользовался любезно кем-то добавленным PlazaRecord.GetAsDateTime().

  1. Все методы по переводу в и из плазовский формат нужно переносить в специальный класс - PlazaFormatter.

  2. Работа с PlazaRecord требует рефакторинг (прямо таки кричит):

  3. ODE0� Это кто так учил писать?[smile] Нужно заменить на Dictionary.

  4. PlazaColumnList.Names не нужно ни в коем случае. Мы не работает со строчками. Мы работает с колонками - PlazaColumn. Соответственно, ключом в _data должен быть не string а PlazaColumn.

  5. Индексаторы у PlazaRecord не нужны. Лучше сделать в нем метод вида T Get(PlazaColumn), который бы конвертировал значение и при возникновении ошибки, перехватывал бы ее и выбрасывал свою с описанием того, что за колонка, что пришло на вход. Так пользователю будет проще понять ошибку (да и нам). [*]Опять возвращаемся к метаданным. Не нужно передавать в PlazaListener PlazaColumns. PlazaColumns - это абстрактный базовый класс для всех колонок. Для ограничения колонок необходимым нам множеством полей нужно использовать PlazaTable.Columns. Еще раз. PlazaTable - это как раз те настройки, которые описываю наши схемы на клиенте. PlazaColumns - базовый вспомогательный класс. PlazaColumnRegistry - коллекция всех возможных колонок. PlazaTableRegistry - коллекция всех возможных таблиц.

Thanks:

skuvv

Avatar
Date: 3/26/2011
Reply


aspirant: Вопросы: все стандартные потоки добавлены? Предложенная skuvv'ом фильтрация подойдет? Я вроде видел, что у PlazaTrader есть свой стандартный интерфейс влкючения/выключения фильтрации (RegisterSecurity/UnregisterSecurity)? Это наброски, понятно что надо все напильником доделывать. К примеру я сравнил проект со своей старой программой plaza2, данные в текущий s# проект поступают медленнее на 6-10мс(время снимал с OnNewSecurityChanged к примеру). А если включить реал плазу и стаканы глубиной 50, проект может не взлететь вообще )

Thanks:

aspirant

Avatar
Date: 3/26/2011
Reply


Mikhail Sukhov: Все методы по переводу в и из плазовский формат нужно переносить в специальный класс - PlazaFormatter.

Добавил для плазовской даты. Так подойдет:

sec.ExpiryDate = record[metadata.DateEndTrade].ToString().FromPlazaString<DateTime>();
// или сделать:
sec.ExpiryDate = record[metadata.DateEndTrade].FromPlazaType<DateTime>();

Mikhail Sukhov: ODE1� Это кто так учил писать?[smile] Нужно заменить на Dictionary. PlazaColumnList.Names не нужно ни в коем случае. Мы не работает со строчками. Мы работает с колонками - PlazaColumn. Соответственно, ключом в _data должен быть не string а PlazaColumn.

Знаю, что кричит. Но когда ключом был string, нужно было использовать такого монстра, чтобы работал индексатор по номеру колонки. Dictionary отсортировал бы свои элементы по алфавиту (ключи ведь string).

Сейчас я переделал на Dictionary с ключом PlazaColumn. Крик ушел[smile]

Mikhail Sukhov: Индексаторы у PlazaRecord не нужны. Лучше сделать в нем метод вида T Get<T>(PlazaColumn) Добавил. Посмотри, пожалуйста. Кстати, я все-таки оставил индексатор по PlazaColumn.

Mikhail Sukhov: Опять возвращаемся к метаданным... Я изменил класс PlazaListener. Посмотри, пожалуйста, нужны твои комментарии + желательно кусок псевдокода - твое видение, как пользователь создает таблицу с набором колонок для передачи ее в PlazaListener.

Thanks:

aspirant

Avatar
Date: 3/26/2011
Reply


skuvv: К примеру я сравнил проект со своей старой программой plaza2, данные в текущий s# проект поступают медленнее на 6-10мс(время снимал с OnNewSecurityChanged к примеру).

Получается, ты делал свою реализацию PlazaTrader?

Thanks:
< 1 2 3 4  > >>

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy