Added WebSocket
This commit is contained in:
47
app/services/Bybit/functions/bybit_ws.py
Normal file
47
app/services/Bybit/functions/bybit_ws.py
Normal 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)
|
Reference in New Issue
Block a user