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)