File size: 1,596 Bytes
1a9e63d
 
 
 
 
 
6c0f809
1a9e63d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c0f809
1a9e63d
6c0f809
 
1a9e63d
 
 
 
 
 
 
 
 
 
 
 
6c0f809
 
 
 
 
1a9e63d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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)),
        )