Выложил PlazaTrader на http://box.net/plaza Исходники самого PlazaTrader, исходники примера, Plaza dll и Plaza + S# dll (последнее не нужно, если уже используется S#).
В следствие бета тестирования буду обновлять только библиотеку Ecng.Trading.Plaza.dll. В релиз войдет все. Налетаем.🙂
upd Теперь PlazaTrader часть дистрибутива S#, поэтому просто качайте последнюю версию http://box.net/stocksharp/ . Сборка называется StockSharp.Plaza.dll
Комментарии (66)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Скажите пожалуйста, роботов написанных под Plaza 2 нужно будет сертифицировать на РТС?
Добрый день, несмотря на то, что класс PlazaErrors еще нигде не используется, по нему есть несколько предложений:
и сдвинуть все ключи в _plazaErrorGroup на 4, так вроде понятнее и короче🙂
А есть понимание того, что там вообще происходит в этом классе?🙂
Думаю, что есть. В COMException есть ErrorCode, вот по нему можно получить дополнительные данные по ошибке, а не просто "Couldn't connect to MQ"
Ок, тогда может я дам доступ и поправите самостоятельно?
Да, могу поправить.
Внес изменения в PlazaErrors. Далее предлагаю в PlazaException вместо кода ошибки выводить ее краткое описание.
PlazaException сейчас используется только в транзакциях, может в функциях подключения, отключения и т.д. стоит заменить InvalidOperationException на PlazaException?
Сейчас для подключения к роутеру используется TCP? Если подключаемся на localhost, может стоит подключаться через LRPCQ?
Я как-то тоже поднимал этот вопрос. Предлагаю решить голосованием. Я за PlazaException.
Очень интересно, у меня была старая версия P2ClientGate.doc, где про LRPCQ ничего не было. Покопавшись в форуме РТС, нашел вот это.
Изначально PlazaErrors был создан с ошибкой. Если посмотреть документацию (в самом конце), то там есть некие числовые константы (некоторые равны друг другу). Так что, это вовсе не строчки. Строчки - это ошибка автора этого класса.
Я тоже за, если не лепить везде это исключение. Где его предлагаете применить?
Не совсем понял вышесказанное, в документации указано как по полученному коду ошибки можно получить символьный код ошибки, который для нас более понятен, что понимается под "строчкой"?
Например, выращежение P2ERR_MSG_FIELD_NOT_FOUND = P2ERR_MSG_BEGIN говорит о том, что идентификатор P2ERR_MSG_FIELD_NOT_FOUND равен началу блока P2ERR_MSG_BEGIN, который в свою очередь равен 0x8000.
В классе же PlazaErrors сейчас это представлено в виде строчки. Это так и должно быть? Я не 100% уверен, но думаю тут глюк в дизайне.
Сделал
Получил боевой логин. Если качать с нулевой ревизии как сейчас, то старт примера занимает около 10 минут. Поэтому, предлагаю сделать следующие:
А если просто ревизии по таблицам сохранять между сессиями? Тогда при переподключении будем скачивать только новые данные.
Аспирант говорит, что так мы поимеем неправильный стакан. Плюс пропадут данные за текущую сессию.
Ты уже ответил, ради интереса. 2 штуки в месяц у Цериха.
Привинчиваем к SQL Server'у (ODBC) или .db файлам (SQL3Lite)? Последние проще настроить, но я с ними раньше не имел дела вообще.
Подключение напрямую к серверу Плазы или через брокера?
Думаю, лучше последнее. Я тоже не работал, но меня прельщает название Lite🙂
Лучше к SQLite.
Добавить одну строчку действительно было несложно:
Но при тестировании возникла проблема: если между сессиями меняешь набор колонок в таблице, приходится удалять db файл, и получать данные с нуля. То есть, если пользователь запустил PlazaTrader, инициализировал таблицу 1 с колонками 1,2,3,4, накачал данных, вышел. Подумал-подумал, понял, что нужна еще колонка 5, и добавил ее в инициализацию. Снова запустил PlazaTrader и получил исключение, потому что в db файле в таблице только колонки 1,2,3,4, а плазовсий роутер не умеет менять схему таблиц в db файлах, он только создает их с нуля.
Еще: я до конца не разобрался, но, вроде, вытаскивать данные из локальной базы данных (db файл или SQL Server) мы должны сами.
Подводя итог, предлагаю временный гибридный вариант:
Еще 2: у всех таблиц есть индексы (см. ini файлы-схемы). Для безбазового клиента они не нужны, поэтому я их не делал (нужно лопатить каждый класс в метаданных). Без индексов таблицы создаются, но они ведь не зря указываются в файлах-схемах.
Вопрос в том, какие преимущества будут при использовании enum-а, если основная задача класса представить код 0x8000 в более понятном формате
Вопрос в том, какие преимущества будут при использовании enum-а, если основная задача класса представить код 0x8000 в более понятном формате
Никаких, наверное. Я пока для себя пытаюсь прояснить. У нас порядковый номер в листах то правильный, если искать по индексу? Скажем, если по коду ошибки можно будет получить строку P2ERR_ISAMSM_OPERATION_NOT_ALLOWED то это уже нормально.
Вопрос в том, какие преимущества будут при использовании enum-а, если основная задача класса представить код 0x8000 в более понятном формате
Никаких, наверное. Я пока для себя пытаюсь прояснить. У нас порядковый номер в листах то правильный, если искать по индексу? Скажем, если по коду ошибки можно будет получить строку P2ERR_ISAMSM_OPERATION_NOT_ALLOWED то это уже нормально.
Сам на это натыкался, но руки не дошли. Сейчас поискал на форуме РТС. Похоже, нужно чтобы в нитке, откуда отправляется асинхронное сообщение, должен быть бесконечный цикл с ProcessMessage. Вот здесь про это написано + это есть в плазовском примере AsyncSend. У нас ведь сейчас сообщение отправляется из GUI-thread?
По PlazaException
А вот, кстати, почему нам самим нужно вручную "крутить" ProcessMessage.
Приветствую! Захотелось проверить старую разработку через Плазу. Переписал робота, получил боевой логин. При запуске программы бросается месседж: "Ошибка подключения к серверу Плазы" Может кто-нибудь написать небольшую инструкцию, как подготовить машину для работы с Плазой через Вашу библиотеку?
К какому серверу подключаетесь (см. файл client_router.ini)? Пришлите лог P2SimpleReplClient.log.
Инструкцию сейчас пишу. Как и вся документация, идет не так быстро, как хотелось бы😢
Дайте угадаю, в примере ввели логин пароль в текстовый поля? Оставьте их пустыми и просто нажимайте кнопку Подключиться.
Подключаюсь на 194.247.133.25:4001. Нет, ваш пример я даже не собирал, сразу работаю со своим роботом. 2aspirant: Вечером на ваше мыло сброшу лог.
Может быть проблема с тtм, что я сам не ставил роутер. А использовал тот, который устанавливается с программой LTS Direct.
Если вы подключаетесь к тестовому серверу то адрес должен быть 194.247.133.43:3001 (или beta-forts.rts.ru:3001 что одно и то же). Соберите пример, проверьте работает ли он. Если да, то проблема в вашем приложении, если нет, то нада искать проблему в роутере. Ссылки на установщики роутеров есть тут.
Я подключаюсь к боевоему серверу. С тех.поддержкой РТС не связывался, так как может проблема в неправильном использовании Вашего фреймворка. Удалил роутер который устанавливался с LTSD. Установил P2_ClientGate1.11.5_32.exe c ftp РТС. Это не решило проблему - "Ошибка подключения к серверу Плазы"
Лог роутера
Это не лог роутера, а файл конфигурации логирования
Опыт установки: Исходные ингридиенты: Установщик роутера: P2_ClientGate1.11.5_32.exe PlazaTrader: отсюда: http://box.net/plaza версия от 30.05.2011
Как я понял этот вариант (в отличие от первого от 17.05.2011) сделан под базовую авторизацию: "Базовый способ: аутентификационная информация, т.е. имя пользователя и пароль, указывается в ini-файле роутера, например, при установке P2ClientGate из дистрибутива. При этом клиентский код ничего не знает про аутентификацию. В силу простоты – рекомендуемый метод." Соответственно пароль находится в открытом виде в .ini файле. Если роутер установлен не как сервис его надо запустить вручную. Плаза-трейдер просто тупо коннектится к локальному 4001 порту. Кстати почему-то все время подразумевается что локальный порт и удаленный одинаковы и равны 4001, что не всегда так. При установке Роутера вводим адреса и порты сервера Plaza(локальный порт можно изменить в .ini файле), выбираем MTA библиотеку, выбираем установку как сервис или отдельно запускаемое приложение по желанию,а также логин и пароль на подключение к плазе.
Если роутер установлен как сервис просто запускаем SampleGUI и жмем на кнопку подключить. Если роутер не сервис, предварительно запускаем роутер файликом start_router.cmd из папки куда установлен роутер. После чего как обычно пишут в Microsoft, можно откинуться на спинку стула и выпить чашечку кофе... В связи с последним на первое время не помешала бы галочка "Не загружать сделки и заявки при старте", аналогично как есть в Cofite SDK.
Ага. Теперь осталось понятить самое зерно разработки. Это API для роботов. Тоесть то, что вы называете SampleGUI, на самом деле является демонстрацией возможностей API. Поэтому нельзя к PlazaTrader применять такие понятия как базовый, безбазовый, анонимная аутентификация и т.д. PlazaTrader работает в том режиме, в котором запрограмирован робот. SampleGUI - простой пример робота. Не требует логин пароль и коннектица к локальному роутера. В реальной системе так может и не быть. Поэтому нужны переделки. Чтобы их сделать как можно быстрее, можно взять код SampleGUI, который как раз для этого и был создан.
Что касается галочка "Не загружать сделки и заявки при старте", опять же, делается через перегрузку метода StartExport в коде робота.
А у Кофите какие настройки?
У Кофите роутер по умолчанию ставится в другую папку ( что-то вроде "P2RouterForCFT") и аутентификация идет через клиента, поэтому то,что написано в .ini файле не так важно (пароля там точно нет).
У меня роутер запущен на одной машине (сервер), а Ваш пример я запускаю на другой (Клиент).
Как мне объяснить SampleGUI, чтобы он коннектился к заданному МНОЙ роутеру на заданный МНОЙ порт? (При этом, разумеется, должен быть также способ задать локальный логин и пароль для подключения к роутеру [вписывается в client_router.ini]).
ПС Есть ещё одна проблема: если запустить SampleGUI и подключиться к роутеру (на локальной машине), затем запустить второй экземпляр SampleGUI, то при попытке подключиться второй экземпляр скажет "Ошибка подключения к серверу Плазы". И затем "System.TimeoutException: Соединение не бьыло установлено в отведенный отрезок времени".
Если будет возможность указывать локальные логины для подключения к роутеру, то это искуственное ограничение снимется.
Я много раз писал о проблеме получения данных при использовании версий библиотек старше версии 4.0. В результате только с помощью запуска профайленга мне удалось найти причину тормозов. Этой причиной к моему удивлению оказался метод
onnection - это экземпляр класса CP2ConnectionClass, который в свою очередь находить в библиотеке Interop.P2ClientGateMTA32.dll. После замены файла Interop.P2ClientGateMTA32.dll в новых версиях StockSharp на библиотеку используемую версии 4.0 все тормоза пропали. Может мне кто нибудь объяснит как так? Библиотека суде по всему одна и таже. Она стандартная. Но...
onnection.ProcessMessage(out cookie, (uint)PollTimeOut.TotalMilliseconds);
Ну это удивительно. Но проблема была не в StockSharp а в Interop.P2ClientGateMTA32.dll Тот Interop.P2ClientGateMTA32.dll что в новых релизах идет какой то бажный, а вот тот что в версии 4.0 норм работает. Хотя не размер не версия не изменена...
Попробуйте его сами у себя сгенерировать, из дистрибутива Plaza. В версии 4.0 - это какой? Interop.P2ClientGateMTA32.dll? Он не менялся со времён как появился.
Именно! И я это прекрасно понимаю. Но у меня новые библиотеки норм работают только если я Interop.P2ClientGateMTA32.dll заменяю на тот что был в версии 4.0 Ну вот не знаю я почему...
Я обычно рядом с такими вещами если они в коде пишу "It's magic" :D
Как вы определяете тормоза \ задержки? Дайте конкретные цифры и логгирование событий, чтоб понимать о чём речь.
Александр. Я просто запускаю SampleGUI для версии 4.0 и более позних версий. И открываю окно заявок. И вот если в версии 4.0 новые заявки приходят даже раньше чем в квике(в программе) они появляются, то в версиях более поздних они приходям через несколько минут! Что для плазы вообще не приемлемо... Я и тот и тот проект профайлером просматривал. В версиях позднее 4.0 40% времени тратиться на строчку сonnection.ProcessMessage(...);
естественно ProcessMessage стал вызываться чаще, т.к. таймаут снизился.
Interop.P2ClientGateMTA32.dll не менялся ни разу с тех пор как положили в TFS. Посмотрите по хистори. Без логгирования и реальных результатов - пока лишь разговоры.
Нет тестов и логов - нет проблемы в данном случае :)
Согласен. И вашу позицию понимаю. Ну мне достаточно того что я теперь знаю как это испр и я если у кого то еще это будет то я написал как испр)
Тестировал плазу с утра. И заметил странное явление. При выполнении следующего кода
Первые минуты 2 где то загрузка на процессор катастрофична. Причем даже после того как все портфели и инструменты загрузились она не начинает падать. Не падает она и после того как прогрузились старые заявки и начали поступать новые... Потом через какое то время нагрузка падает и такое состояние продолжается далее... Не могу понять что происходит в эти первые минуту...
Происходит подключение и прогрузка всей поступившей информации.
Просто смотрю изменяется ли название портфеля в текстовом поле куда я вывожу один из портфелей или инструментов поступивших при вызове события NewPortfolios или NewSecurities. И так же вижу что новые заявки начали поступать, а загрузка еще приличная. Потом проходит еще какое то время и нагрузка падает...
Конечно что то я накрутил там явно с обработкой событий)) Но думаю это не является причиной. Сейчас упрощу и проверю еще...
А насчет свечек... Ну я точно этой инф не пользуюсь. Я показал код который принимает данные. Или они все равно строятся?)
А можно как нибудь подписаться на получение только некоторых потоков? (реплики они называются?) Очень долго подгружаются сделки (которые мне не нужны) хочется иметь только собственные сделки + стакан.
Обнаружил баг когда у активной заявки (которая была частично исполнена) статус Done. В PlazaTrader.cs есть такие строчки:
Это вообще правильно? Судя по форуму РТС action == 2 когда по заявке была хотя бы одна сделка. (т.е. она не обязана быть полностью сведенной)
http://forum.rts.ru/viewtopic.asp?t=19140
Вобщем факт, что у активной заявки был статус Done (в SampleGUI и в моем собственном приложении).
Обнаружил баг когда у активной заявки (которая была частично исполнена) статус Done. В PlazaTrader.cs есть такие строчки:
Это вообще правильно? Судя по форуму РТС action == 2 когда по заявке была хотя бы одна сделка. (т.е. она не обязана быть полностью сведенной)
http://forum.rts.ru/viewtopic.asp?t=19140
Вобщем факт, что у активной заявки был статус Done (в SampleGUI и в моем собственном приложении).
Это не верно, поэтому я ещё 28 октября поправил