Stage 07.3.5 — WebSocket Probe + REST Fallback
This commit is contained in:
52
app/src/integrations/exchange/market_cache.py
Normal file
52
app/src/integrations/exchange/market_cache.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# app/src/integrations/exchange/market_cache.py
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from src.core.config import load_settings
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class MarketPriceSnapshot:
|
||||
symbol: str
|
||||
price: float
|
||||
bid_price: float | None
|
||||
ask_price: float | None
|
||||
updated_at: str
|
||||
source: str = "websocket"
|
||||
|
||||
|
||||
class MarketPriceCache:
|
||||
_prices: dict[str, MarketPriceSnapshot] = {}
|
||||
|
||||
# сохранить последнюю цену
|
||||
@classmethod
|
||||
def set_price(
|
||||
cls,
|
||||
*,
|
||||
symbol: str,
|
||||
price: float,
|
||||
bid_price: float | None = None,
|
||||
ask_price: float | None = None,
|
||||
updated_at: str | None = None,
|
||||
) -> None:
|
||||
settings = load_settings()
|
||||
|
||||
if updated_at is None:
|
||||
updated_at = datetime.now(ZoneInfo(settings.tz)).strftime("%d.%m.%Y %H:%M:%S")
|
||||
|
||||
cls._prices[symbol.upper()] = MarketPriceSnapshot(
|
||||
symbol=symbol.upper(),
|
||||
price=price,
|
||||
bid_price=bid_price,
|
||||
ask_price=ask_price,
|
||||
updated_at=updated_at,
|
||||
)
|
||||
|
||||
# получить последнюю цену
|
||||
@classmethod
|
||||
def get_price(cls, symbol: str) -> MarketPriceSnapshot | None:
|
||||
return cls._prices.get(symbol.upper())
|
||||
Reference in New Issue
Block a user