diff --git a/Examples/05 - Stream.py b/Examples/05 - Stream.py index 98d1c74..38fba04 100644 --- a/Examples/05 - Stream.py +++ b/Examples/05 - Stream.py @@ -11,6 +11,12 @@ def PrintCallback(data): """ print(f'{datetime.now().strftime("%d.%m.%Y %H:%M:%S")} - {data["data"]}') # Печатаем полученные данные +def ChangedConnection(data): + """Пользовательский обработчик событий: + - Соединение установлено + - Соединение разорвано + """ + print(f'{datetime.now().strftime("%d.%m.%Y %H:%M:%S")} - {data}') # Печатаем полученные данные if __name__ == '__main__': # Точка входа при запуске этого скрипта qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK @@ -26,34 +32,42 @@ if __name__ == '__main__': # Точка входа при запуске это # print(f'Текущий стакан {classCode}.{secCode}:', qpProvider.GetQuoteLevel2(classCode, secCode)['data']) # Стакан. Чтобы отмена подписки работала корректно, в QUIK должна быть ЗАКРЫТА таблица Котировки тикера - qpProvider.OnQuote = PrintCallback # Обработчик изменения стакана котировок - 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('Статус подписки:', qpProvider.IsSubscribedLevel2Quotes(classCode, secCode)['data']) - qpProvider.OnQuote = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + # qpProvider.OnQuote = PrintCallback # Обработчик изменения стакана котировок + # 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('Статус подписки:', qpProvider.IsSubscribedLevel2Quotes(classCode, secCode)['data']) + # qpProvider.OnQuote = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию # Обезличенные сделки. Чтобы получать, в QUIK открыть Таблицу обезличенных сделок, указать тикер - qpProvider.OnAllTrade = PrintCallback # Обработчик получения обезличенной сделки - sleepSec = 1 # Кол-во секунд получения обезличенных сделок - print('Секунд обезличенных сделок:', sleepSec) - time.sleep(sleepSec) # Ждем кол-во секунд получения обезличенных сделок - qpProvider.OnAllTrade = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + # qpProvider.OnAllTrade = PrintCallback # Обработчик получения обезличенной сделки + # sleepSec = 1 # Кол-во секунд получения обезличенных сделок + # print('Секунд обезличенных сделок:', sleepSec) + # time.sleep(sleepSec) # Ждем кол-во секунд получения обезличенных сделок + # qpProvider.OnAllTrade = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + + # Просмотр изменений состояния соединения терминала QUIK с сервером брокера + qpProvider.OnConnected = ChangedConnection # Нажимаем кнопку "Установить соединение" в QUIK + qpProvider.OnDisconnected = ChangedConnection # Нажимаем кнопку "Разорвать соединение" в QUIK # Подписка на новые свечки. При первой подписке получим все свечки с начала прошлой сессии - # TODO В QUIK 9.2.13.15 перестала работать повторная подписка + # 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']) + for interval in (60,): # (1, 60, 1440) = Минутки, часовки, дневки + print(f'Подписка на интервал {interval}:', qpProvider.SubscribeToCandles(classCode, secCode, interval)['data']) + print(f'Статус подписки на интервал {interval}:', qpProvider.IsSubscribed(classCode, secCode, interval)['data']) input('Enter - отмена\n') - print(f'Отмена подписки на минутные свечки', qpProvider.UnsubscribeFromCandles(classCode, secCode, 1)['data']) - print(f'Статус подписки:', qpProvider.IsSubscribed(classCode, secCode, 1)['data']) + for interval in (60,): # (1, 60, 1440) = Минутки, часовки, дневки + print(f'Отмена подписки на интервал {interval}', qpProvider.UnsubscribeFromCandles(classCode, secCode, interval)['data']) + print(f'Статус подписки на интервал {interval}:', qpProvider.IsSubscribed(classCode, secCode, interval)['data']) qpProvider.OnNewCandle = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + qpProvider.OnConnected = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + qpProvider.OnDisconnected = qpProvider.DefaultHandler # Возвращаем обработчик по умолчанию + # Выход qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра