Use CoinEx websocket stream for live market endpoint

Этот коммит содержится в:
Виктор
2026-05-08 03:39:15 +09:00
родитель cc0c924b13
Коммит d96a95bf39
+6 -11
Просмотреть файл
@@ -1,17 +1,17 @@
import asyncio
from pathlib import Path from pathlib import Path
from fastapi import Depends, FastAPI, HTTPException, WebSocket, WebSocketDisconnect from fastapi import Depends, FastAPI, HTTPException, WebSocket, WebSocketDisconnect
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.coinex import CoinExClient from app.coinex import CoinExClient, CoinExLiveStream
from app.core import get_settings from app.core import get_settings
from app.db import SessionLocal, get_db, init_db from app.db import SessionLocal, get_db, init_db
from app.demo_account import DemoAccountService from app.demo_account import DemoAccountService
settings = get_settings() settings = get_settings()
coinex = CoinExClient(settings.coinex_api_base) coinex = CoinExClient(settings.coinex_api_base)
live_stream = CoinExLiveStream(settings.coinex_ws_spot, coinex)
demo_service = DemoAccountService(settings.demo_initial_balance, settings.demo_quote_asset) demo_service = DemoAccountService(settings.demo_initial_balance, settings.demo_quote_asset)
app = FastAPI(title=settings.app_name) app = FastAPI(title=settings.app_name)
@@ -38,6 +38,7 @@ async def health() -> dict:
'trade_mode': settings.trade_mode, 'trade_mode': settings.trade_mode,
'live_enabled': settings.live_enabled, 'live_enabled': settings.live_enabled,
'default_market': settings.default_market, 'default_market': settings.default_market,
'coinex_ws_spot': settings.coinex_ws_spot,
} }
@@ -81,16 +82,10 @@ async def market_ticker(market: str | None = None) -> dict:
async def market_stream(websocket: WebSocket, market: str) -> None: async def market_stream(websocket: WebSocket, market: str) -> None:
await websocket.accept() await websocket.accept()
try: try:
while True: async for live_event in live_stream.trades(market):
ticker = await coinex.get_ticker(market)
with SessionLocal() as db: with SessionLocal() as db:
account = demo_service.snapshot(db).model_dump(mode='json') account = demo_service.snapshot(db).model_dump(mode='json')
await websocket.send_json({ live_event['demo_account'] = account
'type': 'ticker', await websocket.send_json(live_event)
'market': market.upper(),
'data': ticker,
'demo_account': account,
})
await asyncio.sleep(3)
except WebSocketDisconnect: except WebSocketDisconnect:
return return