Добрый день!
Не знаю, куда правильно постить информацию о багах, опубликую здесь.
Подключаюсь к торговой системе посредством SmartTrader'а.
Сегодня на вечернем клиринге с моего счета списали мартовские опционы вне денег. Эти операции отдаются со стороны торговой системы как сделки с нулевым orderTransactionId. В результате при получении сделок возникает exception:
15.03.2012 21:21:32 err Trader.ProcessDataError: System.ArgumentOutOfRangeException: Номер транзакции должен быть отличен от нуля.
Parameter name: orderTransactionId
Actual value was 0.
at StockSharp.Algo.BaseTrader.AddMyTrade(Security security, Int64 orderId, Int64 orderTransactionId, Int64 tradeId, Func2 createTrade, Action1 initMyTrade)
at StockSharp.Smart.SmartTrader.#=qfzSH89$Mv8Ofzu2y$3js_kysbq$NiANKIBBTSpnvTGs=.#=q4mbFJ60V1bPbFeGAvyC1ibxEquGFFRHMAVcij6R3Spg=(Security #=qxrfNJbw0xpwzUWGXMStJHw==)
at StockSharp.Algo.BaseTrader.GetSecurity(String id, Func2 createSecurity, Action1 changeSecurity, String nativeSecurityId)
at StockSharp.Algo.BaseTrader.GetSecurity(String id, Action1 changeSecurity, String nativeSecurityId) at StockSharp.Smart.SmartTrader.#=qwRaN51iZmc1S0J9GUiteXg==(Int32 #=qcKJ3I5IWFH9VGLCcFIxLWQ==, Int32 #=qd_HFLT8KhQdYPYrriX3Z0w==, String #=qA26HfIyr1Hp1awyY$ScCNw==, String #=q4kT6hRtHz0cB30gzvW2Uow==, String #=qxsnZ7xnxtOVt_x2Uv9kPPQ==, String #=q7F54ujMZTFZrOrnYJVfk4g==, Int32 #=qtR35YFeUwJZKl7$1hymQrw==, Int32 #=qLReP$4l4o5IgcNxSE8j0Vw==, Decimal #=qrciuxaDj5NbwitmG7x6PgQ==, Decimal #=qf54825kg7L9SdT_qlB4SKg==, String #=qtQxI15g5cUMatZ_YBKWP9w==, String #=q4MEPte6Q5ZnUsivjDz2KOQ==, Nullable1 #=qekZ0Fn305HW0Pt3gP6Gk0Q==, Decimal #=qrrUBO3JMgQ6dy_R0YmVzQuFxkjDU6Vy_S_1hGd0cj2w=, Decimal #=qdaiuwzZ5XwfDPHIrdJ59ew==)
at Ecng.Common.DelegateHelper.SafeInvoke[T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15](Action`15 handler, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)
at StockSharp.Smart.SmartComWrapper.#=qfzSH89$Mv8Ofzu2y$3js_qgdS7SCdhEpMj2tiPnQ2bQ=.#=qD19bRnre6gLZZNWHAbtsdbqqmA2tHEYXwNn2tuxYMQk=()
at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)
Upd. По этой ненорме создал тикет на codeplex:
Kommentare (19)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Можно попробовать добавить поддержку. Кроме этого есть еще какие особенности в транслировании данных? Если поставочный фьючерс, то так же делают исполнение через сделки?
Опыта работы с поставочными инструментами у меня нет. Но в случае с экспирацией опционов вне денег ситуация, на мой взгляд, ясная. Сделка по списанию опциона регистрируется в торговой системе, но не регистрируется на сервере котировок. Полагаю так будет для всех опционов вне денег на все базовые активы.
По-поводу особенностей трансляции данных. По событию NewSecurities данные со стороны торговой системы загружаются заметно долго даже на железной машине, на витруалке должно быть еще дольше. Причем большая часть загружаемой информации - это данные по экспирированным инстументам и они, как правило, не нужны. Думаю, имело бы смысл реализовать в SmartTrader'е загрузку справочника инстументов из файла + добавлять туда новые инструменты. Могу сделать сам, но нужен доступ к исходнику коннектора.
Протухшие инструменты выкидываются через терминал.
Терминал - это SmartTrade или SmartX? Но они не используют SmartCOM. Как они могут фильтровать вывод AddSymbol? Уверен, что никак не могут.
А вы спросите у тех поддержки АйТи по поводу протухших инструментов.
Михаил, я использую SmartCOM API довольно интенсивно для программирования собственной оснастки для торговли опционами, поэтому разбираюсь в этом софте хорошо. Сейчас потихоньку осваиваю StockSharp.
Так вот, ни в SmartCOM API, ни в торговых терминалах IT Invest нет возможности формировать вывод AddSymbol. Это событие всегда передает информацию по всем инструментам, какие есть на торговой площадке. Далее приходится забирать нужные инструменты из того, что получено посредством этого события, после этого подписывать эти инструменты на событие UpdateQuote. В-принципе AddSymbol можно и не использовать- для того чтобы подписать инструмент на UpdateQuote нужны только название инструмента в торговой системе и название портфеля.
В StockSharp объект Security аккумулирует всю информацию, получаемую от двух событий - AddSymbol и UpdateQuote. Поэтому я не уверен, что здесь вообще можно обойтись без использования AddSymbol, и, на мой взгляд, скорость загрузки справочника целесообразно оптимизировать указанным выше способом.
Тем не менее, я рекомендую этот вопрос уточнить у тех поддержки. Если я ошибаюсь, то посыплю голову пеплом (хотя будет странно, так как ранее я это проделывал не раз). Если вы ошибаетесь, то вы получите информацию, как уйти от этой проблемы стандартными средствами брокера. В любом случае мы получим информацию, бесплатно и существенно полезную.
Лог переписки с поддержкой.
К сожалению, на данный момент никак.
-----Original Message----- From: Дмитрий Седов [mailto:XXX@XXX] Sent: Monday, March 19, 2012 3:18 PM To: SmartCOM Subject: Re[4]: Прошу разъяснить некоторые особенности работы SmartCOM API.
То, что список инструментов закачивается не мгновенно, это, в-общем, не страшно. Неприятно, что в момент его получения замирает программа - даже несмотря на событийную модель и многоядерность. Не подскажите, как можно избежать этого "замирания"?
Mon, 19 Mar 2012 15:10:37 +0700 от "SmartCOM" smartcom@iqi.ru:
Попробуйте сделать вот так http://www.itinvest.ru/forum/index.php?showtopic=63472
Михаил, у меня сложилось впечатление, что Вы неверно представляете себе процесс обновления инструментов в торговых терминалах IT Invest. Он происходит так:
Давайте пойдем по логическому пути. Я правильно понял, что тех поддержка гарантировала, что протухшие опционы будут всегда приходить, месячной давности, декадной, годовой, пяти летней? И избавиться от этого нельзя? Или все же какой-то способ существует?
Ну, не совсем так. На клиента по GetSymbols/AddSymbol закачивается информация обо всех инструментах, какие есть в справочнике инструментов на стороне брокера (торговой системы?). Если в справочнике есть инструменты, проэкспирировавшиеся пять лет назад, то они закачаются на клиента. Если, допустим, эти инструменты на стороне брокера из справочника удалили, они на клиента не закачаются.
Штатных средств для выборочного обновления справочника ни в SmartCOM, ни в терминалах IT Invest нет. Во всяком случае в документации они не описаны.
Поговорил с тех поддержкой. Они чистят протухшие контакты. Как часто - не понятно.
Поскольку от первоначальной темы треда мы все равно отклонились, а ветка форума называется "Фичи и пожелания", позволю себе пожелать еще три фичи. :)
Точное время окончания процесса получения инструментов справочника неизвестно, поэтому было бы неплохо однозначно идентифицировать состояние этого процесса: {получение инструментов идет, получение инструментов завершилось}.
Как сделать. В обработчик AddSymbol для каждого инструмента передают его номер в справочнике + количество инструментов в справочнике. Если номер инструмента равен количеству инструментов в справочнике, то процесс передачи справочника завершен.
В DerivativeHelper есть методы, которые по коду инструмента или объекту типа Security выдают другие объекты типа Security: GetDerivatives, GetSecurity и проч. Причем при вызове этих методов характерного для GetSymbols "замирания" программы не происходит. То есть, насколько я понимаю, SmartTrader создает внутри себя справочник инструментов, а потом либо предоставляет доступ к объектам справочника, или копирует их. Было бы неплохо получить доступ к этому справочнику - в какой-то форме помимо вызова NewSecurities.
Хотелось бы справку по функционалу Ecng., например такую же, как для Stocksharp.
В-принципе, без этого свойства можно обойтись, например, отслеживая динамику изменения количества элементов в ITrader.Securities. Получаются приемлемые задержки по времени. Хотя если бы можно было однозначно идентифицировать окончание получения справочника, было бы проще.
Да, ITrader.Securities. Спасибо за подсказку!
Подозреваю, что просто немногие способны достаточно глубоко разобраться в этом инструментарии. Можно было бы создать что-то вроде user guide или how-to.
Готовы взяться?
ИМХО, это задача для разработчика или опытного пользователя. Я недостаточно хорошо знаю этот инструментарий, чтобы учить других, как его применять. Может быть попозже, если почувствую, что накопил достаточно опыта.
у нас свободных рук не хватает )