finsight / QUIKSharp

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

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

Open dastad opened 4 years ago

dastad commented 4 years ago

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

slukin1 commented 4 years ago

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

euvgub commented 4 years ago

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

Nikolaev-Nikolay commented 4 years ago

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

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

euvgub commented 4 years ago

Функция 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 commented 4 years ago

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

euvgub commented 4 years ago

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

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

Nikolaev-Nikolay commented 4 years ago

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

euvgub commented 4 years ago

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

ramateur commented 4 years ago

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

Pr0phet1c commented 4 years ago

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

Anton5244 commented 4 years ago

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

euvgub commented 4 years ago

'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

Anton5244 commented 4 years ago

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

buybackoff commented 4 years ago

@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

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