From 851073e3f85e53d5b5252c1d09ef524277069006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=A7=D0=B5=D1=87=D0=B5?= =?UTF-8?q?=D1=82?= Date: Thu, 13 Jan 2022 14:35:32 +0500 Subject: [PATCH] =?UTF-8?q?=D0=92=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B8=D0=BA=D0=B5=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D1=8F=20+=20=D0=BA=D0=BE=D1=81=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/05 - Stream.py | 52 ++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Examples/05 - Stream.py b/Examples/05 - Stream.py index c94c407..98d1c74 100644 --- a/Examples/05 - Stream.py +++ b/Examples/05 - Stream.py @@ -1,5 +1,6 @@ +from datetime import datetime import time # Подписка на события по времени -from QuikPy import QuikPy # Работа с QUIKиз Python через LUA скрипты QuikSharp +from QuikPy import QuikPy # Работа с QUIK из Python через LUA скрипты QuikSharp def PrintCallback(data): @@ -8,43 +9,50 @@ def PrintCallback(data): - Получение обезличенной сделки - Получение новой свечки """ - print(data['data']) # Печатаем полученные данные + print(f'{datetime.now().strftime("%d.%m.%Y %H:%M:%S")} - {data["data"]}') # Печатаем полученные данные + if __name__ == '__main__': # Точка входа при запуске этого скрипта qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK # qpProvider = QuikPy(Host='<Ваш IP адрес>') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK - firmId = 'MC0063100000' # Фирма - classCode = 'TQBR' # Класс тикера - secCode = 'GAZP' # Тикер + # classCode = 'TQBR' # Класс тикера + # secCode = 'GAZP' # Тикер - # firmId = 'SPBFUT' # Фирма - # classCode = 'SPBFUT' # Класс тикера - # secCode = 'SiH2' # Для фьючерсов: <Код тикера><Месяц экспирации: 3-H, 6-M, 9-U, 12-Z><Последняя цифра года> + classCode = 'SPBFUT' # Класс тикера + secCode = 'SiH2' # Для фьючерсов: <Код тикера><Месяц экспирации: 3-H, 6-M, 9-U, 12-Z><Последняя цифра года> - # Стакан - print(f'Текущий стакан {classCode}.{secCode}: {qpProvider.GetQuoteLevel2(classCode, secCode)}') + # Запрос текущего стакана. Чтобы получать, в QUIK открыть Таблицу Котировки, указать тикер + # print(f'Текущий стакан {classCode}.{secCode}:', qpProvider.GetQuoteLevel2(classCode, secCode)['data']) + + # Стакан. Чтобы отмена подписки работала корректно, в QUIK должна быть ЗАКРЫТА таблица Котировки тикера qpProvider.OnQuote = PrintCallback # Обработчик изменения стакана котировок - print(f'Подписка на стакан {classCode}.{secCode}: {qpProvider.SubscribeLevel2Quotes(classCode, secCode)["data"]}') - sleepSec = 1 # Кол-во секунд получения котировок - print(f'{sleepSec} секунд котировок') + print(f'Подписка на изменения стакана {classCode}.{secCode}:', qpProvider.SubscribeLevel2Quotes(classCode, secCode)['data']) + print('Статус подписки:', qpProvider.IsSubscribedLevel2Quotes(classCode, secCode)['data']) + sleepSec = 3 # Кол-во секунд получения котировок + print('Секунд котировок:', sleepSec) time.sleep(sleepSec) # Ждем кол-во секунд получения котировок - print(f'Отмена подписки на стакан: {qpProvider.UnsubscribeLevel2Quotes(classCode, secCode)["data"]}') - print(f'Статус подписки: {qpProvider.IsSubscribedLevel2Quotes(classCode, secCode)["data"]}') + print(f'Отмена подписки на изменения стакана:', qpProvider.UnsubscribeLevel2Quotes(classCode, secCode)['data']) + print('Статус подписки:', qpProvider.IsSubscribedLevel2Quotes(classCode, secCode)['data']) qpProvider.OnQuote = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию # Обезличенные сделки. Чтобы получать, в QUIK открыть Таблицу обезличенных сделок, указать тикер qpProvider.OnAllTrade = PrintCallback # Обработчик получения обезличенной сделки - sleepSec = 3 # Кол-во секунд получения обезличенных сделок - print(f'{sleepSec} секунд обезличенных сделок') + sleepSec = 1 # Кол-во секунд получения обезличенных сделок + print('Секунд обезличенных сделок:', sleepSec) time.sleep(sleepSec) # Ждем кол-во секунд получения обезличенных сделок qpProvider.OnAllTrade = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию - # Подписка на новые свечки - qpProvider.OnNewCandle = PrintCallback # Обработчик получения новой свечки - В первый раз получим все свечки с начала прошлой сессии - print(f'Подписка на минутные свечки {qpProvider.SubscribeToCandles(classCode, secCode, 1)["data"]}') - input('Enter - отмена') - print(f'Отмена подписки на минутные свечки {qpProvider.UnsubscribeFromCandles(classCode, secCode, 1)["data"]}') + # Подписка на новые свечки. При первой подписке получим все свечки с начала прошлой сессии + # TODO В QUIK 9.2.13.15 перестала работать повторная подписка + # Перед повторной подпиской нужно перезапустить скрипт QuikSharp.lua Подписка станет первой, все заработает + qpProvider.OnNewCandle = PrintCallback # Обработчик получения новой свечки + print(f'Статус подписки:', qpProvider.IsSubscribed(classCode, secCode, 1)['data']) + print(f'Подписка на минутные свечки', qpProvider.SubscribeToCandles(classCode, secCode, 1)['data']) + print(f'Статус подписки:', qpProvider.IsSubscribed(classCode, secCode, 1)['data']) + input('Enter - отмена\n') + print(f'Отмена подписки на минутные свечки', qpProvider.UnsubscribeFromCandles(classCode, secCode, 1)['data']) + print(f'Статус подписки:', qpProvider.IsSubscribed(classCode, secCode, 1)['data']) qpProvider.OnNewCandle = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию # Выход