При подключении к квику через 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)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Это какие то специфичные для Вашего компьютера (интернет соединения) ошибки... У других клиентов такой проблемы нет... Для теста попробуйте соединение с демо-версией Квик, с сайта арки...
А как это может быть связано с интернет соединением если стокшарп и квик находятся на одной машине? Вот стек трейс ошибки: 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(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=()Какой пример используете?
Проблема в том что ошибка плавающая, я не могу составить пример который гарантированно бы приводил к этой ошибке. Ошибка происходит после вызова QuikTrader.Connect, но уже в другом потоке. Ошибка бывает только утром, то есть если утром при подключении ее не было, то и в течении дня не будет. Между вызовом QuikTrader.Connect и ошибкой никаких действий не производится.
Еще доп. инфо. Ошибка из файла 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==)
И еще квик работает круглосуточно, т.е. на ночь его не выключают.
Чтобы понять в чем проблема, эту ошибку нужно воспроизвести.. Для этого нужен конкретный код и лог в момент ошибки...
Код я уже говорил, самый простой, это фактически одна строка QuikTrade.Connect, все, больше никакого кода до получения этой ошибки нет. Плюс я уже писал что проблема плавающая, как вы себе представляете написать код который ее воспроизводит? Можно ведь провести анализ ситуации, в стек трейсе явно видно что где то идет обращение к disposed объекту NetworkStream, похоже что после этого не происходит "восстановления". Я бы сам это сделал, но судя по всему сборки обфусцированы и как расшифровать вот это at #=q1sCYNkHzKhsY_6HLheYzhhJV85Lpb7_O1Atr6J__UGJdc5bMQ6KHWIc9eocy$q0m.#=qR$DIpneT79S8FnCf0SqFOQ==(IFixReader #=qb8AjmBrA34z7ofacaE2Meg==) мне неясно. У меня есть предположение что это может быть связано с тем что квик не выключается на ночь и возможно в lua скрипте этот NetworkStream диспозится ночью по таймауту, но это я проверить не могу.
Передам вашу проблему разработчикам..
Установите самую последнюю версию s# и сделайте логи на этой версии в режиме логирования debug. Нужны логи трейдера и Lua. Тест нужно выполнить на примере из s# (SimpleQuik) или прислать код вашего примера...
Установил версию 4.3.23. С ней другая проблема, в инструментах которые приходят в заявках не заполняется поле Class инструмента. То есть order.Security.Class == "", у меня в коде это поле использовалось, откуда теперь надо брать значение Class?
А при получении инструментов это поле заполнено?
Тоже не заполнено.
Проверьте поля после выполнения RegisterSecurity? Что это за инструмент?
RegisterSecurity я вообще не вызываю, мне это не нужно. Но ради интереса добавил вызов - все равно поле Class не заполнилось. По поводу инструмента можно уточнить вопрос, что именно интересует, на скриншоте видно код инструмента.
Поле класс Вы с какой целю используете?
Один и тот же инструмент(с одинаковым кодом) может торговаться в разных классах, мне надо понимать к какому классу он относится, так как лимиты у меня считаются в разрезе класса. Зачем тогда поле Class в инструменте, тем более почему в предыдущей версии все работало?
В s# инструмент уникальным образом идентифицирует id (code + board).. Поле Class просто дублировало информацию.
Переделал. Обновился до версии 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.Dictionary
2.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 ''.
Это происходит только на боевом сервере квика, там я эксперименты проводить не могу, а на тесте таких проблем не возникает.
Какая ошибка в коннекторе в итоге проявилась? Инструмент не был получен, заявка не выставилась?
Раньше было два кейса:
Но сейчас точно сказать не могу так как я сделал workaround, если происходит одна из указанных выше ошибок(ловлю их в событии Trader.Log) то автоматически убивается приложение и через 5 минут запускается снова.