finsight / QUIKSharp

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

Запуская пример "Пример со стаканом из QUIK для python" ошибка #227

Open Anton5244 opened 4 years ago

Anton5244 commented 4 years ago

Запускаю в PyCharm "Пример со стаканом из QUIK для python" https://github.com/finsight/QUIKSharp/blob/master/quiksharp_qlua_python_socket_client.py выдаёт ошибку {'cmd': 'lua_error', 'id': '1', 't': '', 'data': 'QJSIM|SBER', 'lua_error': 'Command not implemented in Lua qsfunctions module: getQuoteLevel2'} ошибка

sergshabal commented 4 years ago

Возможно вместо getQuoteLevel2 должна быть GetQuoteLevel2

Anton5244 commented 4 years ago

Нет не помогло...

Возможно вместо getQuoteLevel2должна бытьGetQuoteLevel2

неть, не помогло(((

sergshabal commented 4 years ago

Да действительно. Преблема в том что такой функции нет. Можно только подписаться и отписаться на стакан. Подписавшись, стакан будет приходить на сокет колбэков (порт 34131)

Pr0phet1c commented 4 years ago

На всякий случай: В библиотеке QUIKSharp функция GetQuoteLevel2 есть (см. обновление от 14.03.20). Но корректность ее работы в сочетании с подпиской на колбэк OnOrder, вызывает сомнения (могут возникать конфликты). Во всяком случае, в демо-приложении мне пока не удалось решить проблему конфликта.

ghusver commented 4 years ago

Добрый день! Пробираюсь сквозь скрипты на Win7x64, Quik 8.3.2.4, ветка master от 14.04.2020 (оставляю отредактированную версию этого поста, т.к. на сообщение никто не ответил)

GetQuoteLevel2 в голом виде не работает; ошибка такая же, как и в головном посте.

Но даже если я не подписываюсь на тикер (напр., SiM0) и просто читаю из сокета колбэка, то обнаруживаю, что туда вываливается много чего. В том числе, котировки, которые заказаны в quik через меню "Система --> Заказ данных --> Поток котировок".

def get_socket_cb_data(bufsize=1024):
    data = b""
    while(True):
        packet = sok_callbacks.recv(bufsize)
        data += packet
        if len(packet) < bufsize:
            data = data.decode()
            data = data.split('\n')
            data = [ json.loads(d) for d in data if d ]
            return data

for i in range(10):
    data = get_socket_cb_data()
    print(i, end=' --> ')
    [ print(d['data']['sec_code'], d['cmd'], end=' | ') for d in data ]
    print()

Результат работы скрипта: изображение

Вопрос: на sok_callback всегда приходят разные данные и требуется из всех данных отсортировать нужный тебе стакан или же нужно действовать иначе? Как?

ghusver commented 4 years ago

Насколько я понял, Subscribe_Level_II_Quotes подразумевает то действие, которое выполняется, когда заказываем данные в квике вручную. После подписки квик каждый раз при обновлении стакана вызывает колбэк OnQuote. Это происходит вне зависимости от того, кто и когда подписался на данные. Другие оформленые в квике колбэки отрабатывают по тому же сценарию (OnParam, OnAllTrade, ...), а Lua покорно всё пересылает в сокет колбеков. В итоге необходимые данные нужно отсеивать при чтении из сокета.

Igor-san commented 4 years ago

Если в питоновском скрипте написать с большой буквы: GetQuoteLevel2, то работает.