Комментарии и предложения
Atom
11.03.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 тоже надо указывать в некоторых потоках.
2) в PlazaStreamManager void Run()
Не обрабатывает состояния типа DS_STATE_ERROR или DS_STATE_CLOSE, те в случае чего будет затык и поток будет висеть закрытым или с ошибкой.
Я для себя брал реализацию с примера(могу выложить если что)
PS У меня несколько сместились приоритеты - придется задержаться на квике, но постораюсь не пропадать.

Теги:


Спасибо:


< 1 2 3 4  > >>
skuvv

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


Пофиксил
_dataStream.Close(); не нужно в OnStreamLifeNumChanged
Спасибо:

skuvv

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


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

skuvv

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


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

Mikhail Sukhov

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


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


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

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


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

aspirant

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


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

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

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

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

Mikhail Sukhov

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


aspirant

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


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

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

Mikhail Sukhov

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


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



  1. Все методы по переводу в и из плазовский формат нужно переносить в специальный класс - PlazaFormatter.
  2. Работа с PlazaRecord требует рефакторинг (прямо таки кричит):

    1. Код
      readonly List<KeyValuePair<string, object>> _data = new List<KeyValuePair<string, object>>();
      Это кто так учил писать?[smile] Нужно заменить на Dictionary.
    2. PlazaColumnList.Names не нужно ни в коем случае. Мы не работает со строчками. Мы работает с колонками - PlazaColumn. Соответственно, ключом в _data должен быть не string а PlazaColumn.
    3. Индексаторы у PlazaRecord не нужны. Лучше сделать в нем метод вида T Get<T>(PlazaColumn), который бы конвертировал значение и при возникновении ошибки, перехватывал бы ее и выбрасывал свою с описанием того, что за колонка, что пришло на вход. Так пользователю будет проще понять ошибку (да и нам).

  3. Опять возвращаемся к метаданным. Не нужно передавать в PlazaListener PlazaColumns. PlazaColumns - это абстрактный базовый класс для всех колонок. Для ограничения колонок необходимым нам множеством полей нужно использовать PlazaTable.Columns. Еще раз. PlazaTable - это как раз те настройки, которые описываю наши схемы на клиенте. PlazaColumns - базовый вспомогательный класс. PlazaColumnRegistry - коллекция всех возможных колонок. PlazaTableRegistry - коллекция всех возможных таблиц.
Спасибо:

skuvv

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


aspirant

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

Это наброски, понятно что надо все напильником доделывать.
К примеру я сравнил проект со своей старой программой plaza2, данные в текущий s# проект поступают медленнее на 6-10мс(время снимал с OnNewSecurityChanged к примеру). А если включить реал плазу и стаканы глубиной 50, проект может не взлететь вообще )

Спасибо:

aspirant

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


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


Добавил для плазовской даты. Так подойдет:
Код
sec.ExpiryDate = record[metadata.DateEndTrade].ToString().FromPlazaString<DateTime>();
// или сделать:
sec.ExpiryDate = record[metadata.DateEndTrade].FromPlazaType<DateTime>();


Mikhail Sukhov
Код
readonly List<KeyValuePair<string, object>> _data = new List<KeyValuePair<string, object>>();
Это кто так учил писать?[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.
Спасибо:

aspirant

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


skuvv

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


Получается, ты делал свою реализацию PlazaTrader?
Спасибо:
< 1 2 3 4  > >>

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

loading
clippy