Mikhail Sukhov
|
Date: 3/8/2011
aspirant Два момента: - После редактирования первых конфигов нужно обязательно перезагружать роутер.
- В теории создавать первые конфиги на лету тоже можно. Но я бы не стал: путь к client_router.ini указывается в коммандной строке сервиса Windows роутера (и прописывается в системном реестре). Придется колдовать и с этим.
А зачем client_router.ini вообще редактировать? С ini файлами по схемам понятно. А вот зачем роутер. Так, понял почему вылезает AcessViolationException. В папке нужен файл P2ClientGate.ini, который не создается на лету (а должен, по идее). Подсунул этот файл, упало дальше, что нет p2fortsgate_messages.ini (тоже нужно на лету создавать). Вот как то так. Хотел практическое направление - это как раз оно.[smile]
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/8/2011
Mikhail Sukhov А зачем client_router.ini вообще редактировать? Ты спрашивал про логин и пароль. Он указываются в этом файле (+ адрес сервера Плазы и номер порта). В этом случае в коде ничего не нужно указывать. И, да, ты прав, его лучше не трогать во время исполнения программы.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 3/8/2011
aspirant Mikhail Sukhov А зачем client_router.ini вообще редактировать? Ты спрашивал про логин и пароль. Он указываются в этом файле (+ адрес сервера Плазы и номер порта). В этом случае в коде ничего не нужно указывать. И, да, ты прав, его лучше не трогать во время исполнения программы. А вообще возможно напрямую обращаться к серверу Плазы минуя этот роутер?
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/9/2011
Mikhail Sukhov А вообще возможно напрямую обращаться к серверу Плазы минуя этот роутер? Я так понял, что нет (см. п. 5.1. Топология сети - стр. 7 P2ClientGate.doc). Кстати, есть ощущение, что, если нужно распараллелить получение данных, через один роутер это не получится. Я добавил PlazaConnectionPool, который создает отдельный CP2ConnectionClass для каждого стрима. Вчера тестировал: данные с разных потоков все равно приходят последовательно[sad]
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/9/2011
Mikhail Sukhov А вообще возможно напрямую обращаться к серверу Плазы минуя этот роутер? Сегодня весь день пытался получить список инструментов из таблицы opt_vcb. Путем тыкания и активного общения с поддержкой РТС только что наконец получилось. Почерпнул для себя две важные вещи, которыми хочу поделиться: Quote: дело не в Appname'е. А в том, что в client_router.ini стоит одинаковый адрес в параметрах default и direct. Для тестового полигона direct можно вообще закомментировать. От себя добавлю: комментировать не можно, а нужно. Иначе из роутера через раз будут валиться ошибки.
- Номер тестового порта 3001 нужно прописать не только в client_router.ini, но и в volatvmsrv\local_inter.ini и volatvmsrv\forts_volatvm.ini. Здесь, если этого не сделать, программа будет подключаться, но по некоторым потокам данные не будут приходить.
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/22/2011
Mikhail Sukhov Но данные из потока не так интересны. Их нужно перегнать в объект Security. Можете посмотреть метод PlazaTrader.OnNewDataFromOptionSessionContents()? Не совсем уверен насчет правильности мапинга данных из потока в свойства Security[confused]
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 3/23/2011
aspirant Mikhail Sukhov Но данные из потока не так интересны. Их нужно перегнать в объект Security. Можете посмотреть метод PlazaTrader.OnNewDataFromOptionSessionContents()? Не совсем уверен насчет правильности мапинга данных из потока в свойства Security[confused] Все отлично. Ошибку заметил в другом месте.[smile] Ты в StartExport подписываешься на событие? А отписываешься где? Утечка памяти... Ладно, это потом. Мне вообще кажется не стоит каждый раз создавать PlazaListener. Но я пока не вижу всей картинки с запуском пользователей доп потоков. Это тебе виднее.
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/24/2011
Mikhail Sukhov Мне вообще кажется не стоит каждый раз создавать PlazaListener. Да, ты прав. Это должна быть переменная внутри класса. Начал править и тут несколько вопросов: - Чтобы быть последовательным, что ты делаешь в QuickTrader'е, если клиент при запущенных стандартных потоках повторно вызывает StartExport? Выбрасываешь исключение? Перезапускаешь стандартные потоки? Не делаешь ничего?
- В качестве уникального ID для инструментов используем isin или isin_id? Плаза в своих потоках использует isin_id (см., например, схемы таблиц opt_exp_orders, opt_rejected_orders).
- В ExtensionInfo запихиваем все, или только то, что не получается замапить? В качестве ключей используем названия колонок Плазы или названия переменных наших классов метаданных?
Mikhail Sukhov А отписываешься где? Утечка памяти... Утечка памяти была бы, если optionListener (раздатчик событий) жил бы дольше, чем PlazaTrader (подписчик на события) (см. здесь). Почему тогда в C# есть анонимные event handlers?
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 3/25/2011
|
|
|
|
aspirant Mikhail Sukhov Мне вообще кажется не стоит каждый раз создавать PlazaListener. Да, ты прав. Это должна быть переменная внутри класса. Начал править и тут несколько вопросов: - Чтобы быть последовательным, что ты делаешь в QuickTrader'е, если клиент при запущенных стандартных потоках повторно вызывает StartExport? Выбрасываешь исключение? Перезапускаешь стандартные потоки? Не делаешь ничего?
- В качестве уникального ID для инструментов используем isin или isin_id? Плаза в своих потоках использует isin_id (см., например, схемы таблиц opt_exp_orders, opt_rejected_orders).
- В ExtensionInfo запихиваем все, или только то, что не получается замапить? В качестве ключей используем названия колонок Плазы или названия переменных наших классов метаданных?
1. Перезапуск. 2. Вроде бы нет колонки isin. Или я не понял вопроса. 3. Все, что не входит в свойства такие как ExpiryDate, MinStepPrice и т.д. Ни то, ни другое - объекты PlazaColumn. Mikhail Sukhov А отписываешься где? Утечка памяти... Утечка памяти была бы, если optionListener (раздатчик событий) жил бы дольше, чем PlazaTrader (подписчик на события) (см. здесь). Почему тогда в C# есть анонимные event handlers?[/quote] Потому что это порочное решение. Я сам их пользую, но только из-за удобства. В системных классах я никогда не подписываюсь на событие анонимным методом или лямбдой. Последние, кстати, придумали для Линка, тоесть когда мы не в цепочки вставляем наш обработчик, а просто передаем делегат как аргумент в некий метод.
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 3/25/2011
|
|
|
|
Mikhail Sukhov 2. Вроде бы нет колонки isin. Или я не понял вопроса. В классе PlazaOptionSessionContentsColumns есть переменные Isin (Символьный код инструмента) и IsinId (Уникальный числовой идентификатор инструмента). Сейчас я в качестве ключа использую Isin: Codeprivate void OnNewDataFromFuturesSessionContents(PlazaRecord record) { var metadata = PlazaColumnRegistry.FuturesSessionContents;
base.ProcessEvents(() => { base.GetSecurity(record[metadata.Isin].ToString(), sec => { // мапим... }); }); } Можно использовать IsinId? Codebase.GetSecurity(record[metadata.IsinId].ToString(), sec =>
Или символьное представление удобнее, где-то используется и т.д.? Mikhail Sukhov Все, что не входит в свойства такие как ExpiryDate, MinStepPrice и т.д. Ключи называем FuturesIsinId или fut_isin_id, IsEuropean или europe и т.д.? Mikhail Sukhov Я сам их пользую, но только из-за удобства. Сам все сказал: так легче. Если контроль за такими вещами, как использование памяти, критичен, тогда нужно использовать C++.
|
|
Thanks:
|
|
|
|