Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
euvgub opened this issue Apr 16, 2019 · 45 comments
Closed

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

euvgub opened this issue Apr 16, 2019 · 45 comments

Comments

@euvgub
Copy link
Contributor

euvgub commented Apr 16, 2019

покажите пожалуйста, что отправляется в сокет?
Вопрос не имеет отношения к языку программирования. Вместо сокет клиента на питоне может быть сокет клиент на любом другом языке. Суть вопроса о структуре данных, отсылаемых в 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
Copy link

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@Nikolaev-Nikolay
Copy link

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

@buybackoff
Copy link
Collaborator

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

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@buybackoff
Copy link
Collaborator

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@buybackoff
Copy link
Collaborator

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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
Copy link

Nikolaev-Nikolay commented Apr 16, 2019

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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
Copy link
Contributor Author

euvgub commented Apr 16, 2019

Так тоже тишина от сокет сервера
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
Copy link
Collaborator

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 16, 2019

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

@Nikolaev-Nikolay
Copy link

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

Поставлю 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
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@Nikolaev-Nikolay
Copy link

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

Там сложновато, если использовать protobuf, а если исользовать json, то все просто Enfernuz/quik-lua-rpc#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
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

В отсылаемых 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
Copy link

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

В 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
Copy link
Collaborator

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

image

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

Congratulations! You are Winner!

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@buybackoff
Copy link
Collaborator

Congratulations! You are Winner!

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

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@buybackoff
Copy link
Collaborator

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

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 17, 2019

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

@buybackoff
Copy link
Collaborator

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

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

@zenonofelea
Copy link

zenonofelea commented Apr 25, 2020

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 26, 2020

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

@zenonofelea
Copy link

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

@euvgub
Copy link
Contributor Author

euvgub commented Apr 26, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants