QUIKSharp
QUIKSharp copied to clipboard
Пример со стаканом из QUIK для python
Респект разработчикам! А можете продемонстрировать небольшой пример на питоне? Как подключиться к QUIK и получить оттуда текущие значения какого-нибудь стакана, например SBER Заранее благодарен.
https://github.com/finsight/QUIKSharp/blob/master/quiksharp_qlua_python_socket_client.py `# -- coding: utf-8 -- import socket import json
CRLF = "\r\n\r\n"
host = '127.0.0.1'
port_requests = 34130
port_callbacks = 34131
sok_requests = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sok_callbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sok_callbacks.connect((host , port_callbacks))
sok_requests.connect((host , port_requests))
request = {"data":"Ping","id":"1","cmd":"ping","t":"0"}
raw_data = json.dumps(request)
sok_requests.sendall((raw_data+CRLF).encode())
while(True):
response = sok_requests.recv(2048)
print(response)`
Получение стакана котировок по классу и коду бумаги getQuoteLevel2 - Python socket client
-- coding: utf-8 --
import socket import json
CRLF = "\r\n\r\n" host = '127.0.0.1' port_requests = 34130 port_callbacks = 34131 sok_requests = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sok_callbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sok_callbacks.connect((host , port_callbacks)) sok_requests.connect((host , port_requests)) request = {"data":"SPBFUT|SiH0","id":"1","cmd":"getQuoteLevel2","t":""} raw_data = json.dumps(request) sok_requests.sendall((raw_data+CRLF).encode()) data = b"" bufsize = 1024 while(True): packet = sok_requests.recv(bufsize) data += packet if len(packet) < bufsize: break data = json.loads(data.decode('cp1251')) print(data)
""" Функция getQuoteLevel2() принимает 2 параметра: Код класса и Код бумаги, а возвращает таблицу, которая имеет следующие поля: bid_count -- Количество котировок покупки (STRING) offer_count -- Количество котировок продажи (STRING) bid -- Котировки спроса (покупки) (TABLE) offer -- Котировки предложений (продажи) (TABLE) -- Таблицы «bid» и «offer» имеют следующую структуру: price -- Цена покупки / продажи (STRING) quantity -- Количество в лотах (STRING) """
Это мой пример кода. Коментированы команды рабочие.
Я только не понял как задать команду чтения акций а не фьючесов. getQuoteLevel2 - не работает выдает: {'cmd': 'lua_error', 'data': 'TQBR|CHMF|QTY', 'id': '1', 'lua_error': 'Command not implemented in Lua qsfunctions module: getQuoteLevel2', 't': '157935703592363'} Хотя вроде команда имплементирована и должна работать. Куда копать?! Может так CHMF|SiH акции норникеля
import socket
import json
import time import sys
CRLF = "\r\n\r\n"
host = '127.0.0.1'
port_requests = 34130
port_callbacks = 34131
sok_requests = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sok_callbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sok_callbacks.connect((host , port_callbacks))
sok_requests.connect((host , port_requests))
#request = {"data":"Ping","id":"1","cmd":"ping","t":"0"} #request ={"data":"TQBR|CHMF","id":"1","cmd":"getPortfolioInfo","t":"0"} #request ={"data":"","id":"1","cmd":"getClientCode","t":"0"} #request ={"data":"SPBFUT|SiM9","id":"1","cmd":"getSecurityInfo","t":"0"} #request = {"data":"","id":1,"cmd":"isConnected","t":"0"} #request = {"data":"USER","id":"1","cmd":"getInfoParam","t":"0"} #request = {"data":"TQBR|CHMF","id":"1","cmd":"getSecurityInfo","t":"0"} #request ={"data":"SPBFUT","id":"1","cmd":"getTradeAccount","t":"0"} request ={"data":"TQBR|CHMF|QTY","id":"1","cmd":"getParamEx","t":str(int(round(time.time()*100000)))}
SNGSP|SiH
#"OPEN" #SEC_SCALE #request ={"data":"TQBR|CHMF","id":"1","cmd":"getQuoteLevel2","t":str(int(round(time.time()*100000)))} #request ={"data":"TQBR|CHMF","id":"1","cmd":"Subscribe_Level_II_Quotes","t":str(int(round(time.time()*100000)))}
raw_data = json.dumps(request) print('Set: ', (raw_data+CRLF).encode('latin_1')) sok_requests.sendall((raw_data+CRLF).encode())
response = sok_requests.recv(2048)
print('ansfer: ', response)
class ScriptError(Exception): pass class ScriptQuitCondition(Exception): pass
try:
obj = json.loads(response.decode('cp1251'))
if 'error' in obj and obj['error']:
raise ScriptError(obj['error'])
except json.decoder.JSONDecodeError: raise ScriptError('Ошибка анализа возвращаемых данных, получена строка', response)
print(obj)
Функция getQuoteLevel2() принимает 2 параметра: Код класса и Код бумаги Для акции Норникеля: Код класса = TQBR и Код бумаги = GMKN
import socket import json
CRLF = "\r\n\r\n" host = '127.0.0.1' port_requests = 34130 port_callbacks = 34131 sok_requests = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sok_callbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sok_callbacks.connect((host , port_callbacks)) sok_requests.connect((host , port_requests)) request = {"data":"TQBR|GMKN","id":"","cmd":"getQuoteLevel2","t":""} raw_data = json.dumps(request) sok_requests.sendall((raw_data+CRLF).encode()) data = b"" bufsize = 1024 while(True): packet = sok_requests.recv(bufsize) data += packet if len(packet) < bufsize: break data = json.loads(data.decode('cp1251')) print(data)
getQuoteLevel2 Функция предназначена для получения стакана по указанному классу и бумаге.
Возвращаем все свечи по идентификатору графика. График должен быть открыт request = {"data":"chart_tag|0|0|0","id":"","cmd":"get_candles","t":""}
Подписаться на получение свечей по заданному инструмент и интервалу request = {"data":"TQBR|GMKN|10","id":"","cmd":"subscribe_to_candles","t":""}
Что то ошибку выдает: runfile('E:/Python_Temp/Qwick_Data/Q_Data.py', wdir='E:/Python_Temp/Qwick_Data') {'id': '', 'cmd': 'lua_error', 'lua_error': 'Command not implemented in Lua qsfunctions module: getQuoteLevel2', 'data': 'TQBR|GMKN', 't': ''}
В квике еще надо что то делать?! длл для 64 бит версии какую нужно и куда записать напишите пожалуйста.
support QUIK64 (ver.8 or higher) https://github.com/finsight/QUIKSharp/tree/master/src/QuikSharp/lua/clibs64
В qsfunctions.lua действительно нет функции getQuoteLevel2, поэтому пример не работает.
Прямой вызов getQuoteLevel2 действительно не реализован, т.к. вместо этого рекомендуется использовать связку ".OrderBook.Subscribe" и "OnQuote". В демонстрационном приложении есть пример использования такой связки. Возможно в Питоне имеет смысл использовать тот же подход
Добрый день! я ламер и у меня не работает...((( {'cmd': 'lua_error', 'id': '1', 't': '', 'data': 'QJSIM|SBER', 'lua_error': 'Command not implemented in Lua qsfunctions module: getQuoteLevel2'}
'cmd': 'lua_error' - вместо lua_error тут должно быть 'cmd': 'OrderBook.Subscribe' или 'cmd': 'OnQuote' или любая другая команда из имеющихся среди функций в qsfunctions https://github.com/finsight/QUIKSharp/blob/master/src/QuikSharp/lua/qsfunctions.lua примеры function qsfunctions.getScriptPath(msg) - это команда getScriptPath function qsfunctions.getInfoParam - это команда getInfoParam function qsfunctions.getClassesList - это команда getClassesList
О! Чат живой! Спасибо большое за ответ. Я конечно не программист, меня привело в эту сферу желание изучать и автоматизировать процессы торговли, и когда я посмотрел уроки по С# https://www.youtube.com/watch?v=QtMVqgwoPU0&list=PLtUjJaiFZYyeRyDD8o_s9UUCoIKyPuwwD&index=3 Было всё предельно понятно и да же что то удалось написать... но есть более опытные люди, которые меня убедили что надо изучать Python. И я сейчас пытаюсь повторить то же самое что делалось на С# в Python, но как то столкнулся с проблемой то ли это мало кто делал, то ли люди не охотно выкладывают свой опыт в сеть, очень мало примеров и готовых решений... Мне как то проще учится по готовым примерам... Пошлите меня куда не буди, лишь бы не на х.р, где есть больше примеров или может кто выложит готовый простейший код сюда, как лучше за коннектится с Quik. и отправлять минимальные команды... так сказать малую базу для старта, что бы можно было постепенно наращивать обороты... В заранее спасибо и извините меня за мою проф не пригодность пока, но я быстро учусь)))
@Anton5244
О! Чат живой!
Это не "чат".
я ламер и у меня не работает...(((
Внимательно почитайте раздел "Решение проблем" в https://github.com/finsight/QUIKSharp/blob/master/README.RU.md#%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC
Тут уместно выложить пример кода, который не работает, а должен, или подробное описание проблемы и способ воспроизвести её. Желательно с ссылкой на строку кода, которая работает не так, как нужно. Неуместно просить помощи по личным проблемам, а не по проблемам проекта - решение которых поможет всем пользователям.