Рефакторинг Plaza коннектора
Atom Ответить
16.09.2011


У нас там ещё и Reflection используется...

Давайте постепенно будем менять структуру.
Какие цели - избавиться от текущей перегруженности, добавить возможность поддержать несколько подключений.

Какие у кого предложения по структуре?

Теги:


Спасибо:




36 Ответов
1 2  >
Mikhail Sukhov

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


Alexander Перейти
Какие у кого предложения по структуре?


Метаданные (по сути под этим можно считать только наследники от PlazaColumns) нужно отвязать от PlazaTable. Далее, или убрать TableRegistry, или убрать StreamRegistry.

Use cases:

Код
var trader1 = new PlazaTrader();
trader1.FutureTable.Columns.Add(PlazaFututeColumns.Volatility);

var trader2 = new PlazaTrader();
trader2.OptionTable.Columns.Add(PlazaOptionColumns.Volatility);


Код
var trader1 = new PlazaTrader();
trader1.StartExport(trader1.FutureTable);

var trader2 = new PlazaTrader();
trader2.StartExport(trader2.OptionTable);


Код
var trader = new PlazaTrader();

// или
var stream = trader.StartExport(PlazaTableRegistry.Smile);
stream.NewData += 

// или
var stream = trader.StreamRegistry.Smile;
stream.NewData += 
trader.StartExport(trader.StreamRegistry);


Второй вариант мне нравится больше. Соответственно если оставляем реестр стримов, то первые 2 кейса переделываем на использование trader.StreamRegistry
Спасибо:

Alexander

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


1) Как раз уже стал переделывать под второй вариант, мне он тоже больше нравится.
PlazaTrader знает только о StreamRegistry, причём именно так:
Код
var stream = trader.StreamRegistry.Smile;
stream.NewData += 
trader.StartExport(trader.StreamRegistry);


ведь не надо забывать о необходимости нескольких подключений - static классов быть не должно.

2) PlazaTable тоже уже стал удалять из всех метаданных, столкнулся с проблемой рефлектора - GetAllMetadata выкидывает exception.

3) Необходимо удалить TableRegistry, как тогда будет работать Stream без знаний о текущей таблице?
Автор топика
Спасибо:

Mikhail Sukhov

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


Alexander Перейти
2) PlazaTable тоже уже стал удалять из всех метаданных, столкнулся с проблемой рефлектора - GetAllMetadata выкидывает exception.

3) Необходимо удалить TableRegistry, как тогда будет работать Stream без знаний о текущей таблице?


2. Через reflection идет инициализация текущей структуры. Тоесть если ты что-то со структурой классов делаешь то и рефлекшен тебе нужно изменить.
3. Так же как и сейчас, через PlazaStream.Table.
Спасибо:

Alexander

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


Mikhail Sukhov Перейти
3. Так же как и сейчас, через PlazaStream.Table.

Код

            streams.Add(Aggregation20FutureStream = new PlazaStream(
                new PlazaTable(PlazaTableSystemName.OrdersAggr, ReplicationStream.Aggr20Future, "Фьючерсы: стакан глубиной 20 котировок")
                ));

?
Автор топика
Спасибо:

Mikhail Sukhov

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


Alexander Перейти
Mikhail Sukhov Перейти
3. Так же как и сейчас, через PlazaStream.Table.

Код

            streams.Add(Aggregation20FutureStream = new PlazaStream(
                new PlazaTable(PlazaTableSystemName.OrdersAggr, ReplicationStream.Aggr20Future, "Фьючерсы: стакан глубиной 20 котировок")
                ));

?


Да, думаю так и нужно сделать... Может еще проверишь заодно, влияет ли как-нибудь на производительность кол-во созданных стримов (не активных, тоесть данные по ним не текут).
Спасибо:

Alexander

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


Текущие таски:
1) избавиться от перегруженности текущей структуры классов - TableRegistry, ColumnRegistry, StreamRegistry;
2) убрать зависимость метаданных от Table;
3) убрать статические классы;
4) протестировать возможность подключения и получения данных по нескольким логинам.
Автор топика
Спасибо:

Mikhail Sukhov

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


Рефакторинг сделал.
Спасибо:

Alexander

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


Mikhail Sukhov Перейти
Рефакторинг сделал.


Сейчас добавление столбцов происходит после инициализации PlazaStream, в связи с этим возникают проблемы в PlazaRecord.

P.S. fixed. Но данные всё равно не поступают.
Автор топика
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 21.09.2011
Ответить


Mikhail Sukhov Перейти
Рефакторинг сделал.


Компилил последние исходники, тестил, существующие проблемы не решены: большие задержки при выставлении заявок, загрузка проца под 100% после дисконнекта. Там еще ошибка на SimpleGUI вылетает при подключении(запостил в другой теме).
Спасибо:

Alexander

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


FiNick Перейти
Mikhail Sukhov Перейти
Рефакторинг сделал.


Компилил последние исходники, тестил, существующие проблемы не решены: большие задержки при выставлении заявок, загрузка проца под 100% после дисконнекта. Там еще ошибка на SimpleGUI вылетает при подключении(запостил в другой теме).


Поправите? Доступ к исходникам у вас вроде есть :)
Автор топика
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 22.09.2011
Ответить


Alexander Перейти
Поправите? Доступ к исходникам у вас вроде есть :)


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

Mikhail Sukhov

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


FiNick Перейти
Alexander Перейти
Поправите? Доступ к исходникам у вас вроде есть :)


Я бы с удовольствием исправил, уже пару дней в коде копаюсь, разобраться не могу)


А с метаданными уже все?
Спасибо:

Alexander

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


Просьба не забывать добавлять новые файлы в проект (csproj файл), а то не компилируется :)
Автор топика
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 26.09.2011
Ответить


Mikhail Sukhov Перейти
А с метаданными уже все?

Метаданные я постепенно дозаполню, это не проблема. Проблема в том что заявки ставятся по 10 секунд. Ведь преимущество плазы это не получение всего многообразия данных с биржи, а максимально быстрая скорость выставления заявок.

Вопрос: это только у меня такая ошибка? у кого-нибудь еще есть проблемы со скоростью? Просто на форуме никто больше не жалуется, очень странно.
Спасибо:

frontman

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


Я жаловался) Ток у меня вообще не приходит ответ от биржи после выставления заявки.
Насколько эта проблема связанна с обсуждаемой. Я был бы рад и 10 секундам)
Спасибо:

frontman

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


Если вы о времени выполнения метода RegisterOrder, то да 10 сек и у меня...
Спасибо:

frontman

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


Но потом можно вечно ждать возвращения биржей идентификаторы заявки...
Не встречались с такой проблемой?
Спасибо:

Alexander

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


Проблема в PollTimeOut в connectionPool. Исследуйте в ту сторону
Автор топика
Спасибо: frontman

frontman

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


Смотрите опытным путем установил что событие ITrader.NewOrders вне стратегии срабатывает.
Но как только я переношу подписку на это событие в стратегию ничего не работает.
Это наводит на мысль что это связанно с классом Strategy как то...
Спасибо:

frontman

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


Так... Теперь установил что если внутри стратегии убрать подписку на событие ITrader.QuotesChanged то новые заявки начинают поступать.
Может кто нибудь знает может ли поток данных о стакане как то "забивать" заявки?
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 26.09.2011
Ответить


frontman Перейти
Смотрите опытным путем установил что событие ITrader.NewOrders вне стратегии срабатывает.
Но как только я переношу подписку на это событие в стратегию ничего не работает.
Это наводит на мысль что это связанно с классом Strategy как то...


А как вы регитрируете заявку, strategy.RegisterOrder или plaza.RegisterOrder? Если вторым образом, то события стратегии типа strategy.NewOrders, OrderChanged и т.п. не будут срабатывать. Стратегия не считает такие заявки своими, потому никак не сообщает о них.
Спасибо:

frontman

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


strategy.RegisterOrder

Но проблема в том что я обрабатываю событие ITrader.NewOrders, а оно к стратегии не относится ни как... И по идее должно перехватывать все заявки... Но...
Спасибо:

Alexander

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


Выяснил.
Задержка, как и писал неоднократно выше, связана с PollTimeOut в PlazaConnectionPool.

У нас заявки посылаются асинхронно, в том же потоке, что делает ProcessMessage. Могут возникать ситуации когда они блокируют.
Поставил 100мс, как советуют на форуме РТС.

Далее. Сейчас у нас создаётся 1 подключение для данных и для отправки заявок. Что не оптимально.
Предлагаю добавить возможность создавать N (>=1) транзакционных подключений для отправки заявок. В любом случае транзакционное подключение необходимо отделять от потока данных. В этом случае всякая проблема с задержкой заявок уйдёт.

Замечания \ пожелания \ предложения?

P.S. Свой минификс со 100мс залил на codeplex, соберите по исходникам, потестируйте.
Автор топика
Спасибо:

Mikhail Sukhov

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


Alexander Перейти
Далее. Сейчас у нас создаётся 1 подключение для данных и для отправки заявок. Что не оптимально.


Должно быть раздельно сделано, одно для данных, одно для транзакций. Посмотри, где вызывается класс PlazaConnectionPool.
Спасибо:

frontman

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


Я думаю даже 100мс скоро много будет)
У меня вопрос : а не может ли тот факт что транзакции и получение данных идет в одном потоке мешать выполнению этих самых транзакций.
Т.е я говорю не о задержки как писал Александр а о полной блокировки. Например при получении данных о стакане? Т.к. стакан обновляется постоянно, т.е поток входной инфы практически бесконечен?
Спасибо:
1 2  >

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

loading
clippy