Нестабильная работа stocksharp - quik(lua)
Atom
05.04.2017


При подключении к квику через lua коннектор примерно в 50% случаев возникают ошибки, которые препятствуют дальнейшей работе, например после них могут не приходить инструменты через событие OnNewSecurity.
Ошибки следующие:
Это самая частая-
2017-04-05 10:00:01,938 ERROR Connector Out channel thread. OrderMaker.Robot - Сообщение 0 типа AN не было корректно обработано FIX сервером. Причина () .
System.InvalidOperationException: Сообщение 0 типа AN не было корректно обработано FIX сервером. Причина () .
2017-04-05 10:00:01,942 ERROR Connector Out channel thread. OrderMaker.Robot - Сообщение 0 типа AF не было корректно обработано FIX сервером. Причина () .
System.InvalidOperationException: Сообщение 0 типа AF не было корректно обработано FIX сервером. Причина () .

А вот эта реже:
2017-03-31 10:00:03,167 ERROR Connector Out channel thread. OrderMaker.Robot - Ошибка получение маркет-даты. Код '0', текст 'An item with the same key has already been added.'.
System.InvalidOperationException: Ошибка получение маркет-даты. Код '0', текст 'An item with the same key has already been added.'.

БКС Quik 7.2.2.3
StockSharp 4.3.19.4

Есть догадки в чем может быть причина? Проблема плавающая, иногда есть иногда нет. Помогает простой перезапуск приложения.


Теги:


Спасибо:




18 Ответов
Support

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


Это какие то специфичные для Вашего компьютера (интернет соединения) ошибки... У других клиентов такой проблемы нет... Для теста попробуйте соединение с демо-версией Квик, с сайта арки...
Спасибо:

Oleg

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


А как это может быть связано с интернет соединением если стокшарп и квик находятся на одной машине? Вот стек трейс ошибки:
2017-04-10 10:00:01,959 ERROR 13 StockSharp - System.InvalidCastException: Can't convert An item with the same key has already been added. of type 'System.String' to type 'System.Int64'. ---> System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Int64.Parse(String s)
at Ecng.Common.Converter.<>c__DisplayClass7_0`2.<AddTypedConverter>b__0(Object input)
at Ecng.Common.Converter.To(Object value, Type destinationType)
--- End of inner exception stack trace ---
at Ecng.Common.Converter.To(Object value, Type destinationType)
at Ecng.Common.Converter.To[T](Object value)
at StockSharp.Fix.Dialects.BaseDialect.#=q4E6qw9ni6$r4OjW8kCcchaO22oUYDwlf$y2e4Ep19os=.#=qYAOTDJubdgblzSr3F8Yy91nAdN2fIkbbUMi5aqBuJi8=(FixTags #=qDnIAHxkj6fYd9E$HnrtD_A==)
at #=q1sCYNkHzKhsY_6HLheYzhhJV85Lpb7_O1Atr6J__UGJdc5bMQ6KHWIc9eocy$q0m.#=qMwi5iioRaWo7on3r5LUqVg==(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==, Func`2 #=qqvtiH9jpZZIjl4lW6nci_A==)
at StockSharp.Fix.Dialects.BaseDialect.#=qevR2qqRlSjQhStOvvCPjw4pv09I4WdH19bqCPXP7vrc=(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==, AllocationArray`1 #=q0Oh84SUvRgNSUWUpWtHB7g==)
at StockSharp.Fix.Dialects.BaseDialect.OnRead(IFixReader reader, String msgType, AllocationArray`1 messages)
at StockSharp.Fix.Dialects.DefaultDialect.OnRead(IFixReader reader, String msgType, AllocationArray`1 messages)
at StockSharp.Fix.Dialects.BaseDialect.#=qBRi1qHhKJgwK_JK91DEZGLWkzaFJ3JxVkqywNCY9gswcFEHuSVkHzYKM_15ty_l_()
at StockSharp.Fix.FixMessageAdapter.#=qDdiEz14PG3MWHn4HOFEykivnxMLbfuxptzA3$ZLOBTI=()
Автор топика
Спасибо:

Support

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


Какой пример используете?
Спасибо:

Oleg

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


Проблема в том что ошибка плавающая, я не могу составить пример который гарантированно бы приводил к этой ошибке. Ошибка происходит после вызова QuikTrader.Connect, но уже в другом потоке. Ошибка бывает только утром, то есть если утром при подключении ее не было, то и в течении дня не будет. Между вызовом QuikTrader.Connect и ошибкой никаких действий не производится.
Автор топика
Спасибо:

Oleg

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


Еще доп. инфо.
Ошибка из файла Quik.Lua:
2017/04/10 10:00:07.884|Error |FixServer |System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at Ecng.Serialization.BinaryHelper.ReadBytes(Stream stream, Byte[] buffer, Int32 len, Int32 pos)
at StockSharp.Fix.Native.BaseFixReader.ReadByte()
at StockSharp.Fix.Native.TextFixReader.SkipValue()
at #=q1sCYNkHzKhsY_6HLheYzhhJV85Lpb7_O1Atr6J__UGJdc5bMQ6KHWIc9eocy$q0m.#=qR$DIpneT79S8FnCf0SqFOQ==(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==)

И еще квик работает круглосуточно, т.е. на ночь его не выключают.
Автор топика
Спасибо:

Support

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


Чтобы понять в чем проблема, эту ошибку нужно воспроизвести.. Для этого нужен конкретный код и лог в момент ошибки...
Спасибо:

Oleg

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


Код я уже говорил, самый простой, это фактически одна строка QuikTrade.Connect, все, больше никакого кода до получения этой ошибки нет.
Плюс я уже писал что проблема плавающая, как вы себе представляете написать код который ее воспроизводит? Можно ведь провести анализ ситуации, в стек трейсе явно видно что где то идет обращение к disposed объекту NetworkStream, похоже что после этого не происходит "восстановления". Я бы сам это сделал, но судя по всему сборки обфусцированы и как расшифровать вот это at #=q1sCYNkHzKhsY_6HLheYzhhJV85Lpb7_O1Atr6J__UGJdc5bMQ6KHWIc9eocy$q0m.#=qR$DIpneT79S8FnCf0SqFOQ==(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==)
мне неясно.
У меня есть предположение что это может быть связано с тем что квик не выключается на ночь и возможно в lua скрипте этот NetworkStream диспозится ночью по таймауту, но это я проверить не могу.
Автор топика
Спасибо:

Support

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


Передам вашу проблему разработчикам..
Спасибо:

Support

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


Установите самую последнюю версию s# и сделайте логи на этой версии в режиме логирования debug. Нужны логи трейдера и Lua. Тест нужно выполнить на примере из s# (SimpleQuik) или прислать код вашего примера...
Спасибо:

Oleg

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


Установил версию 4.3.23.
С ней другая проблема, в инструментах которые приходят в заявках не заполняется поле Class инструмента. То есть order.Security.Class == "", у меня в коде это поле использовалось, откуда теперь надо брать значение Class?
Автор топика
Спасибо:

Support

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


А при получении инструментов это поле заполнено?
Спасибо:

Oleg

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


Тоже не заполнено.
image340.png
Автор топика
Спасибо:

Support

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


Проверьте поля после выполнения RegisterSecurity? Что это за инструмент?
Спасибо:

Oleg

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


RegisterSecurity я вообще не вызываю, мне это не нужно. Но ради интереса добавил вызов - все равно поле Class не заполнилось.
По поводу инструмента можно уточнить вопрос, что именно интересует, на скриншоте видно код инструмента.
Автор топика
Спасибо:

Support

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


Поле класс Вы с какой целю используете?
Спасибо:

Support

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


Support Перейти
Поле класс Вы с какой целю используете?
В s# классу соответствует поле board.

Спасибо:

Oleg

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


Один и тот же инструмент(с одинаковым кодом) может торговаться в разных классах, мне надо понимать к какому классу он относится, так как лимиты у меня считаются в разрезе класса.
Зачем тогда поле Class в инструменте, тем более почему в предыдущей версии все работало?
Автор топика
Спасибо:

Support

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


В s# инструмент уникальным образом идентифицирует id (code + board).. Поле Class просто дублировало информацию.
Спасибо:


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

loading
clippy