API 4.3.14.2(особенности, изменения, замечания, новинки, баги)


API 4.3.14.2(особенности, изменения, замечания, новинки, баги)
Atom Reply
4/21/2016


Чтобы не плодить тонну постов - я предлагаю под каждый новый/старый релиз API создать одну ветку-пост, в которой описывать все замечания по конкретному релизу. В общем, данный пост про конретный релиз API 4.3.14.2, пишем сюда все замечания касательно только данного релиза. Когда выйдет новый релиз API 4.3.15 - под него создадим новый пост. Так будет более-менее упорядоченно.


Сегодня заметил опечатку, ну я предполагаю что это опечатка, т.к. исходники не глядел. Событие StopOrderRegistered класса Strategy, в версии API 4.3.13 называлось по нормальному "Событие об успешной регистрации стоп-заявки". В новом API 4.3.14.2 имя изменилось на "Событие об ошибке регистрации стоп-заявки", хотя событие отвечающее за это - уже есть StopOrderRegisterFailed. В итоге, появился дубль. Два события StopOrderRegistered и StopOrderRegisterFailed, - судя по описанию, выполняются одно и тоже. Я думаю это опечатка, хотя хрен его знает.

http://i9.pixs.ru/storage/2/5/8/Opechatkaj_2093534_21643258.jpg

Tags:


Thanks: Mikhail Sukhov




20 Answers
Den

Avatar
Date: 4/25/2016
Reply


SampleQuik S# 4.3.14.2 и Quik 7.1.2.2 от БКС.
В логах вижу

|LuaServer |LookupOrders
|LuaServer |Orders count: 12
|LuaServer |LookupOrders done
|LuaServer |LookupTrades
|LuaServer |Own trades count: 16
|LuaServer |LookupTrades done

Но события NewMyTrades, NewOrders не вызываются...
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/26/2016
Reply


Den Перейти
SampleQuik S# 4.3.14.2 и Quik 7.1.2.2 от БКС.


На демо БКС 7.1.1.16 работает. Изменение в версии минимальное, думаю, что причина в каких-то ваших настройках локальных.
Thanks:

shipa988

Avatar
Date: 4/28/2016
Reply


У меня в новой версии не получает инструменты. Портфель приходит, инструменты нет. демо БКС 7.1.1.16
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/28/2016
Reply


shipa988 Перейти
У меня в новой версии не получает инструменты. Портфель приходит, инструменты нет. демо БКС 7.1.1.16


Пример запускали?
Thanks:

shipa988

Avatar
Date: 5/5/2016
Reply


Да запускал! он то и не работает. Предыдущая версия stocksharp успешно работает и сейчас. Однако предыдущая версия с демо БКС 7.1.1.16 не регистрирует заявки(говорит что не верно указан торговый счет). Хотя с Quik с официального сайта АРКА 7.2.0.45 все проходит. Вот такие вот загадки((
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 5/5/2016
Reply


shipa988 Перейти
(говорит что не верно указан торговый счет).


Логи клиента и сервера под режимом Дебаг.
Thanks:

shipa988

Avatar
Date: 5/5/2016
Reply


0001/01/01 00:00:00.000| |QuikTrader|Connect
2016/05/05 13:49:34.642|Debug |Quik LUA. Market data|To server: 8=FIX.4.4^9=95^35=A^49=quik^56=StockSharpMD^52=20160505-10:49:34.640^34=1^98=0^108=60^141=Y^553=quik^554=quik^10=174^
2016/05/05 13:49:34.643|Debug |Quik LUA. Transactions|To server: 8=FIX.4.4^9=95^35=A^49=quik^56=StockSharpTS^52=20160505-10:49:34.640^34=1^98=0^108=60^141=Y^553=quik^554=quik^10=196^
2016/05/05 13:49:36.103| |Quik LUA. Transactions|From server: Logon
2016/05/05 13:49:36.103| |Quik LUA. Market data|From server: Logon
2016/05/05 13:49:36.106|Debug |QuikTrader|BP:Connect,T(L)=2016.05.05 13:49:36.109
2016/05/05 13:49:36.115|Debug |Quik LUA. Market data|Сессия 'server'. Получено: '8=FIX.4.0^9=59^35=A^49=quik^56=StockSharpMD^52=20160505-10:49:36.105^34=1^10=052^'
2016/05/05 13:49:36.115|Debug |Quik LUA. Transactions|Сессия 'server'. Получено: '8=FIX.4.0^9=59^35=A^49=quik^56=StockSharpTS^52=20160505-10:49:36.105^34=1^10=074^'
2016/05/05 13:49:36.109|Debug |QuikTrader|BP:Connect,T(L)=2016.05.05 13:49:36.109
2016/05/05 13:49:36.122|Debug |Quik LUA. Market data|To server: 8=F]новый quik[/img]
[img=]старый quik[/img]
Thanks:

shipa988

Avatar
Date: 5/5/2016
Reply


сами файлы
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 5/5/2016
Reply


shipa988 Перейти
сами файлы


Код
t["ACCOUNT"] = "S0-USA"
t["CLASSCODE"] = "TQBR"
t["SECCODE"] = "SBER"
t["QUANTITY"] = "50"
t["CLIENT_CODE"] = "50950"
t["EXPIRY_DATE"] = "GTC"
t["OPERATION"] = "B"
t["TYPE"] = "M"
t["ACTION"] = "NEW_ORDER"
t["PRICE"] = "0"
t["EXECUTION_CONDITION"] = "PUT_IN_QUEUE"
t["TRANS_ID"] = "55599460"


Это транзакция. И дальше вам ответ от Квика, что неверно указан номер счета. Что не так - это вам к Арке или брокеру. S# корректно все данные отправил в терминал и корректно получил по ним ответ.
Thanks:

Gavrus

Avatar
Training Donator
Date: 5/6/2016
Reply


Кто в курсе, подскажите, пожалуйста. При использовании старого подключения к Quik по DDE, раньше до версии 4.3.13 все работало, все таблицы нормально из квика экспортировались, но с версии 4.3.14 экспорт из квика по DDE запускается а в QuikTrader они не поступают ((((
В чем проблема??? Этот функционал не работает в ПРИМЕРАХ!
Thanks:

Slepoy

Avatar
Date: 5/7/2016
Reply


Gavrus Перейти
Кто в курсе, подскажите, пожалуйста. При использовании старого подключения к Quik по DDE, раньше до версии 4.3.13 все работало, все таблицы нормально из квика экспортировались, но с версии 4.3.14 экспорт из квика по DDE запускается а в QuikTrader они не поступают ((((
В чем проблема??? Этот функционал не работает в ПРИМЕРАХ!


Я бы на твоём месте забил на ДДЕ, и начал бы перебираться на ЛУА. Походу всё идёт к тому, что ДДЕ скоро вообще полноcтью выпилят из API. Поддерживать устаревший и неудобный коннектор "ДДЕ+библиотека_транзакций" - это лишние трудо/время/бабло-затраты. Я бы на их месте ДДЕ - полностью бы выпилил.
Topic starter
Thanks:

daniil.tr

Avatar
Date: 5/10/2016
Reply


День добрый.
При использовании примера Quik для подключения к бирже по протоколу FIX получаю непонятную ошибку "Value is empty"
Код
2016/05/10 17:09:21.709| |Quik LUA. Market data|Connect to Unspecified/api.okcoin.cn:9880...
2016/05/10 17:09:22.100| |Quik LUA. Market data|Connect to Unspecified/api.okcoin.cn:9880 is OK.
2016/05/10 17:09:22.101| |Quik LUA. Market data|Sending logon to Unspecified/api.okcoin.cn:9880...
2016/05/10 17:09:22.101| |Quik LUA. Market data|Logon sent to Unspecified/api.okcoin.cn:9880 OK.
2016/05/10 17:09:22.101| |Quik LUA. Market data|Start message processing.
2016/05/10 17:09:22.101|Debug |Quik LUA. Market data|To server: 8=FIX.4.4^9=183^35=A^49=тут_мой_apiKey^56=OKSERVER^52=20160510-14:09:22.101^34=1^98=0^108=60^141=Y^553=тут_мой_apiKey^554=тут_мой_secretKey^10=170^
2016/05/10 17:09:22.900|Error |Quik LUA. Market data|System.InvalidOperationException: Value is empty.
в StockSharp.Fix.Native.TextFixReader.ReadTag()
в #=qfRZ7pemjxpoxPmObVEtIBevMOyapMU_VyornAvZTO0ahyDqZVsf9rv_PEclzz1MA.#=qgSGR1SDFtSJUIe7X8zQRtA==(IFixReader #=q2nUiutBfR3eEUh$g9VIiog==, FixTags #=qyAk4CplYsCM0dwrEZFWo1g==)
в #=qfRZ7pemjxpoxPmObVEtIBevMOyapMU_VyornAvZTO0ahyDqZVsf9rv_PEclzz1MA.#=q0GRsD49WfcxbovznA_zmCg==(IFixReader #=q2nUiutBfR3eEUh$g9VIiog==, Boolean #=qH4GbWm32Qz5RrC_8REtIYEF$4P06GyVkVvT0r7inCME=, String #=qf0AhNgro1T3fdZ_Bb39oHvb06UnwOVzcKNFbiV4WruU=)
в StockSharp.Fix.Dialects.BaseDialect.#=qIArNFQzajJFGrfxlNMukiveeY00y8P2AH72zybI1DibwwcTDMHW3BJOHjCBxZK5I()
в StockSharp.Fix.FixMessageAdapter.#=q6swou73IYqd_6BZJhaj5HnS_D9hOtWLhD3osscl99dY=()


Тоже самое при использовании коннектора FIX в S#.Designer
Код
07:09:41.644| |FIX |Connect to Unspecified/api.okcoin.com:9880...
07:09:42.282| |FIX |Connect to Unspecified/api.okcoin.com:9880 is OK.
07:09:42.283| |FIX |Sending logon to Unspecified/api.okcoin.com:9880...
07:09:42.289| |FIX |Logon sent to Unspecified/api.okcoin.com:9880 OK.
07:09:42.290| |FIX |Start message processing.
07:09:42.290|Debug |FIX |To server: 8=FIX.4.4^9=183^35=A^49=тут_мой_apiKey^56=OKSERVER^52=20160510-14:09:42.301^34=1^98=0^108=60^141=Y^553=тут_мой_apiKey^554=тут_мой_secretKey^10=174^
07:09:42.853|Error |FIX |System.InvalidOperationException: Value is empty.
at StockSharp.Fix.Native.TextFixReader.ReadTag()
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=q7DNsH2BfhTAZ62x_nJ4yvw==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, FixTags #=qRivLCfBsSqVVqvJFVrcByw==)
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=qP$RDNtHVUjZjqK0v4gNDcQ==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, Boolean #=q2TxyjlA$EpSYr0SSJLBtJkPog3yNlztOjMLZB0Cl0Rg=, String #=qDVBLmRjIXvz$8vd$MGLUwsZLAGAkQIbLmA9fILFZV20=)
at StockSharp.Fix.Dialects.BaseDialect.#=qGKC61oyjqwiWbG1NxVPW74z9sTe8CEKazn3PrVBDqL4RUK5gwTnQoR7lQRnsxOKW()
at StockSharp.Fix.FixMessageAdapter.#=qMnHVF443p6vFEntqz22V_mofNpmLxVpg9xIMaWn5ohk=()
07:09:42.855|Debug |FIX |Session 'api.okcoin.com:9880 Sender тут_мой_apiKey Target OKSERVER'. Received: ''
07:09:42.855|Error |BasketMessageAdapter|Connection error for FixMessageAdapter: System.InvalidOperationException: Value is empty.
at StockSharp.Fix.Native.TextFixReader.ReadTag()
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=q7DNsH2BfhTAZ62x_nJ4yvw==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, FixTags #=qRivLCfBsSqVVqvJFVrcByw==)
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=qP$RDNtHVUjZjqK0v4gNDcQ==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, Boolean #=q2TxyjlA$EpSYr0SSJLBtJkPog3yNlztOjMLZB0Cl0Rg=, String #=qDVBLmRjIXvz$8vd$MGLUwsZLAGAkQIbLmA9fILFZV20=)
at StockSharp.Fix.Dialects.BaseDialect.#=qGKC61oyjqwiWbG1NxVPW74z9sTe8CEKazn3PrVBDqL4RUK5gwTnQoR7lQRnsxOKW()
at StockSharp.Fix.FixMessageAdapter.#=qMnHVF443p6vFEntqz22V_mofNpmLxVpg9xIMaWn5ohk=()
07:09:42.855|Error |Connector |System.InvalidOperationException: Value is empty.
at StockSharp.Fix.Native.TextFixReader.ReadTag()
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=q7DNsH2BfhTAZ62x_nJ4yvw==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, FixTags #=qRivLCfBsSqVVqvJFVrcByw==)
at #=qjcT_UIgnP6ct_8MlSJzskygE6_7pKDeVFDL8TazXe3jwu0vjz1tfLwP8yKUs8CKf.#=qP$RDNtHVUjZjqK0v4gNDcQ==(IFixReader #=qWClUTYppieHCCFUE17PPsA==, Boolean #=q2TxyjlA$EpSYr0SSJLBtJkPog3yNlztOjMLZB0Cl0Rg=, String #=qDVBLmRjIXvz$8vd$MGLUwsZLAGAkQIbLmA9fILFZV20=)
at StockSharp.Fix.Dialects.BaseDialect.#=qGKC61oyjqwiWbG1NxVPW74z9sTe8CEKazn3PrVBDqL4RUK5gwTnQoR7lQRnsxOKW()
at StockSharp.Fix.FixMessageAdapter.#=qMnHVF443p6vFEntqz22V_mofNpmLxVpg9xIMaWn5ohk=()


В чем может быть проблема? Что я делаю не так? Непонятно в какую сторону копать...
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 5/10/2016
Reply


QuikTrader может подключаться только к терминалу. FixTrader к бирже напрямую, но это уже платный коннектор https://stocksharp.ru/products/pricing/
Thanks: daniil.tr

daniil.tr

Avatar
Date: 5/11/2016
Reply


Михаил, спасибо за ответ.
Подскажите еще пожалуйста, в S#.Designer коннектор FIX тоже платный??
Есть ли какая-то триал/демо версия FixTrader для пробы? А то не хочется брать кота в мешке ))
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 5/11/2016
Reply


daniil.tr Перейти
Михаил, спасибо за ответ.
Подскажите еще пожалуйста, в S#.Designer коннектор FIX тоже платный??
Есть ли какая-то триал/демо версия FixTrader для пробы? А то не хочется брать кота в мешке ))


Стоимость коннектора не зависит от того, где он используется. Но в Дизайнере пока нет фичи live подключения к торгам вообще. Только бэктест.
Thanks: daniil.tr

risty

Avatar
Programmer
Date: 5/11/2016
Reply


https://stocksharp.ru/for...Express-Xpf-Core-v15-2/
вот эта тема имеет место быть.
Thanks:

agat50

Avatar
Programmer
Date: 5/11/2016
Reply


risty Перейти
https://stocksharp.ru/forum/5378/DevExpress-Xpf-Core-v15-2/
вот эта тема имеет место быть.


+1, тоже встретил. Со SmartCom коннектором какие-то проблемы постоянные, примеры SampleSmartCandles SampleSmartSMA не работают нормально (не подгружаются инструменты например), на 3.13 нормально, пришлось откатиться.
Thanks:

risty

Avatar
Programmer
Date: 5/17/2016
Reply


Мужчины, какой самый элегантный способ переноса заявок через клиринг?
Мне в голову приходит подписаться на OrderChanged, посмотреть что там произошло в клиринг(баланс, цена, направление снятых заявок)
Событие же будет вызвано при снятии заявок биржей?
И восстановить заявки по приходу первой пришедшей сделке после клиринга.
Или есть какие-то другие проверенные и более элегантные способы?
Thanks:

Slepoy

Avatar
Date: 6/17/2016
Reply


Инфа для пользователей сидящих на API 4.3.14.2. Настоятельно рекомендую обновится до новой версии API 4.3.15, которая вышла на этой неделе: https://github.com/StockSharp/StockSharp/releases
В версии API 4.3.14.2 есть баг в Менеджере Позиции, конкретно при расчёте позиции исходя из реализованного объёма заявки, т.е. когда мы создаём объект передавая его конструктору true, т.е. пишем "new PositionManager(true)". Тем самым мы устанавиваем свойство byOrders в значение true. И если у вас где-то в коде используется именно такая запись "new PositionManager(true)" то ждите беду, у вас будет неверно подсчитыватся позиция. Дело в том, что в версии API 4.3.13 было вообще два отдельных метода, один расчитывал позицию по заявкам, т.е. для объекта "new PositionManager(true)", другой же метод расчитывал позицию по сделкам, т.е. для объекта "new PositionManager(false)". В версии API 4.3.14.2 эти два метода свели в один ProcessMessage() в котором и допустили косяк. Причём косяк лишь для расчёта по заявкам, при расчёте по сделкам всё работает как надо. То есть, если вы создали объект "new PositionManager(false)", то всё работает хорошо, позиция подсчитывается верно. Но если вы создали объект "new PositionManager(true)" то позиция будет почти всегда меньше реальной. Я этот косяк заметил где-то с полмесяца назад, когда изучал видеоуроки, конкретно "Урок 3. Часть 2. Strategy Rule", где была элементарная стратегия, которая должна была набрать определённную лонговую позу единичными заявками. Так вот, стратегия почти всегда перебирала больше чем надо. К примеру, ставим набрать 10 лотов, так стратегия реально наберёт то 12, то 13, то 14, то 21. И вся проблема была именно в том, что в класс Strategy не умеет создавать объект "new PositionManager(false)", в исходниках жестко приписана строчка "private IPositionManager _positionManager = new PositionManager(true);". То есть, нет возможности вручную изменить способ расчёта позиции. Чтобы создать своего Менеджера Позиции со свойством byOrders= false, мне пришлось ещё и переопределять метод OnNewMyTrades(), брать коллекцию моих пришедших сделок, перебирать её, и для каждую сделку ковертировать в объект-сообщение, и передавать его методу ProcessMessage(). В обещем, косяк разработчики заметили и поправили в новом API 4.3.15. Плохо лишь одно, что я на решение проблемы убил неделю-полторы времени, и когда я хотел уже пожаловаться отдельным постом, то тут и вышел новый API ))). Я даже картинку заготовил и всё в пустую ))). Кому интересно, картинка тута: http://i9.pixs.ru/storage/7/9/8/314h10jpg_2030394_22379798.jpg
http://i9.pixs.ru/storage/7/9/8/314h10jpg_2030394_22379798.jpg


Просьба к разработчикам. В новом API ввести в класс Strategy свойство byOrders, чтобы пользователь при создании объекта стратегии мог бы сам выбирать метод расчёта позы: по заявкам/по сделкам. То есть, записать так: private IPositionManager _positionManager = new PositionManager(byOrders); Можете byOrders сразу установить true, чтобы ни у кого не полетели роботы. И кому надо, те при создании объекта стратегии сами сменят данное свойство на false. Тем более, текущие исходники даже менять не нужно, ибо уже текущий код в классе Strategy поддерживает это, он фактически сейчас даже избыточен. Исходники уже учитывают отправку методу обектов-сообщений на основе сделок "PositionManager.ProcessMessage(trade.ToMessage());". То есть все уже и так готово. Делать практически ничего не нужно - лишь добавить свойство byOrders.
Topic starter
Thanks:

Kudryavtsev

Avatar
Date: 6/18/2016
Reply


В этой версии библиотек у меня "не работают" ваши примеры SimpleHistoryTesting и SimpleRandomEmulation (другие не смотрел). Компилируются и запускаются без проблем, но при нажатии кнопки Старт Confused.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy