develop #3

Open
Alex wants to merge 77 commits from Alex/stcs:develop into stable
37 changed files with 2991 additions and 549 deletions
Showing only changes of commit 511b08e8e5 - Show all commits

View File

@@ -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)