Use CoinEx websocket stream for live market endpoint
Этот коммит содержится в:
+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
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user