Closed euvgub closed 5 years ago
Добрый день! Насколько я понял есть еще дин сокет (канал) по которому передается служебка. Служебка потверждает транзакцию Я тоже заинтересован сделать питон ориентированную версию к квику. Немного не по теме но насколько Вы далеко продвинулись?!
Добрый день! Насколько я понял есть еще дин сокет (канал) по которому передается служебка. Служебка потверждает транзакцию Я тоже заинтересован сделать питон ориентированную версию к квику. Немного не по теме но насколько Вы далеко продвинулись?!
Второй сокет на порту 34131 вещает в эфир отдельно от первого данные-коллбеки функций On....
Wireshark-ом отловили формат посылаемого на порт 34130 сообщения. Например такого {"data":"SPBFUT|01931FX","id":461,"cmd":"getPortfolioInfo","t":1555364989736} видим нужный response. Отсылаем точно такое же сообщение из питон клиента - в ответ тишина. Поскольку qlua socket серверу абсолютно все равно на каком языке написан сокет клиент - значит сокет сервер не понимает наше сообщение по причине несоответствия его тому, что ожидает на вход сокет сервер. Пытаюсь прописать PrintDbgStr в qlua socket сервере, чтобы понять, что он должен получить на вход, чтобы прекратить молчание. Из текста функций lua файлов сокет сервера понять не очень получается, т.к. с lua и qlua до этого не приходилось иметь отношений
Второй вариант - оттрейсить в Visual Studio, что посылается в за-json-ненном Message из c# файлов и повторить на питоне с точностью до две кавычки-одна кавычка-апостроф
Я тоже думал об этом, придется повторить (написать заново) питон оболочку. Может пока прописать какие шаги необходимо сделать для выполнения той или иной операции с точки зрения протокола qlua. Например получения массива о цене покупки и продажи (стакан) и т.д. Я вообще смотрел бы в сторону API биржи криптовалют - например эксмо. Если написать такие команды (API на пионе) - это второй уровень. Третий уровень построение с помощью эти кирпичеков торговой модели, графики и т.д.
Wireshark-ом отловили формат посылаемого на порт 34130 сообщения. Например такого {"data":"SPBFUT|01931FX","id":461,"cmd":"getPortfolioInfo","t":1555364989736} видим нужный response. Отсылаем точно такое же сообщение из питон клиента - в ответ тишина.
Сервер поддерживает только один клиент. Может вы сначала подключаетесь из C#, а потом из Питона. Второе соединение не пройдет.
А вообще посылаются простые JSON сообщения. Была идея сделать формальный JSON-RPC протокол, но не стал парится с формальностями так как по сути тут своя вариация той же самой идеи. Папаметры посылаются во многих местых через | символ.
Клиент питон коннектится на порт 34130, посылает сообщение json {"data":"Ping","id":1,"cmd":"ping","t":0}, ждет пока не отключить. в ответ по тому же порту 34130 не приходит ожидаемое сообщение Pong
Клиент питон коннектится на порт 34130, посылает сообщение json {"data":"Ping","id":1,"cmd":"ping","t":0}, ждет пока не отключить. в ответ по тому же порту 34130 не приходит ожидаемое сообщение Pong
Понятно, это было написано изначально. Но он должен коннектиться первым и единственным к скрипту QLua, если до этого что-то другое коннектилось, оно должно отсоединиться.
Вставка в qsutils.lua в функцию function receiveRequest() вариантов дебуга типа PrintDbgStr("PrintDbgStr_requestString: " .. requestString) для просмотра в debugview или log(requestString) не дает никаких результатов. - т.е. сокет сервер никак не реагирует на полученное сообщение "Ping" и кажется не получает "Ping"
Со стороны клиента все без проблем доходит до пункта получения response от сервера. # Creating socket # Connecting to server, 127.0.0.1 (127.0.0.1) #Connected # Sending data to server *# Receive data from server и дальше ничего не приходит от сервера
Формат сообщения для дебажной функции Ping правильный? {"data":"Ping","id":1,"cmd":"ping","t":0} Какова может быть причина неотображения PrintDbgStr("PrintDbgStr_requestString: " .. requestString) в qsutils.lua в функции function receiveRequest() этого полученного сообщения?
Смотрите код, я не помню точно, возможно там еще нужен символ конца строки \n
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()) Не помогает. Сокет сервер не отзывается
"\n" в request: {...., "\n" }
Надо вывести читалкой сокетов что в сокет приходит реально
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
Так тоже тишина от сокет сервера 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())
Я не пойму - код у вас под рукой, там всё есть. Зачем гадать, если можно посмотреть? Я не трогал протокол в сокете с 2014 года, но помню что это самое примитивное что может быть - JSON по строкам.
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
Все варианты перепробованы. Сокет сервер молчалив.
Сообщения, сформированные C# Newtonsoft.Json сокет сервер распознает. Сообщения, сформированные python json сокет сервер не распознает.
Надо пройти весь путь инициализации. Посмотрите Wireshark ом как происходит обмен между луа и QuikSharpDemo.exe Вам надо подставить на питоне те же действия, что производит QuikSharpDemo.exe И с реакцией на 2 сокете. Я сам хотел сделать, а потом забросил. Если не трудно какой у Вас код на питоне Вы можете мне прислать?!
Поставлю 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
Работающий вариант Quik Qlua + python вот https://github.com/Enfernuz/quik-lua-rpc Хочется из спортивного интереса и Quiksharp + python попробовать
Да что то сложно все там. Тут Quiksharp - все проще. Просто надо с# перелапатить в питон.
Там сложновато, если использовать 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") ....
Чтобы quiksharp qlua socket server отозвался на сообщение от питон сокет клиента есть подозрение про необходимость форматирования json как в Serialization.cs
public static string ToJson
В 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 сервера
Глухо. Нет опыта и в Visual Studio не получается отловить что c# сокет клиент шлет qlua сокет серверу
В отсылаемых 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}
Я же Вам говорю, надо сначала проиницилизировать протокол. Вы запускали QuikSharpDemo.exe?! Он там запускается, туда - сюда, id всякие - и только потом команды пользователя выполнить можно.
Вы логику работы QuikSharpDemo.exe реализуйте - тогда и сервер будет отвечать. А я так тоже команды посылал в открытый порт - никакой реакции.
В QuikSharpDemo не видно каких-нибудь доп действий, видны шаги private void ButtonStart_Click(object sender, EventArgs e) _quik = new Quik(Quik.DefaultPort, new InMemoryStorage()); Законнектились. И дальше сразу формирует json и отправляет его
quiksharp socket server не реагирует на сообщения, сформированные и отправленные ни в Python 3.7 ни в Python 2.7
В 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
Нужно, чтобы оба сокета присоединились. В конце картинки условие.
Congratulations! You are Winner!
Теперь можно менять на первой странице в описании: QUIK# (Квик Шарп) - это коннектор к торговому терминалу QUIK, который делает доступным весь функционал Lua из .NET (C#), Python и любого другого языка программирования.
Congratulations! You are Winner!
Я автор, но даже мне пришлось посмотреть код.
Теперь можно менять на первой странице в описании: QUIK# (Квик Шарп) - это коннектор к торговому терминалу QUIK, который делает доступным весь функционал Lua из .NET (C#), Python и любого другого языка программирования.
Присылайте pull request -ы, в отдельной папке можно общими усилиями сделать Питон клиента.
Просьба в readme добавить это условие для возможности работы любого сокет клиента на любом языке. Просьба создать папку примеры клиентов на других языках
Просьба в readme добавить это условие для возможности работы любого сокет клиента на любом языке. Просьба создать папку примеры клиентов на других языках
Ну так Вы пришлите PR с этими изменениями. Папку можно сделать src/Python
На Смартлабе обьявите плз стыковку Quik - Python - там многие давно этого ждут
Это не стыковка, это примитивный посыл пинга и получение ответа. Вот когда будут все структуры данных и вся API в Питоне, тогда можно что-то заявлять.
И пожалуйсте не говорите, что другим делать, в open source. Делайте сами или наймите кого-то. В open source не далют что-то для вас, а делают вместе, если нескольким людям нужно одно и то же.
@euvgub, вы еще работаете над этим (API в Python)?
Не имеет смысла тратить время на отлов глюков Quik. Модуль MetaTrader для интеграции с Python https://www.mql5.com/ru/docs/integration/python_metatrader5 СОЕДИНЕНИЕ METATRADER 5 И PYTHON: ПОЛУЧЕНИЕ И ОТПРАВКА ДАННЫХ https://www.mql5.com/ru/articles/5691
Спасибо за ссылки!
Плюс существуют Тинькофф Инвестиции OpenApi и Exante Market Data & Trade API без нужды использовать Quik и Metatrader и им подобные
покажите пожалуйста, что отправляется в сокет? Вопрос не имеет отношения к языку программирования. Вместо сокет клиента на питоне может быть сокет клиент на любом другом языке. Суть вопроса о структуре данных, отсылаемых в 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)