Merge branch 'fix/refactoring' of https://github.com/Davi0kProgramsThings/bitfinex-api-py into add-rest-examples

This commit is contained in:
itsdeka
2023-01-17 12:08:09 +01:00
9 changed files with 205 additions and 136 deletions

View File

@@ -1,12 +1,17 @@
from .exceptions import LabelerSerializerException from .exceptions import LabelerSerializerException
from typing import Generic, TypeVar, Iterable, Optional, List, Tuple, Any, cast from typing import Type, Generic, TypeVar, Iterable, Optional, List, Tuple, Any, cast
T = TypeVar("T") T = TypeVar("T", bound="_Type")
class _Type(object):
def __init__(self, **kwargs):
for key, value in kwargs.items():
self.__setattr__(key, value)
class _Serializer(Generic[T]): class _Serializer(Generic[T]):
def __init__(self, name: str, labels: List[str], IGNORE: List[str] = [ "_PLACEHOLDER" ]): def __init__(self, name: str, klass: Type[_Type], labels: List[str], IGNORE: List[str] = [ "_PLACEHOLDER" ]):
self.name, self.__labels, self.__IGNORE = name, labels, IGNORE self.name, self.klass, self.__labels, self.__IGNORE = name, klass, labels, IGNORE
def _serialize(self, *args: Any, skip: Optional[List[str]] = None) -> Iterable[Tuple[str, Any]]: def _serialize(self, *args: Any, skip: Optional[List[str]] = None) -> Iterable[Tuple[str, Any]]:
labels = list(filter(lambda label: label not in (skip or list()), self.__labels)) labels = list(filter(lambda label: label not in (skip or list()), self.__labels))
@@ -19,4 +24,7 @@ class _Serializer(Generic[T]):
yield label, args[index] yield label, args[index]
def parse(self, *values: Any, skip: Optional[List[str]] = None) -> T: def parse(self, *values: Any, skip: Optional[List[str]] = None) -> T:
return cast(T, dict(self._serialize(*values, skip=skip))) return cast(T, self.klass(**dict(self._serialize(*values, skip=skip))))
def generate_labeler_serializer(name: str, klass: Type[T], labels: List[str], IGNORE: List[str] = [ "_PLACEHOLDER" ]) -> _Serializer[T]:
return _Serializer[T](name, klass, labels, IGNORE)

View File

@@ -1,35 +1,40 @@
from typing import List, Dict, Union, Optional, Any, TypedDict, cast from typing import List, Dict, Union, Optional, Any, TypedDict, Generic, TypeVar, cast
from .labeler import _Serializer from dataclasses import dataclass
class Notification(TypedDict): from .labeler import _Type, _Serializer
T = TypeVar("T")
@dataclass
class Notification(_Type, Generic[T]):
MTS: int MTS: int
TYPE: str TYPE: str
MESSAGE_ID: Optional[int] MESSAGE_ID: Optional[int]
NOTIFY_INFO: Union[Dict[str, Any], List[Dict[str, Any]]] NOTIFY_INFO: T
CODE: Optional[int] CODE: Optional[int]
STATUS: str STATUS: str
TEXT: str TEXT: str
class _Notification(_Serializer): class _Notification(_Serializer, Generic[T]):
__LABELS = [ "MTS", "TYPE", "MESSAGE_ID", "_PLACEHOLDER", "NOTIFY_INFO", "CODE", "STATUS", "TEXT" ] __LABELS = [ "MTS", "TYPE", "MESSAGE_ID", "_PLACEHOLDER", "NOTIFY_INFO", "CODE", "STATUS", "TEXT" ]
def __init__(self, serializer: Optional[_Serializer] = None, iterate: bool = False): def __init__(self, serializer: Optional[_Serializer] = None, iterate: bool = False):
super().__init__("Notification", _Notification.__LABELS, IGNORE = [ "_PLACEHOLDER" ]) super().__init__("Notification", Notification, _Notification.__LABELS, IGNORE = [ "_PLACEHOLDER" ])
self.serializer, self.iterate = serializer, iterate self.serializer, self.iterate = serializer, iterate
def parse(self, *values: Any, skip: Optional[List[str]] = None) -> Notification: def parse(self, *values: Any, skip: Optional[List[str]] = None) -> Notification[T]:
notification = dict(self._serialize(*values)) notification = cast(Notification[T], Notification(**dict(self._serialize(*values))))
if isinstance(self.serializer, _Serializer): if isinstance(self.serializer, _Serializer):
if self.iterate == False: NOTIFY_INFO = cast(List[Any], notification.NOTIFY_INFO)
NOTIFY_INFO = notification["NOTIFY_INFO"]
if self.iterate == False:
if len(NOTIFY_INFO) == 1 and isinstance(NOTIFY_INFO[0], list): if len(NOTIFY_INFO) == 1 and isinstance(NOTIFY_INFO[0], list):
NOTIFY_INFO = NOTIFY_INFO[0] NOTIFY_INFO = NOTIFY_INFO[0]
notification["NOTIFY_INFO"] = dict(self.serializer._serialize(*NOTIFY_INFO, skip=skip)) notification.NOTIFY_INFO = cast(T, self.serializer.klass(**dict(self.serializer._serialize(*NOTIFY_INFO, skip=skip))))
else: notification["NOTIFY_INFO"] = [ dict(self.serializer._serialize(*data, skip=skip)) for data in notification["NOTIFY_INFO"] ] else: notification.NOTIFY_INFO = cast(T, [ self.serializer.klass(**dict(self.serializer._serialize(*data, skip=skip))) for data in NOTIFY_INFO ])
return cast(Notification, notification) return notification

View File

@@ -8,7 +8,7 @@ from typing import List, Union, Literal, Optional, Any, cast
from . import serializers from . import serializers
from .typings import * from .types import *
from .enums import Config, Sort, OrderType, FundingOfferType, Error from .enums import Config, Sort, OrderType, FundingOfferType, Error
from .exceptions import ResourceNotFound, RequestParametersError, InvalidAuthenticationCredentials, UnknownGenericError from .exceptions import ResourceNotFound, RequestParametersError, InvalidAuthenticationCredentials, UnknownGenericError
@@ -97,11 +97,11 @@ class _RestPublicEndpoints(_Requests):
parsers = { "t": serializers.TradingPairTicker.parse, "f": serializers.FundingCurrencyTicker.parse } parsers = { "t": serializers.TradingPairTicker.parse, "f": serializers.FundingCurrencyTicker.parse }
return [ parsers[subdata[0][0]](*subdata) for subdata in data ] return [ cast(Union[TradingPairTicker, FundingCurrencyTicker], parsers[subdata[0][0]](*subdata)) for subdata in data ]
def get_t_tickers(self, pairs: Union[List[str], Literal["ALL"]]) -> List[TradingPairTicker]: def get_t_tickers(self, pairs: Union[List[str], Literal["ALL"]]) -> List[TradingPairTicker]:
if isinstance(pairs, str) and pairs == "ALL": if isinstance(pairs, str) and pairs == "ALL":
return [ cast(TradingPairTicker, subdata) for subdata in self.get_tickers([ "ALL" ]) if cast(str, subdata["SYMBOL"]).startswith("t") ] return [ cast(TradingPairTicker, subdata) for subdata in self.get_tickers([ "ALL" ]) if cast(str, subdata.SYMBOL).startswith("t") ]
data = self.get_tickers([ "t" + pair for pair in pairs ]) data = self.get_tickers([ "t" + pair for pair in pairs ])
@@ -109,7 +109,7 @@ class _RestPublicEndpoints(_Requests):
def get_f_tickers(self, currencies: Union[List[str], Literal["ALL"]]) -> List[FundingCurrencyTicker]: def get_f_tickers(self, currencies: Union[List[str], Literal["ALL"]]) -> List[FundingCurrencyTicker]:
if isinstance(currencies, str) and currencies == "ALL": if isinstance(currencies, str) and currencies == "ALL":
return [ cast(FundingCurrencyTicker, subdata) for subdata in self.get_tickers([ "ALL" ]) if cast(str, subdata["SYMBOL"]).startswith("f") ] return [ cast(FundingCurrencyTicker, subdata) for subdata in self.get_tickers([ "ALL" ]) if cast(str, subdata.SYMBOL).startswith("f") ]
data = self.get_tickers([ "f" + currency for currency in currencies ]) data = self.get_tickers([ "f" + currency for currency in currencies ])
@@ -262,7 +262,7 @@ class _RestAuthenticatedEndpoints(_Requests):
price: Optional[Union[Decimal, str]] = None, lev: Optional[int] = None, price: Optional[Union[Decimal, str]] = None, lev: Optional[int] = None,
price_trailing: Optional[Union[Decimal, str]] = None, price_aux_limit: Optional[Union[Decimal, str]] = None, price_oco_stop: Optional[Union[Decimal, str]] = None, price_trailing: Optional[Union[Decimal, str]] = None, price_aux_limit: Optional[Union[Decimal, str]] = None, price_oco_stop: Optional[Union[Decimal, str]] = None,
gid: Optional[int] = None, cid: Optional[int] = None, gid: Optional[int] = None, cid: Optional[int] = None,
flags: Optional[int] = 0, tif: Optional[Union[datetime, str]] = None, meta: Optional[JSON] = None) -> Notification: flags: Optional[int] = 0, tif: Optional[Union[datetime, str]] = None, meta: Optional[JSON] = None) -> Notification[Order]:
data = { data = {
"type": type, "symbol": symbol, "amount": amount, "type": type, "symbol": symbol, "amount": amount,
"price": price, "lev": lev, "price": price, "lev": lev,
@@ -271,12 +271,12 @@ class _RestAuthenticatedEndpoints(_Requests):
"flags": flags, "tif": tif, "meta": meta "flags": flags, "tif": tif, "meta": meta
} }
return serializers._Notification(serializer=serializers.Order).parse(*self._POST("auth/w/order/submit", data=data)) return serializers._Notification[Order](serializer=serializers.Order).parse(*self._POST("auth/w/order/submit", data=data))
def update_order(self, id: int, amount: Optional[Union[Decimal, str]] = None, price: Optional[Union[Decimal, str]] = None, def update_order(self, id: int, amount: Optional[Union[Decimal, str]] = None, price: Optional[Union[Decimal, str]] = None,
cid: Optional[int] = None, cid_date: Optional[str] = None, gid: Optional[int] = None, cid: Optional[int] = None, cid_date: Optional[str] = None, gid: Optional[int] = None,
flags: Optional[int] = 0, lev: Optional[int] = None, delta: Optional[Union[Decimal, str]] = None, flags: Optional[int] = 0, lev: Optional[int] = None, delta: Optional[Union[Decimal, str]] = None,
price_aux_limit: Optional[Union[Decimal, str]] = None, price_trailing: Optional[Union[Decimal, str]] = None, tif: Optional[Union[datetime, str]] = None) -> Notification: price_aux_limit: Optional[Union[Decimal, str]] = None, price_trailing: Optional[Union[Decimal, str]] = None, tif: Optional[Union[datetime, str]] = None) -> Notification[Order]:
data = { data = {
"id": id, "amount": amount, "price": price, "id": id, "amount": amount, "price": price,
"cid": cid, "cid_date": cid_date, "gid": gid, "cid": cid, "cid_date": cid_date, "gid": gid,
@@ -284,18 +284,18 @@ class _RestAuthenticatedEndpoints(_Requests):
"price_aux_limit": price_aux_limit, "price_trailing": price_trailing, "tif": tif "price_aux_limit": price_aux_limit, "price_trailing": price_trailing, "tif": tif
} }
return serializers._Notification(serializer=serializers.Order).parse(*self._POST("auth/w/order/update", data=data)) return serializers._Notification[Order](serializer=serializers.Order).parse(*self._POST("auth/w/order/update", data=data))
def cancel_order(self, id: Optional[int] = None, cid: Optional[int] = None, cid_date: Optional[str] = None) -> Notification: def cancel_order(self, id: Optional[int] = None, cid: Optional[int] = None, cid_date: Optional[str] = None) -> Notification[Order]:
data = { data = {
"id": id, "id": id,
"cid": cid, "cid": cid,
"cid_date": cid_date "cid_date": cid_date
} }
return serializers._Notification(serializer=serializers.Order).parse(*self._POST("auth/w/order/cancel", data=data)) return serializers._Notification[Order](serializer=serializers.Order).parse(*self._POST("auth/w/order/cancel", data=data))
def cancel_order_multi(self, ids: Optional[List[int]] = None, cids: Optional[List[Tuple[int, str]]] = None, gids: Optional[List[int]] = None, all: bool = False) -> Notification: def cancel_order_multi(self, ids: Optional[List[int]] = None, cids: Optional[List[Tuple[int, str]]] = None, gids: Optional[List[int]] = None, all: bool = False) -> Notification[List[Order]]:
data = { data = {
"ids": ids, "ids": ids,
"cids": cids, "cids": cids,
@@ -304,7 +304,7 @@ class _RestAuthenticatedEndpoints(_Requests):
"all": int(all) "all": int(all)
} }
return serializers._Notification(serializer=serializers.Order, iterate=True).parse(*self._POST("auth/w/order/cancel/multi", data=data)) return serializers._Notification[List[Order]](serializer=serializers.Order, iterate=True).parse(*self._POST("auth/w/order/cancel/multi", data=data))
def get_orders_history(self, symbol: Optional[str] = None, ids: Optional[List[int]] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> List[Order]: def get_orders_history(self, symbol: Optional[str] = None, ids: Optional[List[int]] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> List[Order]:
if symbol == None: if symbol == None:
@@ -354,17 +354,17 @@ class _RestAuthenticatedEndpoints(_Requests):
def submit_funding_offer(self, type: FundingOfferType, symbol: str, amount: Union[Decimal, str], def submit_funding_offer(self, type: FundingOfferType, symbol: str, amount: Union[Decimal, str],
rate: Union[Decimal, str], period: int, rate: Union[Decimal, str], period: int,
flags: Optional[int] = 0) -> Notification: flags: Optional[int] = 0) -> Notification[FundingOffer]:
data = { data = {
"type": type, "symbol": symbol, "amount": amount, "type": type, "symbol": symbol, "amount": amount,
"rate": rate, "period": period, "rate": rate, "period": period,
"flags": flags "flags": flags
} }
return serializers._Notification(serializer=serializers.FundingOffer).parse(*self._POST("auth/w/funding/offer/submit", data=data)) return serializers._Notification[FundingOffer](serializer=serializers.FundingOffer).parse(*self._POST("auth/w/funding/offer/submit", data=data))
def cancel_funding_offer(self, id: int) -> Notification: def cancel_funding_offer(self, id: int) -> Notification[FundingOffer]:
return serializers._Notification(serializer=serializers.FundingOffer).parse(*self._POST("auth/w/funding/offer/cancel", data={ "id": id })) return serializers._Notification[FundingOffer](serializer=serializers.FundingOffer).parse(*self._POST("auth/w/funding/offer/cancel", data={ "id": id }))
def get_funding_offers_history(self, symbol: Optional[str] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> List[FundingOffer]: def get_funding_offers_history(self, symbol: Optional[str] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> List[FundingOffer]:
if symbol == None: if symbol == None:

View File

@@ -1,16 +1,16 @@
from . import typings from . import types
from .. labeler import _Serializer from .. labeler import generate_labeler_serializer
from .. notification import _Notification from .. notification import _Notification
#region Serializers definition for Rest Public Endpoints #region Serializers definition for Rest Public Endpoints
PlatformStatus = _Serializer[typings.PlatformStatus]("PlatformStatus", labels=[ PlatformStatus = generate_labeler_serializer("PlatformStatus", klass=types.PlatformStatus, labels=[
"OPERATIVE" "OPERATIVE"
]) ])
TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker", labels=[ TradingPairTicker = generate_labeler_serializer("TradingPairTicker", klass=types.TradingPairTicker, labels=[
"SYMBOL", "SYMBOL",
"BID", "BID",
"BID_SIZE", "BID_SIZE",
@@ -24,7 +24,7 @@ TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker",
"LOW" "LOW"
]) ])
FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[ FundingCurrencyTicker = generate_labeler_serializer("FundingCurrencyTicker", klass=types.FundingCurrencyTicker, labels=[
"SYMBOL", "SYMBOL",
"FRR", "FRR",
"BID", "BID",
@@ -44,7 +44,7 @@ FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurre
"FRR_AMOUNT_AVAILABLE" "FRR_AMOUNT_AVAILABLE"
]) ])
TickersHistory = _Serializer[typings.TickersHistory]("TickersHistory", labels=[ TickersHistory = generate_labeler_serializer("TickersHistory", klass=types.TickersHistory, labels=[
"SYMBOL", "SYMBOL",
"BID", "BID",
"_PLACEHOLDER", "_PLACEHOLDER",
@@ -60,14 +60,14 @@ TickersHistory = _Serializer[typings.TickersHistory]("TickersHistory", labels=[
"MTS" "MTS"
]) ])
TradingPairTrade = _Serializer[typings.TradingPairTrade]("TradingPairTrade", labels=[ TradingPairTrade = generate_labeler_serializer("TradingPairTrade", klass=types.TradingPairTrade, labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
"PRICE" "PRICE"
]) ])
FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[ FundingCurrencyTrade = generate_labeler_serializer("FundingCurrencyTrade", klass=types.FundingCurrencyTrade, labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
@@ -75,38 +75,38 @@ FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrenc
"PERIOD" "PERIOD"
]) ])
TradingPairBook = _Serializer[typings.TradingPairBook]("TradingPairBook", labels=[ TradingPairBook = generate_labeler_serializer("TradingPairBook", klass=types.TradingPairBook, labels=[
"PRICE", "PRICE",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyBook = _Serializer[typings.FundingCurrencyBook]("FundingCurrencyBook", labels=[ FundingCurrencyBook = generate_labeler_serializer("FundingCurrencyBook", klass=types.FundingCurrencyBook, labels=[
"RATE", "RATE",
"PERIOD", "PERIOD",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
TradingPairRawBook = _Serializer[typings.TradingPairRawBook]("TradingPairRawBook", labels=[ TradingPairRawBook = generate_labeler_serializer("TradingPairRawBook", klass=types.TradingPairRawBook, labels=[
"ORDER_ID", "ORDER_ID",
"PRICE", "PRICE",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyRawBook = _Serializer[typings.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[ FundingCurrencyRawBook = generate_labeler_serializer("FundingCurrencyRawBook", klass=types.FundingCurrencyRawBook, labels=[
"OFFER_ID", "OFFER_ID",
"PERIOD", "PERIOD",
"RATE", "RATE",
"AMOUNT" "AMOUNT"
]) ])
Statistic = _Serializer[typings.Statistic]("Statistic", labels=[ Statistic = generate_labeler_serializer("Statistic", klass=types.Statistic, labels=[
"MTS", "MTS",
"VALUE" "VALUE"
]) ])
Candle = _Serializer[typings.Candle]("Candle", labels=[ Candle = generate_labeler_serializer("Candle", klass=types.Candle, labels=[
"MTS", "MTS",
"OPEN", "OPEN",
"CLOSE", "CLOSE",
@@ -115,7 +115,7 @@ Candle = _Serializer[typings.Candle]("Candle", labels=[
"VOLUME" "VOLUME"
]) ])
DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus", labels=[ DerivativesStatus = generate_labeler_serializer("DerivativesStatus", klass=types.DerivativesStatus, labels=[
"KEY", "KEY",
"MTS", "MTS",
"_PLACEHOLDER", "_PLACEHOLDER",
@@ -142,7 +142,7 @@ DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus",
"CLAMP_MAX" "CLAMP_MAX"
]) ])
Liquidation = _Serializer[typings.Liquidation]("Liquidation", labels=[ Liquidation = generate_labeler_serializer("Liquidation", klass=types.Liquidation, labels=[
"_PLACEHOLDER", "_PLACEHOLDER",
"POS_ID", "POS_ID",
"MTS", "MTS",
@@ -157,7 +157,7 @@ Liquidation = _Serializer[typings.Liquidation]("Liquidation", labels=[
"PRICE_ACQUIRED" "PRICE_ACQUIRED"
]) ])
Leaderboard = _Serializer[typings.Leaderboard]("Leaderboard", labels=[ Leaderboard = generate_labeler_serializer("Leaderboard", klass=types.Leaderboard, labels=[
"MTS", "MTS",
"_PLACEHOLDER", "_PLACEHOLDER",
"USERNAME", "USERNAME",
@@ -170,7 +170,7 @@ Leaderboard = _Serializer[typings.Leaderboard]("Leaderboard", labels=[
"TWITTER_HANDLE" "TWITTER_HANDLE"
]) ])
FundingStatistic = _Serializer[typings.FundingStatistic]("FundingStatistic", labels=[ FundingStatistic = generate_labeler_serializer("FundingStatistic", klass=types.FundingStatistic, labels=[
"TIMESTAMP", "TIMESTAMP",
"_PLACEHOLDER", "_PLACEHOLDER",
"_PLACEHOLDER", "_PLACEHOLDER",
@@ -189,7 +189,7 @@ FundingStatistic = _Serializer[typings.FundingStatistic]("FundingStatistic", lab
#region Serializers definition for Rest Authenticated Endpoints #region Serializers definition for Rest Authenticated Endpoints
Wallet = _Serializer[typings.Wallet]("Wallet", labels=[ Wallet = generate_labeler_serializer("Wallet", klass=types.Wallet, labels=[
"WALLET_TYPE", "WALLET_TYPE",
"CURRENCY", "CURRENCY",
"BALANCE", "BALANCE",
@@ -199,7 +199,7 @@ Wallet = _Serializer[typings.Wallet]("Wallet", labels=[
"TRADE_DETAILS" "TRADE_DETAILS"
]) ])
Order = _Serializer[typings.Order]("Order", labels=[ Order = generate_labeler_serializer("Order", klass=types.Order, labels=[
"ID", "ID",
"GID", "GID",
"CID", "CID",
@@ -234,7 +234,7 @@ Order = _Serializer[typings.Order]("Order", labels=[
"META" "META"
]) ])
Position = _Serializer[typings.Position]("Position", labels=[ Position = generate_labeler_serializer("Position", klass=types.Position, labels=[
"SYMBOL", "SYMBOL",
"STATUS", "STATUS",
"AMOUNT", "AMOUNT",
@@ -257,7 +257,7 @@ Position = _Serializer[typings.Position]("Position", labels=[
"META" "META"
]) ])
FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[ FundingOffer = generate_labeler_serializer("FundingOffer", klass=types.FundingOffer, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATED", "MTS_CREATED",
@@ -281,7 +281,7 @@ FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[
"_PLACEHOLDER" "_PLACEHOLDER"
]) ])
Trade = _Serializer[typings.Trade]("Trade", labels=[ Trade = generate_labeler_serializer("Trade", klass=types.Trade, labels=[
"ID", "ID",
"PAIR", "PAIR",
"MTS_CREATE", "MTS_CREATE",
@@ -296,7 +296,7 @@ Trade = _Serializer[typings.Trade]("Trade", labels=[
"CID" "CID"
]) ])
OrderTrade = _Serializer[typings.OrderTrade]("OrderTrade", labels=[ OrderTrade = generate_labeler_serializer("OrderTrade", klass=types.OrderTrade, labels=[
"ID", "ID",
"PAIR", "PAIR",
"MTS_CREATE", "MTS_CREATE",
@@ -311,7 +311,7 @@ OrderTrade = _Serializer[typings.OrderTrade]("OrderTrade", labels=[
"CID" "CID"
]) ])
Ledger = _Serializer[typings.Ledger]("Ledger", labels=[ Ledger = generate_labeler_serializer("Ledger", klass=types.Ledger, labels=[
"ID", "ID",
"CURRENCY", "CURRENCY",
"_PLACEHOLDER", "_PLACEHOLDER",
@@ -323,7 +323,7 @@ Ledger = _Serializer[typings.Ledger]("Ledger", labels=[
"DESCRIPTION" "DESCRIPTION"
]) ])
FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[ FundingCredit = generate_labeler_serializer("FundingCredit", klass=types.FundingCredit, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"SIDE", "SIDE",

View File

@@ -1,15 +1,21 @@
from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any
from dataclasses import dataclass
from .. labeler import _Type
from .. notification import Notification from .. notification import Notification
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]]
#region Type hinting for Rest Public Endpoints #region Type hinting for Rest Public Endpoints
class PlatformStatus(TypedDict): @dataclass
class PlatformStatus(_Type):
OPERATIVE: int OPERATIVE: int
class TradingPairTicker(TypedDict): @dataclass
class TradingPairTicker(_Type):
SYMBOL: Optional[str] SYMBOL: Optional[str]
BID: float BID: float
BID_SIZE: float BID_SIZE: float
@@ -22,7 +28,8 @@ class TradingPairTicker(TypedDict):
HIGH: float HIGH: float
LOW: float LOW: float
class FundingCurrencyTicker(TypedDict): @dataclass
class FundingCurrencyTicker(_Type):
SYMBOL: Optional[str] SYMBOL: Optional[str]
FRR: float FRR: float
BID: float BID: float
@@ -39,52 +46,61 @@ class FundingCurrencyTicker(TypedDict):
LOW: float LOW: float
FRR_AMOUNT_AVAILABLE: float FRR_AMOUNT_AVAILABLE: float
class TickersHistory(TypedDict): @dataclass
class TickersHistory(_Type):
SYMBOL: str SYMBOL: str
BID: float BID: float
ASK: float ASK: float
MTS: int MTS: int
class TradingPairTrade(TypedDict): @dataclass
class TradingPairTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
PRICE: float PRICE: float
class FundingCurrencyTrade(TypedDict): @dataclass
class FundingCurrencyTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
RATE: float RATE: float
PERIOD: int PERIOD: int
class TradingPairBook(TypedDict): @dataclass
class TradingPairBook(_Type):
PRICE: float PRICE: float
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class FundingCurrencyBook(TypedDict): @dataclass
class FundingCurrencyBook(_Type):
RATE: float RATE: float
PERIOD: int PERIOD: int
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class TradingPairRawBook(TypedDict): @dataclass
class TradingPairRawBook(_Type):
ORDER_ID: int ORDER_ID: int
PRICE: float PRICE: float
AMOUNT: float AMOUNT: float
class FundingCurrencyRawBook(TypedDict): @dataclass
class FundingCurrencyRawBook(_Type):
OFFER_ID: int OFFER_ID: int
PERIOD: int PERIOD: int
RATE: float RATE: float
AMOUNT: float AMOUNT: float
class Statistic(TypedDict): @dataclass
class Statistic(_Type):
MTS: int MTS: int
VALUE: float VALUE: float
class Candle(TypedDict): @dataclass
class Candle(_Type):
MTS: int MTS: int
OPEN: float OPEN: float
CLOSE: float CLOSE: float
@@ -92,7 +108,8 @@ class Candle(TypedDict):
LOW: float LOW: float
VOLUME: float VOLUME: float
class DerivativesStatus(TypedDict): @dataclass
class DerivativesStatus(_Type):
KEY: Optional[str] KEY: Optional[str]
MTS: int MTS: int
DERIV_PRICE: float DERIV_PRICE: float
@@ -107,7 +124,8 @@ class DerivativesStatus(TypedDict):
CLAMP_MIN: float CLAMP_MIN: float
CLAMP_MAX: float CLAMP_MAX: float
class Liquidation(TypedDict): @dataclass
class Liquidation(_Type):
POS_ID: int POS_ID: int
MTS: int MTS: int
SYMBOL: str SYMBOL: str
@@ -117,14 +135,16 @@ class Liquidation(TypedDict):
IS_MARKET_SOLD: int IS_MARKET_SOLD: int
PRICE_ACQUIRED: float PRICE_ACQUIRED: float
class Leaderboard(TypedDict): @dataclass
class Leaderboard(_Type):
MTS: int MTS: int
USERNAME: str USERNAME: str
RANKING: int RANKING: int
VALUE: float VALUE: float
TWITTER_HANDLE: Optional[str] TWITTER_HANDLE: Optional[str]
class FundingStatistic(TypedDict): @dataclass
class FundingStatistic(_Type):
TIMESTAMP: int TIMESTAMP: int
FRR: float FRR: float
AVG_PERIOD: float AVG_PERIOD: float
@@ -136,7 +156,8 @@ class FundingStatistic(TypedDict):
#region Type hinting for Rest Authenticated Endpoints #region Type hinting for Rest Authenticated Endpoints
class Wallet(TypedDict): @dataclass
class Wallet(_Type):
WALLET_TYPE: str WALLET_TYPE: str
CURRENCY: str CURRENCY: str
BALANCE: float BALANCE: float
@@ -145,7 +166,8 @@ class Wallet(TypedDict):
LAST_CHANGE: str LAST_CHANGE: str
TRADE_DETAILS: JSON TRADE_DETAILS: JSON
class Order(TypedDict): @dataclass
class Order(_Type):
ID: int ID: int
GID: int GID: int
CID: int CID: int
@@ -169,7 +191,8 @@ class Order(TypedDict):
ROUTING: str ROUTING: str
META: JSON META: JSON
class Position(TypedDict): @dataclass
class Position(_Type):
SYMBOL: str SYMBOL: str
STATUS: str STATUS: str
AMOUNT: float AMOUNT: float
@@ -188,7 +211,8 @@ class Position(TypedDict):
COLLATERAL_MIN: float COLLATERAL_MIN: float
META: JSON META: JSON
class FundingOffer(TypedDict): @dataclass
class FundingOffer(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -204,7 +228,8 @@ class FundingOffer(TypedDict):
HIDDEN: int HIDDEN: int
RENEW: bool RENEW: bool
class Trade(TypedDict): @dataclass
class Trade(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -218,7 +243,8 @@ class Trade(TypedDict):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class OrderTrade(TypedDict): @dataclass
class OrderTrade(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -230,7 +256,8 @@ class OrderTrade(TypedDict):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class Ledger(TypedDict): @dataclass
class Ledger(_Type):
ID: int ID: int
CURRENCY: str CURRENCY: str
MTS: int MTS: int
@@ -238,7 +265,8 @@ class Ledger(TypedDict):
BALANCE: float BALANCE: float
description: str description: str
class FundingCredit(TypedDict): @dataclass
class FundingCredit(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int

View File

@@ -2,7 +2,7 @@ from decimal import Decimal
from datetime import datetime from datetime import datetime
from typing import Union, Optional, List, Tuple from typing import Union, Optional, List, Tuple
from .typings import JSON from .types import JSON
from .enums import OrderType, FundingOfferType from .enums import OrderType, FundingOfferType
def _strip(dictionary): def _strip(dictionary):

View File

@@ -1,3 +1,7 @@
from typing import List
from .types import *
from . import serializers from . import serializers
from .enums import Channels from .enums import Channels
from .exceptions import BfxWebsocketException from .exceptions import BfxWebsocketException
@@ -174,13 +178,15 @@ class AuthenticatedChannelsHandler(object):
raise BfxWebsocketException(f"Event of type <{type}> not found in self.__handlers.") raise BfxWebsocketException(f"Event of type <{type}> not found in self.__handlers.")
def __notification(self, stream): def __notification(self, stream):
type, serializer = "notification", serializers._Notification(serializer=None)
if stream[1] == "on-req" or stream[1] == "ou-req" or stream[1] == "oc-req": if stream[1] == "on-req" or stream[1] == "ou-req" or stream[1] == "oc-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[Order](serializer=serializers.Order)
if stream[1] == "oc_multi-req": if stream[1] == "oc_multi-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order, iterate=True).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[List[Order]](serializer=serializers.Order, iterate=True)
if stream[1] == "fon-req" or stream[1] == "foc-req": if stream[1] == "fon-req" or stream[1] == "foc-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.FundingOffer).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[FundingOffer](serializer=serializers.FundingOffer)
return self.event_emitter.emit("notification", serializers._Notification(serializer=None).parse(*stream)) return self.event_emitter.emit(type, serializer.parse(*stream))

View File

@@ -1,12 +1,12 @@
from . import typings from . import types
from .. labeler import _Serializer from .. labeler import generate_labeler_serializer
from .. notification import _Notification from .. notification import _Notification
#region Serializers definition for Websocket Public Channels #region Serializers definition for Websocket Public Channels
TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker", labels=[ TradingPairTicker = generate_labeler_serializer("TradingPairTicker", klass=types.TradingPairTicker, labels=[
"BID", "BID",
"BID_SIZE", "BID_SIZE",
"ASK", "ASK",
@@ -19,7 +19,7 @@ TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker",
"LOW" "LOW"
]) ])
FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[ FundingCurrencyTicker = generate_labeler_serializer("FundingCurrencyTicker", klass=types.FundingCurrencyTicker, labels=[
"FRR", "FRR",
"BID", "BID",
"BID_PERIOD", "BID_PERIOD",
@@ -38,14 +38,14 @@ FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurre
"FRR_AMOUNT_AVAILABLE" "FRR_AMOUNT_AVAILABLE"
]) ])
TradingPairTrade = _Serializer[typings.TradingPairTrade]("TradingPairTrade", labels=[ TradingPairTrade = generate_labeler_serializer("TradingPairTrade", klass=types.TradingPairTrade, labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
"PRICE" "PRICE"
]) ])
FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[ FundingCurrencyTrade = generate_labeler_serializer("FundingCurrencyTrade", klass=types.FundingCurrencyTrade, labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
@@ -53,33 +53,33 @@ FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrenc
"PERIOD" "PERIOD"
]) ])
TradingPairBook = _Serializer[typings.TradingPairBook]("TradingPairBook", labels=[ TradingPairBook = generate_labeler_serializer("TradingPairBook", klass=types.TradingPairBook, labels=[
"PRICE", "PRICE",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyBook = _Serializer[typings.FundingCurrencyBook]("FundingCurrencyBook", labels=[ FundingCurrencyBook = generate_labeler_serializer("FundingCurrencyBook", klass=types.FundingCurrencyBook, labels=[
"RATE", "RATE",
"PERIOD", "PERIOD",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
TradingPairRawBook = _Serializer[typings.TradingPairRawBook]("TradingPairRawBook", labels=[ TradingPairRawBook = generate_labeler_serializer("TradingPairRawBook", klass=types.TradingPairRawBook, labels=[
"ORDER_ID", "ORDER_ID",
"PRICE", "PRICE",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyRawBook = _Serializer[typings.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[ FundingCurrencyRawBook = generate_labeler_serializer("FundingCurrencyRawBook", klass=types.FundingCurrencyRawBook, labels=[
"OFFER_ID", "OFFER_ID",
"PERIOD", "PERIOD",
"RATE", "RATE",
"AMOUNT" "AMOUNT"
]) ])
Candle = _Serializer[typings.Candle]("Candle", labels=[ Candle = generate_labeler_serializer("Candle", klass=types.Candle, labels=[
"MTS", "MTS",
"OPEN", "OPEN",
"CLOSE", "CLOSE",
@@ -88,7 +88,7 @@ Candle = _Serializer[typings.Candle]("Candle", labels=[
"VOLUME" "VOLUME"
]) ])
DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus", labels=[ DerivativesStatus = generate_labeler_serializer("DerivativesStatus", klass=types.DerivativesStatus, labels=[
"TIME_MS", "TIME_MS",
"_PLACEHOLDER", "_PLACEHOLDER",
"DERIV_PRICE", "DERIV_PRICE",
@@ -118,7 +118,7 @@ DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus",
#region Serializers definition for Websocket Authenticated Channels #region Serializers definition for Websocket Authenticated Channels
Order = _Serializer[typings.Order]("Order", labels=[ Order = generate_labeler_serializer("Order", klass=types.Order, labels=[
"ID", "ID",
"GID", "GID",
"CID", "CID",
@@ -153,7 +153,7 @@ Order = _Serializer[typings.Order]("Order", labels=[
"META" "META"
]) ])
Position = _Serializer[typings.Position]("Position", labels=[ Position = generate_labeler_serializer("Position", klass=types.Position, labels=[
"SYMBOL", "SYMBOL",
"STATUS", "STATUS",
"AMOUNT", "AMOUNT",
@@ -176,7 +176,7 @@ Position = _Serializer[typings.Position]("Position", labels=[
"META" "META"
]) ])
TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[ TradeExecuted = generate_labeler_serializer("TradeExecuted", klass=types.TradeExecuted, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATE", "MTS_CREATE",
@@ -191,7 +191,7 @@ TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[
"CID" "CID"
]) ])
TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecutionUpdate", labels=[ TradeExecutionUpdate = generate_labeler_serializer("TradeExecutionUpdate", klass=types.TradeExecutionUpdate, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATE", "MTS_CREATE",
@@ -206,7 +206,7 @@ TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecution
"CID" "CID"
]) ])
FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[ FundingOffer = generate_labeler_serializer("FundingOffer", klass=types.FundingOffer, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATED", "MTS_CREATED",
@@ -230,7 +230,7 @@ FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[
"_PLACEHOLDER" "_PLACEHOLDER"
]) ])
FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[ FundingCredit = generate_labeler_serializer("FundingCredit", klass=types.FundingCredit, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"SIDE", "SIDE",
@@ -255,7 +255,7 @@ FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[
"POSITION_PAIR" "POSITION_PAIR"
]) ])
FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[ FundingLoan = generate_labeler_serializer("FundingLoan", klass=types.FundingLoan, labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"SIDE", "SIDE",
@@ -279,7 +279,7 @@ FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[
"NO_CLOSE" "NO_CLOSE"
]) ])
Wallet = _Serializer[typings.Wallet]("Wallet", labels=[ Wallet = generate_labeler_serializer("Wallet", klass=types.Wallet, labels=[
"WALLET_TYPE", "WALLET_TYPE",
"CURRENCY", "CURRENCY",
"BALANCE", "BALANCE",
@@ -289,7 +289,7 @@ Wallet = _Serializer[typings.Wallet]("Wallet", labels=[
"META" "META"
]) ])
BalanceInfo = _Serializer[typings.BalanceInfo]("BalanceInfo", labels=[ BalanceInfo = generate_labeler_serializer("BalanceInfo", klass=types.BalanceInfo, labels=[
"AUM", "AUM",
"AUM_NET", "AUM_NET",
]) ])

View File

@@ -1,5 +1,9 @@
from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any
from dataclasses import dataclass
from ..labeler import _Type
from ..notification import Notification from ..notification import Notification
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]]
@@ -48,7 +52,8 @@ class Subscriptions:
#region Type hinting for Websocket Public Channels #region Type hinting for Websocket Public Channels
class TradingPairTicker(TypedDict): @dataclass
class TradingPairTicker(_Type):
BID: float BID: float
BID_SIZE: float BID_SIZE: float
ASK: float ASK: float
@@ -60,7 +65,8 @@ class TradingPairTicker(TypedDict):
HIGH: float HIGH: float
LOW: float LOW: float
class FundingCurrencyTicker(TypedDict): @dataclass
class FundingCurrencyTicker(_Type):
FRR: float FRR: float
BID: float BID: float
BID_PERIOD: int BID_PERIOD: int
@@ -76,42 +82,49 @@ class FundingCurrencyTicker(TypedDict):
LOW: float LOW: float
FRR_AMOUNT_AVAILABLE: float FRR_AMOUNT_AVAILABLE: float
class TradingPairTrade(TypedDict): @dataclass
class TradingPairTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
PRICE: float PRICE: float
class FundingCurrencyTrade(TypedDict): @dataclass
class FundingCurrencyTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
RATE: float RATE: float
PERIOD: int PERIOD: int
class TradingPairBook(TypedDict): @dataclass
class TradingPairBook(_Type):
PRICE: float PRICE: float
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class FundingCurrencyBook(TypedDict): @dataclass
class FundingCurrencyBook(_Type):
RATE: float RATE: float
PERIOD: int PERIOD: int
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class TradingPairRawBook(TypedDict): @dataclass
class TradingPairRawBook(_Type):
ORDER_ID: int ORDER_ID: int
PRICE: float PRICE: float
AMOUNT: float AMOUNT: float
class FundingCurrencyRawBook(TypedDict): @dataclass
class FundingCurrencyRawBook(_Type):
OFFER_ID: int OFFER_ID: int
PERIOD: int PERIOD: int
RATE: float RATE: float
AMOUNT: float AMOUNT: float
class Candle(TypedDict): @dataclass
class Candle(_Type):
MTS: int MTS: int
OPEN: float OPEN: float
CLOSE: float CLOSE: float
@@ -119,7 +132,8 @@ class Candle(TypedDict):
LOW: float LOW: float
VOLUME: float VOLUME: float
class DerivativesStatus(TypedDict): @dataclass
class DerivativesStatus(_Type):
TIME_MS: int TIME_MS: int
DERIV_PRICE: float DERIV_PRICE: float
SPOT_PRICE: float SPOT_PRICE: float
@@ -136,8 +150,8 @@ class DerivativesStatus(TypedDict):
#endregion #endregion
#region Type hinting for Websocket Authenticated Channels #region Type hinting for Websocket Authenticated Channels
@dataclass
class Order(TypedDict): class Order(_Type):
ID: int ID: int
GID: int GID: int
CID: int CID: int
@@ -161,7 +175,8 @@ class Order(TypedDict):
ROUTING: str ROUTING: str
META: JSON META: JSON
class Position(TypedDict): @dataclass
class Position(_Type):
SYMBOL: str SYMBOL: str
STATUS: str STATUS: str
AMOUNT: float AMOUNT: float
@@ -180,7 +195,8 @@ class Position(TypedDict):
COLLATERAL_MIN: float COLLATERAL_MIN: float
META: JSON META: JSON
class TradeExecuted(TypedDict): @dataclass
class TradeExecuted(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -192,7 +208,8 @@ class TradeExecuted(TypedDict):
MAKER:int MAKER:int
CID: int CID: int
class TradeExecutionUpdate(TypedDict): @dataclass
class TradeExecutionUpdate(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -206,7 +223,8 @@ class TradeExecutionUpdate(TypedDict):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class FundingOffer(TypedDict): @dataclass
class FundingOffer(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATED: int MTS_CREATED: int
@@ -222,7 +240,8 @@ class FundingOffer(TypedDict):
HIDDEN: int HIDDEN: int
RENEW: int RENEW: int
class FundingCredit(TypedDict): @dataclass
class FundingCredit(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int
@@ -242,7 +261,8 @@ class FundingCredit(TypedDict):
NO_CLOSE: int NO_CLOSE: int
POSITION_PAIR: str POSITION_PAIR: str
class FundingLoan(TypedDict): @dataclass
class FundingLoan(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int
@@ -261,7 +281,8 @@ class FundingLoan(TypedDict):
RATE_REAL: float RATE_REAL: float
NO_CLOSE: int NO_CLOSE: int
class Wallet(TypedDict): @dataclass
class Wallet(_Type):
WALLET_TYPE: str WALLET_TYPE: str
CURRENCY: str CURRENCY: str
BALANCE: float BALANCE: float
@@ -270,7 +291,8 @@ class Wallet(TypedDict):
DESCRIPTION: str DESCRIPTION: str
META: JSON META: JSON
class BalanceInfo(TypedDict): @dataclass
class BalanceInfo(_Type):
AUM: float AUM: float
AUM_NET: float AUM_NET: float