QUIKSharp icon indicating copy to clipboard operation
QUIKSharp copied to clipboard

Пример со стаканом из QUIK для python

Open dastad opened this issue 5 years ago • 14 comments

Респект разработчикам! А можете продемонстрировать небольшой пример на питоне? Как подключиться к QUIK и получить оттуда текущие значения какого-нибудь стакана, например SBER Заранее благодарен.

dastad avatar Oct 31 '19 21:10 dastad

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)`

slukin1 avatar Jan 10 '20 19:01 slukin1

Получение стакана котировок по классу и коду бумаги 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) """

euvgub avatar Jan 13 '20 14:01 euvgub

Это мой пример кода. Коментированы команды рабочие.

Я только не понял как задать команду чтения акций а не фьючесов. 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)

Nikolaev-Nikolay avatar Jan 18 '20 14:01 Nikolaev-Nikolay

Функция 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)

euvgub avatar Jan 18 '20 22:01 euvgub

getQuoteLevel2 Функция предназначена для получения стакана по указанному классу и бумаге.

euvgub avatar Jan 18 '20 22:01 euvgub

Возвращаем все свечи по идентификатору графика. График должен быть открыт request = {"data":"chart_tag|0|0|0","id":"","cmd":"get_candles","t":""}

Подписаться на получение свечей по заданному инструмент и интервалу request = {"data":"TQBR|GMKN|10","id":"","cmd":"subscribe_to_candles","t":""}

euvgub avatar Jan 18 '20 22:01 euvgub

Что то ошибку выдает: 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 бит версии какую нужно и куда записать напишите пожалуйста.

Nikolaev-Nikolay avatar Jan 21 '20 17:01 Nikolaev-Nikolay

support QUIK64 (ver.8 or higher) https://github.com/finsight/QUIKSharp/tree/master/src/QuikSharp/lua/clibs64

euvgub avatar Jan 21 '20 18:01 euvgub

В qsfunctions.lua действительно нет функции getQuoteLevel2, поэтому пример не работает.

ramateur avatar Mar 06 '20 11:03 ramateur

Прямой вызов getQuoteLevel2 действительно не реализован, т.к. вместо этого рекомендуется использовать связку ".OrderBook.Subscribe" и "OnQuote". В демонстрационном приложении есть пример использования такой связки. Возможно в Питоне имеет смысл использовать тот же подход

Pr0phet1c avatar Mar 06 '20 15:03 Pr0phet1c

Добрый день! я ламер и у меня не работает...((( {'cmd': 'lua_error', 'id': '1', 't': '', 'data': 'QJSIM|SBER', 'lua_error': 'Command not implemented in Lua qsfunctions module: getQuoteLevel2'}

Anton5244 avatar Mar 17 '20 14:03 Anton5244

'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

euvgub avatar Mar 17 '20 15:03 euvgub

О! Чат живой! Спасибо большое за ответ. Я конечно не программист, меня привело в эту сферу желание изучать и автоматизировать процессы торговли, и когда я посмотрел уроки по С# https://www.youtube.com/watch?v=QtMVqgwoPU0&list=PLtUjJaiFZYyeRyDD8o_s9UUCoIKyPuwwD&index=3 Было всё предельно понятно и да же что то удалось написать... но есть более опытные люди, которые меня убедили что надо изучать Python. И я сейчас пытаюсь повторить то же самое что делалось на С# в Python, но как то столкнулся с проблемой то ли это мало кто делал, то ли люди не охотно выкладывают свой опыт в сеть, очень мало примеров и готовых решений... Мне как то проще учится по готовым примерам... Пошлите меня куда не буди, лишь бы не на х.р, где есть больше примеров или может кто выложит готовый простейший код сюда, как лучше за коннектится с Quik. и отправлять минимальные команды... так сказать малую базу для старта, что бы можно было постепенно наращивать обороты... В заранее спасибо и извините меня за мою проф не пригодность пока, но я быстро учусь)))

Anton5244 avatar Mar 17 '20 16:03 Anton5244

@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

Тут уместно выложить пример кода, который не работает, а должен, или подробное описание проблемы и способ воспроизвести её. Желательно с ссылкой на строку кода, которая работает не так, как нужно. Неуместно просить помощи по личным проблемам, а не по проблемам проекта - решение которых поможет всем пользователям.

buybackoff avatar Mar 17 '20 17:03 buybackoff