from datetime import datetime from typing import List, Dict, Any from pydantic import BaseModel, Field class KlineData(BaseModel): timestamp: int = Field(..., description="Timestamp in milliseconds") open: float high: float low: float close: float volume: float @property def datetime(self) -> datetime: return datetime.fromtimestamp(self.timestamp / 1000) @classmethod def from_kucoin_data(cls, data: List[Any]) -> "KlineData": return cls( timestamp=int(data[0]), open=float(data[1]), high=float(data[2]), low=float(data[3]), close=float(data[4]), volume=float(data[5]), ) class MarketData(BaseModel): symbol: str granularity: int klines: List[KlineData] @classmethod def from_kucoin_response( cls, response_data: Dict[str, Any], symbol: str, granularity: int ): klines = [KlineData.from_kucoin_data(k) for k in response_data.get("data", [])] return cls(symbol=symbol, granularity=granularity, klines=klines) class SymbolInfo(BaseModel): symbol: str name: str baseCurrency: str quoteCurrency: str maxLeverage: int @classmethod def from_kucoin_data(cls, data: Dict[str, Any]) -> "SymbolInfo": return cls( symbol=data.get("symbol", ""), name=data.get("name", ""), baseCurrency=data.get("baseCurrency", ""), quoteCurrency=data.get("quoteCurrency", ""), maxLeverage=int(data.get("maxLeverage", 0)), )