- Избавиться от накопления очереди сообщений в первые секунды работы (необходимо разбить получение реплики на несколько соединений, работающих в отдельных thread'ах, каждое со своим циклом выборки).
- Добавить профилировщик получения данных и отправки заявок - необходимо понять насколько быстрый PlazaTrader у нас (особенно в связи с грядущими изменениями в плазе после нового года).
- Отфильтровывать данные от уже прошедшей сессии (вечером приходят данные как от дневной, так и от вечерней сессии).
- Если заявка GTC, то в вечерний клиринг приходит сообщение Inserted, с id_ord = новому номеру заявки и с id_ord1 = старому номеру заявки. Необходимо заменить одно на другое.
Ничего не упустил?
3ий таск я уже начал делать в фоновом режиме. Кто готов взяться за другие задачи?
Сделано: 2) Обрабатывать снятие заявки в клиринг (сейчас заявка остаётся активной и снять её невозможно). (Alexander) 3) Поддержка Plaza 64x. (frontman) 4) Возможность задания даты истечения заявки (сейчас делается через PlazaStopCondition.ExpiryDate, что не прозрачно, т.к. на Plaza вообще нет стоп заявок). (Alexander) 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок. (frontman)
コメント (192)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
По первому пункту хотел бы вопрос задать: я правильно понял что изменять надо вот эту часть:
Просто пытаюсь разобраться в механизмах стокшарпа. Вот на всякий случай переспрашиваю)
Скорее всего именно эту часть менять не придется. Надо завести пару PlazaStreamManager, в методе StartExport написать что-то вроде
Где 1 и 2 номер стрим менеджера, в который соответствующие потоки надо добавить. И так далее...
Я смогу заняться 1 пунктом в конце недели, как освобожусь...
Спасибо. Понял. Я просто думал чт для каждого потока надо создать отдельный thread, а тут как я понимаю разделение только фьючерсов и опционов идет...
Для каждого потока отдельный thread точно не нужен. Надо часть потоков - в один thread, часть - в другой.
Занялся пунктом 2), добавил пункт 6) - его тоже надо сделать, сейчас некорректно работает после клиринга из-за него.
Кто возьмётся?
Кстати сегодня разговаривал с одним из специалистов РТС. Он сказал что есть метод перерегистрации пары заявок. Что нибудь слышали об этом? По моему в плазе это не реализовано еще...
Что за "перерегистрация пары заявок"?
ReRegisterOrder(Order, Order) - Перерегистрировать заявку на бирже. Это прям из мануала строчка. Я в рамках терминологии этой написал... Так вот есть метод позволяющий передвигать пару заявок. Ну так меня заверил человек с РТС))
FutMoveOrder - это для передвижения одной заявки А есть что то такое же для двух... Я вот и спрашиваю знаете ли вы об этом что то?
Знаем. FutMoveOrder - для перемещения 2х заявок как раз, а не 1ой.
Т.е ReRegisterOrder(Order, Order) перемещает вот эти две заявки? А куда тогда? Если бы он выглядил вот так : ReRegisterOrder(Order, Order, Order, Order) я б еще понял ... А так что то не пойму(( Извините...
У вас исходный код есть - смотрите сами. Там всё очевидно, я только что по коду сам посмотрел. Почему другие могут пользоваться поиском, а вы не умеете? Надо учиться. И лучше поздно, чем никогда.
Этот метод для отмены одной заявки и регистрации другой в рамках одной транзакции. А я говорю о методе отменяющем 2 заявки и выставляющим 2 заявки в рамках одной транзакции. То что есть явно это не делает.
Я ведь говорю что по коду несложно понять. :) Добавил пункт 7. Опять никто не готов взяться, будем ждать пока у нас руки дойдут?
Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.
Тоже не понимаю, зачем такой костыль. Для такого метода нужно и код написать в стратегии. Что мне кажется совсем уж не удобно. Подозреваю, что это сделано для атомарного изменения multi leg заявки. Но могу ошибаться.
Это вроде не костыль, FutMoveOrder (OptMoveOrder) позволяет переставить две заявки за одну транзакцию
Да если меня с работы раньше не выгонят то скоро займусь)
Для меня это экономия в деньгах прежде всего. http://www.rts.ru/s186#trans - денег неплохо так берут.
Я правильно понял, что вы взялись делать пункт с MoveOrder?
Ну... Да)) Как сделаю вам написать надо, что бы вы мне логин и пароль дали для?
Да. Или сюда к сообщению фикс приложите, мы сами закоммитим.
ок.
Добавил 8-9 пункты.
Сделал 2)
1 задача с очередями пока не получается, ошибки сыпятся
7 - сделал. Как залить то?)
Сюда, в зип архиве.
Вот. Там ток часть плазы
TransactionManager.cs битый в архиве. В нём изменения есть? Или у меня только проблемы - у кого-нибудь получилось полностью скачать?
Частично сделал задачу один. Разделил реплики на три потока, вроде как работает. Но работет как-то криво, даже медленнее данные стали подгружаться (раньше 10 секунд, теперь 25). При подключении большая очередь сохраняется (раньше до 40, теперь до 80-90), что оч странно. Также некоторые моменты не сделал, например:
Давайте лучше сразу на КодеПлекс. У Александра сейчас пока нет времени, так что коммитьте сразу в код. Можно через Shelves.
Залил на кодеплекс.
З.Ы. Забыл комент написать, блин) а можно как-нибудь комент потом вписывать в ченжсет?
Да, через Show History, changeset details и комментарий вписать.
/// <summary> /// Потоки, которые будут запущены при вызове метода <see cref="StartExport"/>. /// </summary> public PlazaStreamList Streams { get { return _streamManager1.Streams; } //??? Надо как-то обьеденить потоки от всех _streamManager }
Александр а что с 7м пунктом то? Вроде как все сделал я ... И давно... Или что то не так?
У вас работает? Если да - пользуйтесь, нас не ждите.
Я начал смотреть, мне там кое-что не понравилось. Я не забыл, помню. :) Как конференцию проведём - досмотрю, отпишусь.
Ок.
Приложи к сообщению, пожалуйста. Глюк какой-то видимо у меня. Из разных браузеров пробовал - одно и тоже.
сабж
7 пункт допилил и залил. Спасибо frontman
Отлично! Посмотри первый пункт, плиз=) давно уже с ним бьюсь, не получается, такое ощущение, что несколько потоков пытаются использовать какие-то общие ресурсы, мешают друг-другу и поэтому данные наоборот медленнее подгружаются
Сегодня смотрел. Там полный рефакторинг необходим работы с потоками репликации. В общем - в ближайших планах.
Можно пояснить что было сделано в "Change Set 11295. Plaza. Рефакторинг работы с подключениями."? У меня после него перестали заявки ставиться, пишет "Specified cast is not valid." at P2ClientGateMTA32.CP2BLMessageClass.SendAsync2(CP2Connection conn, UInt32 Timeout, Object event, Int64 eventParam)
Известно, решаем. Была сделана корректная работа с потоками и стримами.
Убрал атрибут public у TransactionManager. В итоге public потерял и MessageDispatcher, который быть не пабликом не может. Вот думаю, надо наверное не просто вернуть public у TransactionManager, а еще и дать доступ внешнему коду к этому объекту.
Я так понял теперь можно создавать несколько потоков отправки команд? Интересно, это дало что-нибудь в плане быстродействия?
Фронтмэн жмется с написанием тестера.😂 Без тестера только гадание на кофейной гуще.
Оооп) А может кто нить поделиться секретом это как?)
Plaza: возможность создавать несколько транзакционных потоков.
Михаил, помнится во времена, когда тестовый сервак плазы не работал, вы (или Александр) тестировали плазу на реальном боевом сервере плазы. Откройте секрет, как можно получить доступ к реальному серверу не проходя сертификацию робота? Дело в том, что с этими очередями сообщений сертификацию не пройти (первый таск собственно), а мне бы уже давно надо отрабатывать быстрые стратегии на реальном сервере...
Купить логин у брокера. Сертификацию кто-то из брокеров еще требует?
У нас тут деревня похоже=) БКС требует сертификацию, финам вообще не предоставляет прямой доступ на РТС со своей программкой. А разве можно подключиться на РТС в обход брокера? Не охота еще и брокеру комиссию отстегивать
А что с другими брокерами? БКС вообще попутал что-то, имхо. Забыл на какой стороне поля играет.
Нет, только через брокера.
Кроме БКС и Финама больше в Новосибирске никого нет.
Обложили.😂 А дистанционно разве нельзя открыться у другого брокера? Скан пасспорта по факсу и т.д.
Офигееееть) Тут все изменения можно смотреть)) Вот я быдляра) Спасибо.
Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎
to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.
Александр не получиться. В наследники придется переопределить методы в которых используются закрытые поля класса PlazaTrader. Например _transactionManager в методе OnRegisterOrder. Мне придется весь PlazaTrader переписать...
Попробуйте так:
есть событие
Подписываетесь на него. Вам приходит Transaction. Делаете ему SetBrokerCode.
Подтверждаю, Latency заявок снизился очень значительно (у меня, в среднем, со 150 мс. до 50 мс.) и у заявок стали появляться статусы Failed (а раньше просто подвисали на None). Глянул изменения в коде коннектора, примерно понял.
Огромное спасибо, завтра еще буду тестировать :)
А что за брокерский код? Почему мне его не нужно вводить?
frontman делает какую-то хрень на стороне брокера. ему надо его вводить, физикам - нет. в PlazaTrader полю BrokerCode точно не место.
😂
Подтверждаю, ускорение есть, правда не в разы, как у Александра. У меня до москвы задержка 53мс в среднем, заявки ставятся в среднем за 100 мс, раньше было 120-140 вроде.
Александр благодарю. Вот ток мне кажется время выполнения транзакций из за этого может увеличиться... И попрошу без вот таких вот оценок. Тем более что вы не в курсе моей работы. И насчет брокерского кода: он есть во ВСЕХ транзакциях отправляемых РТС. Только вот лично вам он не нужен и поэтому вы считаете, что это лишне. Я не понимаю в чем проблема... Что он места много занимает? Или что? Принцип?
"Кажется"? А если потестировать, да посмотреть? Вот для этого и нужен профилировщик-тестировщик, о котором месяца 2 ведётся разговор. Уже вон отписались и подтвердили мои тесты - снизилось время в 3-4 раза.
Давайте конкретно, без кажется. Где у вас увеличилось время? На каких транзакциях? На каком сервере? Насколько? И у меня и у aleksej средний Latency снизился со 150мс до 50мс. С каких до каких он вырос у вас?
Пока лишь всё что я вижу - это кажется, наверное, думается. Нужны конкретно цифры. На кажется уже отвечать надоело.
Ну я образно говорю. Я делаю хрень на стороне физика, вы - на стороне брокера :)
Я уже много раз спрашивал - зачем брокерский код простому смертному? Для чего его вписывать в каждую транзакцию? Брокерский код добавляется в транзакцию уже на стороне биржи. И чем вас не устраивает тот метод изменения транзакции, который я описал выше?
Зачем он в PlazaTrader? Это не то поле, которое нужно знать шлюзу. Оно там явно лишнее. Далее - в Transaction не будут добавляться новые поля. Нужно что-то установить - пользуйтесь GetField \ SetField. Те немногие поля, которые там есть - я почищу. Постоянно таблицы модифицируется, что-то добавляется, что-то удаляется. Transaction не будет содержать сотни полей, не будет завязан на конкретную версию шлюза.
И да, доступ давался несколько для иных задач чем добавление BrokerCode :)
это
Готов сделать. Все таки давайте решим делаем это через
Через SecurityType, которое может быть: Future (фьючерсы), Option (только опционы), Common (общее)
Да нет Александр) Я не про то что вы пофиксили... Я про событие ProcessRequest)) Ну что вы так сразу близко к сердцу то) Все я понял. Так бы сразу и написали...😭
На сколько оно у вас увеличилось по ProcessRequest? На пару микросекунд? :) Сделайте тест, там увеличение если и будет, то << 1 мс.
Я вроде так сразу и писал - спрашивал нафига оно рядовому пользователю. :)
Сделал...
Отлично. Только поставьте у себя в настройках Visual Studio для табов - сохранение табов (а не пробелы), tab size 4, ident size 4
Ок. Щас полазаю))
У меня такой вопрос: А почему для StockSharpa используется .NET Framework 3.5? В нем нет например Parallel LINQ, а так было бы приятно)))
Из-за SmartCom
По шестой задачи хотел спросить. Может укажите так сказать направление)) Александр вы можете я знаю)
Если запускать в вечернюю сессию робота, то данные придут и по дневной сессии - т.е. будут одни и теже isin_id инструментов, с разными номерами сессий. Надо брать ту, которая идёт. Также надо понять как заменять текущие инструменты на новые при смене сессии.
Хм... Все спасиб)
Александр а что дает ваше "Plaza: возможность снимать заявку по ext_id (TransactionId)"? Можно разъяснить... Я там увидел что вроде как можно теперь создать транзакцию для отмены сразу нескольких заявок... А вот реализации такой функции в PlazaTrader не нашел... Можете как то объяснить? Спасибо.
Я добавил возможность снимать заявку для которой ещё неизвестен order_id. Делается это по внешнему id - по ext_id в понятиях шлюза или по TransactionId в наших понятиях. Попробуйте снять заявку которая в состоянии None до моих изменений и после них - поймёте.
Т.е. сейчас есть возможность снимать заявку в промежуток между отправкой заявки и ответом биржи.
Но все таки если нетрудно смысл изменений объясните) Спасибо)
Ок. Спасибо. У меня возможно по этой причине и не снимались заявки. Оч классно)
Как дела с 5-6 задачами?
Ну думаю 6е я добью. Щас уже делаю. А вот 5е точ не буду. Кстати вы не скажите почему SessionId = new PlazaColumn(TableId, "sess_id", typeof(int), false) Т.е. IsMandatory == false.? Это в классе PlazaDealDerivativeColumns...
А зачем sess_id для сделок? Если надо - можно и true передавать.
5е не будете по причине что теперь всё летает и не надо сверять производительность "до" и "после"?
Это вообще не при чём. Сегодня одна сессия, завтра - другая. Надо иметь возможность заменять один инструмент на другой при смене сессии, т.к. для разных сессий инструменты разные.
Т.е. если приходят несколько сессий - надо брать инструмент по активной сессии, а не по закончившейся.
Просто я так понимаю из за этого я при получении сделок не могу sess_id посмотреть...
))) Нет Александр я уже говорил. У меня каждая транзакция на счету. Я не могу такую прогу тестить. Меня уволят)
Тестовый сервер так и не подключили? :) Да и я вроде говорил - можно и по 100 транзакциям тестить. Нет, так нет. Вам надо, не нам 😎
ууу))) Хм... Тогда думать надо...
А у инструмента только sess_id меняется?
Посмотрите всё сами раз взялись за задачу.