← 戻る

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

При подключении к квику через 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

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

このトピックは参考になりましたか?

トピックを共有

コメント (21)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Support
Support

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

Николай_Флёров
Oleg
Oleg 著者

А как это может быть связано с интернет соединением если стокшарп и квик находятся на одной машине? Вот стек трейс ошибки: 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_02.<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(Object value) at StockSharp.Fix.Dialects.BaseDialect.#=q4E6qw9ni6$r4OjW8kCcchaO22oUYDwlf$y2e4Ep19os=.#=qYAOTDJubdgblzSr3F8Yy91nAdN2fIkbbUMi5aqBuJi8=(FixTags #=qDnIAHxkj6fYd9E$HnrtD_A==) at #=q1sCYNkHzKhsY_6HLheYzhhJV85Lpb7_O1Atr6J__UGJdc5bMQ6KHWIc9eocy$q0m.#=qMwi5iioRaWo7on3r5LUqVg==(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==, Func2 #=qqvtiH9jpZZIjl4lW6nci_A==) at StockSharp.Fix.Dialects.BaseDialect.#=qevR2qqRlSjQhStOvvCPjw4pv09I4WdH19bqCPXP7vrc=(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==, AllocationArray1 #=q0Oh84SUvRgNSUWUpWtHB7g==) at StockSharp.Fix.Dialects.BaseDialect.OnRead(IFixReader reader, String msgType, AllocationArray1 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
Support

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

Николай_Флёров
Oleg
Oleg 著者

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

Николай_Флёров
Oleg
Oleg 著者

Еще доп. инфо. Ошибка из файла 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
Support

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

Николай_Флёров
Oleg
Oleg 著者

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

Николай_Флёров
Support
Support

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

Николай_Флёров
Support
Support

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

Николай_Флёров
Oleg
Oleg 著者

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

Николай_Флёров
Support
Support

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

Николай_Флёров
Oleg
Oleg 著者

Тоже не заполнено. image340.png

Николай_Флёров
Support
Support

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

Николай_Флёров
Oleg
Oleg 著者

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

Николай_Флёров
Support
Support

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

Николай_Флёров
Support
Support

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

Oleg
Oleg 著者

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

Николай_Флёров
Support
Support

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

Николай_Флёров
Oleg
Oleg 著者

Переделал. Обновился до версии 4.3.24. Поставил режим логирования Debug.

В lua логе есть следующие ошибки. 2017/05/29 09:50:15.939|Error |LuaServer |OnMoneyLimitF System.InvalidCastException: Can't convert CNT of type 'System.String' to type 'StockSharp.Messages.CurrencyTypes'. ---> System.ArgumentException: Requested value 'CNT' was not found. at System.Enum.EnumResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument) at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase) 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(Object value) at StockSharp.Algo.TraderHelper.FromMicexCurrencyName(String name) at OnMoneyLimit(lua_State* ls, object* table, Int64 transactionId)

2017/05/29 10:00:08.499|Debug |LuaServer |OnMoneyLimit done 2017/05/29 10:00:08.549| |FixServer |From FIrobot 127.0.0.1:51177: SecurityListRequest 2017/05/29 10:00:08.551|Debug |FixServer |To client FIrobot (127.0.0.1:51177): 8=FIX.4.49=10435=y49=FIrobot56=StockSharpMD52=20170529-07:00:02.19434=2320=36001606322=636312489633403871560=110=137^ 2017/05/29 10:00:08.551| |FixServer |From FIrobot 127.0.0.1:51176: RequestForPositions 2017/05/29 10:00:08.551|Error |FixServer |System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at Ecng.Collections.SynchronizedPairSet2.OnAdding(TKey key, TValue value) at Ecng.Collections.KeyedCollection2.Add(TKey key, TValue value) at Ecng.Collections.SynchronizedPairSet2.Add(TKey key, TValue value) at StockSharp.Fix.FixServer.CreateTransactionId(FixSession session, String requestId) at StockSharp.Fix.FixServer.OnProcess(FixSession session, String msgType, IFixReader reader) at StockSharp.Fix.FixServer.#=q8RDrWV96P8h9_4FRQxT$1w==(IFixReader #=qsrpvUmPcfg40EJoGrn2AYA==, FixSession[] #=q6Ixoy5bFQl6PJEKUr3tyEQ==, #=qzmASZMX3zuoN6QiqOm6pZq_KsK9X1zhh98A1q9CCzg7XY3RK3HderxahGTdgPXPV& #=qMnVbaI76SINJREo_NrJxgw==, TcpClient #=q252tX$mdrzCXTsQH0du2tw==, EndPoint #=q615yt5h0ZHTpimXLiL1jMQ==, String& #=quvtThBwtDxHRVDbm8ruV7A==, Boolean& #=qQsQh_T$oRFR0MMED4k9CUQ==) at StockSharp.Fix.FixServer.#=q5Az29$Z2UkszXRDB6GaerRUTniFSLzbcQ3gGhsxBQE0=.#=qWU5hAUJvLKUa80eTh2yePA==(IAsyncResult #=qT9LMkgWTB1AHkq7lHluG4g==) 2017/05/29 10:00:08.551|Error |FixServer |8=FIX.4.49=8135=x49=FIrobot56=StockSharpMD52=20170529-07:00:02.19334=2320=36001606559=410=228 2017/05/29 10:00:08.561|Debug |FixServer |To client FIrobot (127.0.0.1:51176): 8=FIX.4.49=7435=349=FIrobot56=StockSharpTS52=20170529-07:00:02.20434=245=0372=AN10=114 2017/05/29 10:00:08.561|Error |FixServer |System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at Ecng.Collections.SynchronizedPairSet2.OnAdding(TKey key, TValue value) at Ecng.Collections.KeyedCollection2.Add(TKey key, TValue value) at Ecng.Collections.SynchronizedPairSet2.Add(TKey key, TValue value) at StockSharp.Fix.FixServer.CreateTransactionId(FixSession session, String requestId) at StockSharp.Fix.FixServer.OnProcess(FixSession session, String msgType, IFixReader reader) at StockSharp.Fix.FixServer.#=q8RDrWV96P8h9_4FRQxT$1w==(IFixReader #=qsrpvUmPcfg40EJoGrn2AYA==, FixSession[] #=q6Ixoy5bFQl6PJEKUr3tyEQ==, #=qzmASZMX3zuoN6QiqOm6pZq_KsK9X1zhh98A1q9CCzg7XY3RK3HderxahGTdgPXPV& #=qMnVbaI76SINJREo_NrJxgw==, TcpClient #=q252tX$mdrzCXTsQH0du2tw==, EndPoint #=q615yt5h0ZHTpimXLiL1jMQ==, String& #=quvtThBwtDxHRVDbm8ruV7A==, Boolean& #=qQsQh_T$oRFR0MMED4k9CUQ==) at StockSharp.Fix.FixServer.#=q5Az29$Z2UkszXRDB6GaerRUTniFSLzbcQ3gGhsxBQE0=.#=qWU5hAUJvLKUa80eTh2yePA==(IAsyncResult #=qT9LMkgWTB1AHkq7lHluG4g==) 2017/05/29 10:00:08.561|Error |FixServer |8=FIX.4.49=8235=AN49=FIrobot56=StockSharpTS52=20170529-07:00:02.19434=2710=36001607724=010=013 2017/05/29 10:00:08.561| |FixServer |From FIrobot 127.0.0.1:51176: OrderMassStatusRequest 2017/05/29 10:00:08.561|Debug |FixServer |To client FIrobot (127.0.0.1:51176): 8=FIX.4.49=7435=349=FIrobot56=StockSharpTS52=20170529-07:00:02.20534=345=0372=AF10=108 2017/05/29 10:00:08.561|Error |FixServer |System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at Ecng.Collections.SynchronizedPairSet2.OnAdding(TKey key, TValue value) at Ecng.Collections.KeyedCollection2.Add(TKey key, TValue value) at Ecng.Collections.SynchronizedPairSet2.Add(TKey key, TValue value) at StockSharp.Fix.FixServer.CreateTransactionId(FixSession session, String requestId) at StockSharp.Fix.FixServer.OnProcess(FixSession session, String msgType, IFixReader reader) at StockSharp.Fix.FixServer.#=q8RDrWV96P8h9_4FRQxT$1w==(IFixReader #=qsrpvUmPcfg40EJoGrn2AYA==, FixSession[] #=q6Ixoy5bFQl6PJEKUr3tyEQ==, #=qzmASZMX3zuoN6QiqOm6pZq_KsK9X1zhh98A1q9CCzg7XY3RK3HderxahGTdgPXPV& #=qMnVbaI76SINJREo_NrJxgw==, TcpClient #=q252tX$mdrzCXTsQH0du2tw==, EndPoint #=q615yt5h0ZHTpimXLiL1jMQ==, String& #=quvtThBwtDxHRVDbm8ruV7A==, Boolean& #=qQsQh_T$oRFR0MMED4k9CUQ==) at StockSharp.Fix.FixServer.#=q5Az29$Z2UkszXRDB6GaerRUTniFSLzbcQ3gGhsxBQE0=.#=qWU5hAUJvLKUa80eTh2yePA==(IAsyncResult #=qT9LMkgWTB1AHkq7lHluG4g==) 2017/05/29 10:00:08.561|Error |FixServer |8=FIX.4.49=8235=AF49=FIrobot56=StockSharpTS52=20170529-07:00:02.19434=3584=36001608585=710=028 2017/05/29 10:00:08.609|Debug |LuaServer |OnMoneyLimit 2017/05/29 10:00:08.610|Debug |LuaServer |Out. Portfolio,T(L)=0001.01.01 00:00:00.000,Name=30_5003 2017/05/29 10:00:08.610|Debug |LuaServer |Out. PortfolioChange,T(L)=0001.01.01 00:00:00.000,T(S)=2017.05.29 10:00:02.253,P=30_5003,Changes=[BeginValue, 50800000000],[CurrentValue, 50800000000],[Leverage, 10000000],[BlockedValue, 98000] 2017/05/29 10:00:08.610|Debug |LuaServer |OnMoneyLimit done 2017/05/29 10:00:08.610|Debug |LuaServer |OnMoneyLimit 2017/05/29 10:00:08.610|Debug |LuaServer |Out. Portfolio,T(L)=0001.01.01 00:00:00.000,Name=30_12342 2017/05/29 10:00:08.610|Debug |LuaServer |Out. PortfolioChange,T(L)=0001.01.01 00:00:00.000,T(S)=2017.05.29 10:00:02.254,P=30_12342,Changes=[BeginValue, 395000000],[CurrentValue, 395000000],[Leverage, 10000000],[BlockedValue, 68550000]

2017-05-29 10:00:02,215 ERROR Connector Out channel thread. OrderMaker.Robot - Сообщение 0 типа AN не было корректно обработано FIX сервером. Причина () . System.InvalidOperationException: Сообщение 0 типа AN не было корректно обработано FIX сервером. Причина () . 2017-05-29 10:00:02,216 ERROR Connector Out channel thread. OrderMaker.Robot - Сообщение 0 типа AF не было корректно обработано FIX сервером. Причина () . System.InvalidOperationException: Сообщение 0 типа AF не было корректно обработано FIX сервером. Причина () .

И еще добавилась. 2017-05-29 10:00:02,210 ERROR Connector Out channel thread. OrderMaker.Robot - Error lookup code InvalidOrUnsupportedRequest. Text ''. System.InvalidOperationException: Error lookup code InvalidOrUnsupportedRequest. Text ''.

Это происходит только на боевом сервере квика, там я эксперименты проводить не могу, а на тесте таких проблем не возникает.

Николай_Флёров
Support
Support

Какая ошибка в коннекторе в итоге проявилась? Инструмент не был получен, заявка не выставилась?

Николай_Флёров
Oleg
Oleg 著者

Раньше было два кейса:

  1. Просто не работало событие OnNewSecurities
  2. Не выставлялись заявки

Но сейчас точно сказать не могу так как я сделал workaround, если происходит одна из указанных выше ошибок(ловлю их в событии Trader.Log) то автоматически убивается приложение и через 5 минут запускается снова.

Николай_Флёров