-
Notifications
You must be signed in to change notification settings - Fork 43
Open
Labels
Description
Сделал прототип клиента на 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())YoukaiCat, gojmpz, KonstantinKlepikov, Enfernuz and draincoderEnfernuz