Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AsyncIO Python клиент для работы с Quik Lua RPC #62

Open
alexveden opened this issue Mar 13, 2021 · 0 comments
Open

AsyncIO Python клиент для работы с Quik Lua RPC #62

alexveden opened this issue Mar 13, 2021 · 0 comments

Comments

@alexveden
Copy link
Contributor

Сделал прототип клиента на Python AsyncIO работающий на JSON если кому-нибудь будет полезно

Основные возможности

  • Клиент создан на основе асинхронных вызовов AsyncIO
  • Клиент использует JSON протокол QuikLua (который в данный момент в статусе альфа)
  • Клиент поддерживает параллельные запросы через несколько сокетов и организует SocketPool
  • Клиент пока работает только с сокетами без авторизации и только localhost (из соображений безопасности)
  • Клиент пока не поддерживает подписку на события
  • Клиент поддерживает получение исторических данных и их кеширование в памяти
  • Клиент хранит данные истории котировок в формате Pandas.DataFrame
  • Клиент поддерживает проверку наличия соединения через heartbeat и выдает ошибку если socket QuikLua недоступен
  • Клиент поддерживает load-balancing т.е. вы в теории можете запустить 100 асинхронных запросов истории котировок
    и клиент распределит нагрузку, чтобы LUA скрипт на той стороне не упал и не сожрал всю память
  • У меня вроде даже работает на Linux Debian с квиком под Wine! Если что, то можно подключиться к квику на
    виртуальной машине.

Пример кода

import asyncio
from aioquiklua import QuikLuaClientBase, QuikLuaException, QuikLuaConnectionException, QuikLuaNoHistoryException
import traceback
import time

class QuikLuaClientSample(QuikLuaClientBase):

    async def main(self):
        # Вызываем main() основного класса для инициализации внутренних переменных
        await super().main()

        try:
            # Тут вызываем логику модели, подписываемся на события и т.п.
            class_list = await self.rpc_call('getClassesList')
            print('RPC: getClassesList')
            print(class_list)

            # RPC с параметрами
            rpc_result = await self.rpc_call('message', message='Hello world', icon_type='WARNING')
            print('RPC: message')
            print(rpc_result)

            # Заказываем историю котировок (первый запуск может занимать до 10 секунд), потом котировки заполняют кеш и
            # обновляются только последние данные
            time_begin = time.time()
            print(f'RPC: price history')
            quotes_df = await self.get_price_history('SPBFUT', 'RIH1', 'INTERVAL_M1', use_caching=True)
            print(quotes_df.tail(5))
            print(f'Price backfill took {time.time()-time_begin}sec')

            time_begin = time.time()
            print(f'RPC: price history cached')
            quotes_df = await self.get_price_history('SPBFUT', 'RIH1', 'INTERVAL_M1', use_caching=True)
            print(quotes_df.tail(5))
            print(f'Price backfill took {time.time() - time_begin}sec')

            while True:
                # Нажмите ctrl+c чтобы завершить
                # Получаем heartbeat(), он возвращает результат RPC getInfoParam('LASTRECORDTIME')
                await self.heartbeat()
                await asyncio.sleep(1)
        except asyncio.CancelledError:
            # AsyncIO valid stop
            raise
        except KeyboardInterrupt:
            print('KeyboardInterrupt')
        except:
            print(traceback.format_exc())
        finally:
            # Завершаем выполнение (ОБЯЗАТЕЛЬНО вызывайте shutdown() особенно если вы заказывали историю котировок!)
            await self.shutdown()


if __name__ == '__main__':
    qclient = QuikLuaClientSample("tcp://localhost:5560",               # RPC сокет
                                  None,                                 # PUB сокет
                                  socket_timeout=100,                   # Таймаут сокета после которого он выдает ошибку (в миллисекундах)
                                  n_simultaneous_sockets=5,             # Количество одновременно открытых сокетов
                                  history_backfill_interval_sec=10,     # Таймаут на ожидание истории (в секундах) (обычно занимает менее 1 сек)
                                  cache_min_update_sec=0.2,             # Время актуальности истории котировок к кеше, после последнего обновления
                                  )
    asyncio.run(qclient.main())

https://github.com/alexveden/quik-lua-async-client-python

@Enfernuz Enfernuz pinned this issue Dec 1, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants