finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
230 stars 135 forks source link

Что отправляется в сокет? #189

Closed euvgub closed 5 years ago

euvgub commented 5 years ago

покажите пожалуйста, что отправляется в сокет? Вопрос не имеет отношения к языку программирования. Вместо сокет клиента на питоне может быть сокет клиент на любом другом языке. Суть вопроса о структуре данных, отсылаемых в request.
Wireshark показывает, что в qlua socket server приходит, например такое {"data":"","id":269,"cmd":"isConnected","t":1555400409924} При отсылании точно такого же с помощью python socket клиента - сервер в ответ ничего не присылает, sock.recv - empty Что должен отсылать python socket client, чтобы получать response от quiksharp? import json import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('127.0.0.1', 34130) sock.connect(server_address) a_dict = b'{"data":"","id":269,"cmd":"isConnected","t":1555400409924}' serialized_dict = json.dumps(a_dict) sock.sendall(serialized_dict) while(True): data = sock.recv(1024) print(data)

Nikolaev-Nikolay commented 5 years ago

Добрый день! Насколько я понял есть еще дин сокет (канал) по которому передается служебка. Служебка потверждает транзакцию Я тоже заинтересован сделать питон ориентированную версию к квику. Немного не по теме но насколько Вы далеко продвинулись?!

euvgub commented 5 years ago

Добрый день! Насколько я понял есть еще дин сокет (канал) по которому передается служебка. Служебка потверждает транзакцию Я тоже заинтересован сделать питон ориентированную версию к квику. Немного не по теме но насколько Вы далеко продвинулись?!

Второй сокет на порту 34131 вещает в эфир отдельно от первого данные-коллбеки функций On....

euvgub commented 5 years ago

Wireshark-ом отловили формат посылаемого на порт 34130 сообщения. Например такого {"data":"SPBFUT|01931FX","id":461,"cmd":"getPortfolioInfo","t":1555364989736} видим нужный response. Отсылаем точно такое же сообщение из питон клиента - в ответ тишина. Поскольку qlua socket серверу абсолютно все равно на каком языке написан сокет клиент - значит сокет сервер не понимает наше сообщение по причине несоответствия его тому, что ожидает на вход сокет сервер. Пытаюсь прописать PrintDbgStr в qlua socket сервере, чтобы понять, что он должен получить на вход, чтобы прекратить молчание. Из текста функций lua файлов сокет сервера понять не очень получается, т.к. с lua и qlua до этого не приходилось иметь отношений

euvgub commented 5 years ago

Второй вариант - оттрейсить в Visual Studio, что посылается в за-json-ненном Message из c# файлов и повторить на питоне с точностью до две кавычки-одна кавычка-апостроф

Nikolaev-Nikolay commented 5 years ago

Я тоже думал об этом, придется повторить (написать заново) питон оболочку. Может пока прописать какие шаги необходимо сделать для выполнения той или иной операции с точки зрения протокола qlua. Например получения массива о цене покупки и продажи (стакан) и т.д. Я вообще смотрел бы в сторону API биржи криптовалют - например эксмо. Если написать такие команды (API на пионе) - это второй уровень. Третий уровень построение с помощью эти кирпичеков торговой модели, графики и т.д.

buybackoff commented 5 years ago

Wireshark-ом отловили формат посылаемого на порт 34130 сообщения. Например такого {"data":"SPBFUT|01931FX","id":461,"cmd":"getPortfolioInfo","t":1555364989736} видим нужный response. Отсылаем точно такое же сообщение из питон клиента - в ответ тишина.

Сервер поддерживает только один клиент. Может вы сначала подключаетесь из C#, а потом из Питона. Второе соединение не пройдет.

А вообще посылаются простые JSON сообщения. Была идея сделать формальный JSON-RPC протокол, но не стал парится с формальностями так как по сути тут своя вариация той же самой идеи. Папаметры посылаются во многих местых через | символ.

euvgub commented 5 years ago

Клиент питон коннектится на порт 34130, посылает сообщение json {"data":"Ping","id":1,"cmd":"ping","t":0}, ждет пока не отключить. в ответ по тому же порту 34130 не приходит ожидаемое сообщение Pong

buybackoff commented 5 years ago

Клиент питон коннектится на порт 34130, посылает сообщение json {"data":"Ping","id":1,"cmd":"ping","t":0}, ждет пока не отключить. в ответ по тому же порту 34130 не приходит ожидаемое сообщение Pong

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

euvgub commented 5 years ago

Вставка в qsutils.lua в функцию function receiveRequest() вариантов дебуга типа PrintDbgStr("PrintDbgStr_requestString: " .. requestString) для просмотра в debugview или log(requestString) не дает никаких результатов. - т.е. сокет сервер никак не реагирует на полученное сообщение "Ping" и кажется не получает "Ping"

euvgub commented 5 years ago

Со стороны клиента все без проблем доходит до пункта получения response от сервера. # Creating socket # Connecting to server, 127.0.0.1 (127.0.0.1) #Connected # Sending data to server *# Receive data from server и дальше ничего не приходит от сервера

euvgub commented 5 years ago

Формат сообщения для дебажной функции Ping правильный? {"data":"Ping","id":1,"cmd":"ping","t":0} Какова может быть причина неотображения PrintDbgStr("PrintDbgStr_requestString: " .. requestString) в qsutils.lua в функции function receiveRequest() этого полученного сообщения?

buybackoff commented 5 years ago

Смотрите код, я не помню точно, возможно там еще нужен символ конца строки \n

euvgub commented 5 years ago

request = {"data":"Ping","id":1,"cmd":"ping","t":0} raw_data = json.dumps(request, ensure_ascii=False) + "\r\n\r\n" или raw_data = json.dumps(request, ensure_ascii=False) + "\r\n" или raw_data = json.dumps(request, ensure_ascii=False) + "\n" socket.sendall(raw_data.encode()) Не помогает. Сокет сервер не отзывается

Nikolaev-Nikolay commented 5 years ago

"\n" в request: {...., "\n" }

Надо вывести читалкой сокетов что в сокет приходит реально

euvgub commented 5 years ago

Wireshark при + "\r\n" или + "\n" или + "\r\n\r\n"
raw_data = json.dumps(request, ensure_ascii=False) + "\r\n" socket_send.sendall(raw_data.encode()) показывает 56616 → 34130 [PSH, ACK] Seq=1 Ack=1 Win=525568 Len=50 {"data": "Ping", "id": 1, "cmd": "ping", "t": 0} 34130 → 56616 [ACK] Seq=1 Ack=51 Win=525568 Len=0

euvgub commented 5 years ago

Так тоже тишина от сокет сервера CRLF = "\r\n\r\n" или "r\n" или "\n" или request = {"data":"Ping","id":1,"cmd":"ping","t":0} raw_data = json.dumps(request, ensure_ascii=False) socket_send.sendall((raw_data +CRLF).encode())

buybackoff commented 5 years ago

Я не пойму - код у вас под рукой, там всё есть. Зачем гадать, если можно посмотреть? Я не трогал протокол в сокете с 2014 года, но помню что это самое примитивное что может быть - JSON по строкам.

euvgub commented 5 years ago

qsutils.lua - не находится, чего не хватает в посылаемом клиентом сообщении
function split(inputstr, sep) if sep == nil then sep = "%s" end local t={} local i=1 for str in string.gmatch(inputstr, "([^"..sep.."]+)") do t[i] = str i = i + 1 end return t end

function from_json(str) local status, msg= pcall(json.decode, str, 1, json.null) -- dkjson if status then return msg else return nil, msg end end

euvgub commented 5 years ago

Все варианты перепробованы. Сокет сервер молчалив.

euvgub commented 5 years ago

Сообщения, сформированные C# Newtonsoft.Json сокет сервер распознает. Сообщения, сформированные python json сокет сервер не распознает.

Nikolaev-Nikolay commented 5 years ago

Надо пройти весь путь инициализации. Посмотрите Wireshark ом как происходит обмен между луа и QuikSharpDemo.exe Вам надо подставить на питоне те же действия, что производит QuikSharpDemo.exe И с реакцией на 2 сокете. Я сам хотел сделать, а потом забросил. Если не трудно какой у Вас код на питоне Вы можете мне прислать?!

euvgub commented 5 years ago

Поставлю Visual Studio, отдебажу что отсылает C# сокет клиент и повторю на питон сокет клиенте. Вроде Serialization.cs со стороны Newtonsoft.Json никаких особенностей в создаваемое json сообщение не вносит. Код на питоне самый простейший - установить связь с сокет сервером, отослать сообщение, получить в ответ сообщение. Типа такого c изменением на нужный набор request_json = {"id": self.message_id, "method": command_name, "args": args} https://github.com/euvgub/QuikSocketTransfer-1/blob/master/quik_python_client/quik_socket_client.py

euvgub commented 5 years ago

Работающий вариант Quik Qlua + python вот https://github.com/Enfernuz/quik-lua-rpc Хочется из спортивного интереса и Quiksharp + python попробовать

Nikolaev-Nikolay commented 5 years ago

Да что то сложно все там. Тут Quiksharp - все проще. Просто надо с# перелапатить в питон.

euvgub commented 5 years ago

Там сложновато, если использовать protobuf, а если исользовать json, то все просто https://github.com/Enfernuz/quik-lua-rpc/issues/17 Enfernuz commented on 2 Feb В ветке master теперь лежит альфа-версия с поддержкой JSON. import zmq context = zmq.Context() print("Connecting to test server") socket = context.socket(zmq.REQ) socket.connect("tcp://localhost:5560") ....

euvgub commented 5 years ago

Чтобы quiksharp qlua socket server отозвался на сообщение от питон сокет клиента есть подозрение про необходимость форматирования json как в Serialization.cs public static string ToJson(this T obj) и в public static string ToJsonFormatted(this T obj)

euvgub commented 5 years ago

В quik-lua-rpc не забудьте в config.json прописать "serde_protocol": "json" вместо "serde_protocol": "protobuf" и все заработает с пол-оборота. Предлагаю quik-lua-rpc обсуждать там https://github.com/Enfernuz/quik-lua-rpc/issues/17 А в этой теме пока дебажу в Visual Studio, что происходит при общении c# клиента и qlua сервера

euvgub commented 5 years ago

Глухо. Нет опыта и в Visual Studio не получается отловить что c# сокет клиент шлет qlua сокет серверу

euvgub commented 5 years ago

В отсылаемых c# сокет клиентом сообщениях нет ничего необычного. Обычный json. Чего же не хватает qlua socket серверу при отсылке точно таких же сообщений из python socket клиента? {"data":"","id":1,"cmd":"getWorkingFolder","t":1555508488570} {"data":"","id":2,"cmd":"isConnected","t":1555508488762} {"data":"","id":4,"cmd":"getClientCode","t":1555508586906} {"data":"SPBFUT|SiM9","id":5,"cmd":"getSecurityInfo","t":1555508586910} {"data":"SPBFUT","id":6,"cmd":"getTradeAccount","t":1555508586919}

Nikolaev-Nikolay commented 5 years ago

Я же Вам говорю, надо сначала проиницилизировать протокол. Вы запускали QuikSharpDemo.exe?! Он там запускается, туда - сюда, id всякие - и только потом команды пользователя выполнить можно.

Вы логику работы QuikSharpDemo.exe реализуйте - тогда и сервер будет отвечать. А я так тоже команды посылал в открытый порт - никакой реакции.

euvgub commented 5 years ago

В QuikSharpDemo не видно каких-нибудь доп действий, видны шаги private void ButtonStart_Click(object sender, EventArgs e) _quik = new Quik(Quik.DefaultPort, new InMemoryStorage()); Законнектились. И дальше сразу формирует json и отправляет его

euvgub commented 5 years ago

quiksharp socket server не реагирует на сообщения, сформированные и отправленные ни в Python 3.7 ни в Python 2.7

euvgub commented 5 years ago

В QuikSharpDemo после установки коннекта ничего особенного не наблюдается, просто отысылаются сообщения 1 0.000000 4948 info.exe {"data":"","id":1,"cmd":"getWorkingFolder","t":1555516261956} 2 0.242006 4948 info.exe {"data":"","id":2,"cmd":"isConnected","t":1555516263128} 3 115.856487 4948 info.exe {"data":"SPBFUT,TQBR,TQBS,TQNL,TQLV,TQNE,TQOB|SiM9","id":3,"cmd":"getSecurityClass","t":1555516378744} 4 115.856613 4948 info.exe SPBFUT,TQBR,TQBS,TQNL,TQLV,TQNE,TQOB|SiM9 5 115.856675 4948 info.exe | 6 115.887383 4948 info.exe {"data":"","id":4,"cmd":"getClientCode","t":1555516378775} 7 115.898674 4948 info.exe {"data":"SPBFUT|SiM9","id":5,"cmd":"getSecurityInfo","t":1555516378786} 8 115.898691 4948 info.exe SPBFUT|SiM9 9 115.898761 4948 info.exe | 10 115.907645 4948 info.exe {"data":"SPBFUT","id":6,"cmd":"getTradeAccount","t":1555516378796} 11 115.909249 4948 info.exe {"data":"SPBFUT","id":7,"cmd":"getClassInfo","t":1555516378797} 12 115.915555 4948 info.exe {"data":"SPBFUT|SiM9|SEC_PRICE_STEP","id":8,"cmd":"getParamEx","t":1555516378803} 13 115.915592 4948 info.exe SPBFUT|SiM9|SEC_PRICE_STEP 14 115.915624 4948 info.exe | 15 115.965198 4948 info.exe {"data":"SPBFUT|SiM9|SEC_SCALE","id":9,"cmd":"getParamEx","t":1555516378853} 16 115.965241 4948 info.exe SPBFUT|SiM9|SEC_SCALE 17 115.965273 4948 info.exe | 18 115.965965 4948 info.exe {"data":"SPBFUT|SiM9|BUYDEPO","id":10,"cmd":"getParamEx","t":1555516378854} 19 115.966011 4948 info.exe SPBFUT|SiM9|BUYDEPO

buybackoff commented 5 years ago

Нужно, чтобы оба сокета присоединились. В конце картинки условие.

image

euvgub commented 5 years ago

Congratulations! You are Winner!

euvgub commented 5 years ago

Теперь можно менять на первой странице в описании: QUIK# (Квик Шарп) - это коннектор к торговому терминалу QUIK, который делает доступным весь функционал Lua из .NET (C#), Python и любого другого языка программирования.

buybackoff commented 5 years ago

Congratulations! You are Winner!

Я автор, но даже мне пришлось посмотреть код.

Теперь можно менять на первой странице в описании: QUIK# (Квик Шарп) - это коннектор к торговому терминалу QUIK, который делает доступным весь функционал Lua из .NET (C#), Python и любого другого языка программирования.

Присылайте pull request -ы, в отдельной папке можно общими усилиями сделать Питон клиента.

euvgub commented 5 years ago

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

buybackoff commented 5 years ago

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

Ну так Вы пришлите PR с этими изменениями. Папку можно сделать src/Python

euvgub commented 5 years ago

На Смартлабе обьявите плз стыковку Quik - Python - там многие давно этого ждут

buybackoff commented 5 years ago

Это не стыковка, это примитивный посыл пинга и получение ответа. Вот когда будут все структуры данных и вся API в Питоне, тогда можно что-то заявлять.

И пожалуйсте не говорите, что другим делать, в open source. Делайте сами или наймите кого-то. В open source не далют что-то для вас, а делают вместе, если нескольким людям нужно одно и то же.

zenonofelea commented 4 years ago

@euvgub, вы еще работаете над этим (API в Python)?

euvgub commented 4 years ago

Не имеет смысла тратить время на отлов глюков Quik. Модуль MetaTrader для интеграции с Python https://www.mql5.com/ru/docs/integration/python_metatrader5 СОЕДИНЕНИЕ METATRADER 5 И PYTHON: ПОЛУЧЕНИЕ И ОТПРАВКА ДАННЫХ https://www.mql5.com/ru/articles/5691

zenonofelea commented 4 years ago

Спасибо за ссылки!

euvgub commented 4 years ago

Плюс существуют Тинькофф Инвестиции OpenApi и Exante Market Data & Trade API без нужды использовать Quik и Metatrader и им подобные