From 511b08e8e526a424203823c63c50a30ea70680d2 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Wed, 27 Aug 2025 12:52:33 +0500 Subject: [PATCH] Added WebSocket --- app/services/Bybit/functions/bybit_ws.py | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 app/services/Bybit/functions/bybit_ws.py diff --git a/app/services/Bybit/functions/bybit_ws.py b/app/services/Bybit/functions/bybit_ws.py new file mode 100644 index 0000000..8b8562d --- /dev/null +++ b/app/services/Bybit/functions/bybit_ws.py @@ -0,0 +1,47 @@ +import asyncio +import logging.config +from pybit.unified_trading import WebSocket +from websocket import WebSocketConnectionClosedException +from logger_helper.logger_helper import LOGGING_CONFIG + +logging.config.dictConfig(LOGGING_CONFIG) +logger = logging.getLogger("bybit_ws") + +event_loop = None # Сюда нужно будет установить event loop из основного приложения + + +def set_event_loop(loop: asyncio.AbstractEventLoop): + global event_loop + event_loop = loop + + +def on_execution_callback(message, msg): + """ + Callback на событие исполнения сделки. + Безопасно запускает асинхронный обработчик из sync callback. + """ + if event_loop is not None: + from app.services.Bybit.functions.Futures import handle_execution_message # Импорт внутри, чтобы избежать циклических импортов + asyncio.run_coroutine_threadsafe(handle_execution_message(message, msg), event_loop) + else: + logger.error("Event loop не установлен, callback пропущен.") + + +async def start_execution_ws(api_key: str, api_secret: str, message): + """ + Запускает и поддерживает WebSocket подключение для исполнения сделок. + Реконнект при потерях соединения. + """ + reconnect_delay = 5 + while True: + try: + ws = WebSocket(api_key=api_key, api_secret=api_secret, testnet=False, channel_type="private") + ws.execution_stream(lambda msg: on_execution_callback(message, msg)) + while True: + await asyncio.sleep(1) # Поддержание активности + except WebSocketConnectionClosedException: + logger.warning("WebSocket закрыт, переподключение через 5 секунд...") + await asyncio.sleep(reconnect_delay) + except Exception as e: + logger.error(f"Ошибка WebSocket: {e}") + await asyncio.sleep(reconnect_delay)