Apply lots of refactoring to the websocket subpackage (fix every mypy error and warning). Add integers.py and decimal.py to bfxapi.utils package. Update requirements.txt and setup.py with new mypy dependencies.

This commit is contained in:
Davide Casale
2022-12-16 18:30:41 +01:00
parent 0e4cbd40a6
commit 0a53ab7f7e
10 changed files with 393 additions and 348 deletions

View File

@@ -2,301 +2,294 @@ from decimal import Decimal
from datetime import datetime
from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any
from typing import Type, NewType, Tuple, List, Dict, TypedDict, Union, Optional, Any
int16 = int32 = int45 = int64 = int
from ..utils.integers import Int16, Int32, Int45, Int64
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]]
#region Type hinting for subscription objects
class Subscriptions:
TradingPairsTicker = TypedDict("Subscriptions.TradingPairsTicker", {
"chanId": int,
"symbol": str,
"pair": str
})
class TradingPairsTicker(TypedDict):
chanId: int
symbol: str
pair: str
FundingCurrenciesTicker = TypedDict("Subscriptions.FundingCurrenciesTicker", {
"chanId": int,
"symbol": str,
"currency": str
})
class FundingCurrenciesTicker(TypedDict):
chanId: int
symbol: str
currency: str
TradingPairsTrades = TypedDict("Subscriptions.TradingPairsTrades", {
"chanId": int,
"symbol": str,
"pair": str
})
class TradingPairsTrades(TypedDict):
chanId: int
symbol: str
pair: str
FundingCurrenciesTrades = TypedDict("Subscriptions.FundingCurrenciesTrades", {
"chanId": int,
"symbol": str,
"currency": str
})
class FundingCurrenciesTrades(TypedDict):
chanId: int
symbol: str
currency: str
Book = TypedDict("Subscriptions.Book", {
"chanId": int,
"symbol": str,
"prec": str,
"freq": str,
"len": str,
"subId": int,
"pair": str
})
class Book(TypedDict):
chanId: int
symbol: str
prec: str
freq: str
len: str
subId: int
pair: str
Candles = TypedDict("Subscriptions.Candles", {
"chanId": int,
"key": str
})
class Candles(TypedDict):
chanId: int
key: str
DerivativesStatus = TypedDict("Subscriptions.DerivativesStatus", {
"chanId": int,
"key": str
})
class DerivativesStatus(TypedDict):
chanId: int
key: str
#endregion
#region Type hinting for Websocket Public Channels
TradingPairTicker = TypedDict("TradingPairTicker", {
"BID": float,
"BID_SIZE": float,
"ASK": float,
"ASK_SIZE": float,
"DAILY_CHANGE": float,
"DAILY_CHANGE_RELATIVE": float,
"LAST_PRICE": float,
"VOLUME": float,
"HIGH": float,
"LOW": float
})
class TradingPairTicker(TypedDict):
BID: float
BID_SIZE: float
ASK: float
ASK_SIZE: float
DAILY_CHANGE: float
DAILY_CHANGE_RELATIVE: float
LAST_PRICE: float
VOLUME: float
HIGH: float
LOW: float
FundingCurrencyTicker = TypedDict("FundingCurrencyTicker", {
"FRR": float,
"BID": float,
"BID_PERIOD": int,
"BID_SIZE": float,
"ASK": float,
"ASK_PERIOD": int,
"ASK_SIZE": float,
"DAILY_CHANGE": float,
"DAILY_CHANGE_RELATIVE": float,
"LAST_PRICE": float,
"VOLUME": float,
"HIGH": float,
"LOW": float,
"FRR_AMOUNT_AVAILABLE": float
})
class FundingCurrencyTicker(TypedDict):
FRR: float
BID: float
BID_PERIOD: int
BID_SIZE: float
ASK: float
ASK_PERIOD: int
ASK_SIZE: float
DAILY_CHANGE: float
DAILY_CHANGE_RELATIVE: float
LAST_PRICE: float
VOLUME: float
HIGH: float
LOW: float
FRR_AMOUNT_AVAILABLE: float
(TradingPairTrade, FundingCurrencyTrade) = (
TypedDict("TradingPairTrade", { "ID": int, "MTS": int, "AMOUNT": float, "PRICE": float }),
TypedDict("FundingCurrencyTrade", { "ID": int, "MTS": int, "AMOUNT": float, "RATE": float, "PERIOD": int })
)
class TradingPairTrade(TypedDict):
ID: int
MTS: int
AMOUNT: float
PRICE: float
(TradingPairTrades, FundingCurrencyTrades) = (List[TradingPairTrade], List[FundingCurrencyTrade])
class FundingCurrencyTrade(TypedDict):
ID: int
MTS: int
AMOUNT: float
RATE: float
PERIOD: int
(TradingPairBook, FundingCurrencyBook) = (
TypedDict("TradingPairBook", { "PRICE": float, "COUNT": int, "AMOUNT": float }),
TypedDict("FundingCurrencyBook", { "RATE": float, "PERIOD": int, "COUNT": int, "AMOUNT": float })
)
class TradingPairBook(TypedDict):
PRICE: float
COUNT: int
AMOUNT: float
class FundingCurrencyBook(TypedDict):
RATE: float
PERIOD: int
COUNT: int
AMOUNT: float
class TradingPairRawBook(TypedDict):
ORDER_ID: int
PRICE: float
AMOUNT: float
class FundingCurrencyRawBook(TypedDict):
OFFER_ID: int
PERIOD: int
RATE: float
AMOUNT: float
(TradingPairBooks, FundingCurrencyBooks) = (List[TradingPairBook], List[FundingCurrencyBook])
class Candle(TypedDict):
MTS: int
OPEN: float
CLOSE: float
HIGH: float
LOW: float
VOLUME: float
(TradingPairRawBook, FundingCurrencyRawBook) = (
TypedDict("TradingPairRawBook", { "ORDER_ID": int, "PRICE": float, "AMOUNT": float }),
TypedDict("FundingCurrencyRawBook", { "OFFER_ID": int, "PERIOD": int, "RATE": float, "AMOUNT": float }),
)
(TradingPairRawBooks, FundingCurrencyRawBooks) = (List[TradingPairRawBook], List[FundingCurrencyRawBook])
Candle = TypedDict("Candle", {
"MTS": int,
"OPEN": float,
"CLOSE": float,
"HIGH": float,
"LOW": float,
"VOLUME": float
})
Candles = List[Candle]
DerivativesStatus = TypedDict("DerivativesStatus", {
"TIME_MS": int,
"DERIV_PRICE": float,
"SPOT_PRICE": float,
"INSURANCE_FUND_BALANCE": float,
"NEXT_FUNDING_EVT_TIMESTAMP_MS": int,
"NEXT_FUNDING_ACCRUED": float,
"NEXT_FUNDING_STEP": int,
"CURRENT_FUNDING": float,
"MARK_PRICE": float,
"OPEN_INTEREST": float,
"CLAMP_MIN": float,
"CLAMP_MAX": float
})
class DerivativesStatus(TypedDict):
TIME_MS: int
DERIV_PRICE: float
SPOT_PRICE: float
INSURANCE_FUND_BALANCE: float
NEXT_FUNDING_EVT_TIMESTAMP_MS: int
NEXT_FUNDING_ACCRUED: float
NEXT_FUNDING_STEP: int
CURRENT_FUNDING: float
MARK_PRICE: float
OPEN_INTEREST: float
CLAMP_MIN: float
CLAMP_MAX: float
#endregion
#region Type hinting for Websocket Authenticated Channels
Order = TypedDict("Order", {
"ID": int,
"GID": int,
"CID": int,
"SYMBOL": str,
"MTS_CREATE": int,
"MTS_UPDATE": int,
"AMOUNT": float,
"AMOUNT_ORIG": float,
"ORDER_TYPE": str,
"TYPE_PREV": str,
"MTS_TIF": int,
"FLAGS": int,
"ORDER_STATUS": str,
"PRICE": float,
"PRICE_AVG": float,
"PRICE_TRAILING": float,
"PRICE_AUX_LIMIT": float,
"NOTIFY": int,
"HIDDEN": int,
"PLACED_ID": int,
"ROUTING": str,
"META": JSON
})
class Order(TypedDict):
ID: int
GID: int
CID: int
SYMBOL: str
MTS_CREATE: int
MTS_UPDATE: int
AMOUNT: float
AMOUNT_ORIG: float
ORDER_TYPE: str
TYPE_PREV: str
MTS_TIF: int
FLAGS: int
ORDER_STATUS: str
PRICE: float
PRICE_AVG: float
PRICE_TRAILING: float
PRICE_AUX_LIMIT: float
NOTIFY: int
HIDDEN: int
PLACED_ID: int
ROUTING: str
META: JSON
Orders = List[Order]
class Position(TypedDict):
SYMBOL: str
STATUS: str
AMOUNT: float
BASE_PRICE: float
MARGIN_FUNDING: float
MARGIN_FUNDING_TYPE: int
PL: float
PL_PERC: float
PRICE_LIQ: float
LEVERAGE: float
POSITION_ID: int
MTS_CREATE: int
MTS_UPDATE: int
TYPE: int
COLLATERAL: float
COLLATERAL_MIN: float
META: JSON
Position = TypedDict("Position", {
"SYMBOL": str,
"STATUS": str,
"AMOUNT": float,
"BASE_PRICE": float,
"MARGIN_FUNDING": float,
"MARGIN_FUNDING_TYPE": int,
"PL": float,
"PL_PERC": float,
"PRICE_LIQ": float,
"LEVERAGE": float,
"POSITION_ID": int,
"MTS_CREATE": int,
"MTS_UPDATE": int,
"TYPE": int,
"COLLATERAL": float,
"COLLATERAL_MIN": float,
"META": JSON,
})
class TradeExecuted(TypedDict):
ID: int
SYMBOL: str
MTS_CREATE: int
ORDER_ID: int
EXEC_AMOUNT: float
EXEC_PRICE: float
ORDER_TYPE: str
ORDER_PRICE: float
MAKER:int
CID: int
Positions = List[Position]
class TradeExecutionUpdate(TypedDict):
ID: int
SYMBOL: str
MTS_CREATE: int
ORDER_ID: int
EXEC_AMOUNT: float
EXEC_PRICE: float
ORDER_TYPE: str
ORDER_PRICE: float
MAKER:int
FEE: float
FEE_CURRENCY: str
CID: int
TradeExecuted = TypedDict("TradeExecuted", {
"ID": int,
"SYMBOL": str,
"MTS_CREATE": int,
"ORDER_ID": int,
"EXEC_AMOUNT": float,
"EXEC_PRICE": float,
"ORDER_TYPE": str,
"ORDER_PRICE": float,
"MAKER":int,
"CID": int
})
class FundingOffer(TypedDict):
ID: int
SYMBOL: str
MTS_CREATED: int
MTS_UPDATED: int
AMOUNT: float
AMOUNT_ORIG: float
OFFER_TYPE: str
FLAGS: int
STATUS: str
RATE: float
PERIOD: int
NOTIFY: int
HIDDEN: int
RENEW: int
TradeExecutionUpdate = TypedDict("TradeExecutionUpdate", {
"ID": int,
"SYMBOL": str,
"MTS_CREATE": int,
"ORDER_ID": int,
"EXEC_AMOUNT": float,
"EXEC_PRICE": float,
"ORDER_TYPE": str,
"ORDER_PRICE": float,
"MAKER":int,
"FEE": float,
"FEE_CURRENCY": str,
"CID": int
})
class FundingCredit(TypedDict):
ID: int
SYMBOL: str
SIDE: int
MTS_CREATE: int
MTS_UPDATE: int
AMOUNT: float
FLAGS: int
STATUS: str
RATE: float
PERIOD: int
MTS_OPENING: int
MTS_LAST_PAYOUT: int
NOTIFY: int
HIDDEN: int
RENEW: int
RATE_REAL: float
NO_CLOSE: int
POSITION_PAIR: str
FundingOffer = TypedDict("FundingOffer", {
"ID": int,
"SYMBOL": str,
"MTS_CREATED": int,
"MTS_UPDATED": int,
"AMOUNT": float,
"AMOUNT_ORIG": float,
"OFFER_TYPE": str,
"FLAGS": int,
"STATUS": str,
"RATE": float,
"PERIOD": int,
"NOTIFY": int,
"HIDDEN": int,
"RENEW": int,
})
class FundingLoan(TypedDict):
ID: int
SYMBOL: str
SIDE: int
MTS_CREATE: int
MTS_UPDATE: int
AMOUNT: float
FLAGS: int
STATUS: str
RATE: float
PERIOD: int
MTS_OPENING: int
MTS_LAST_PAYOUT: int
NOTIFY: int
HIDDEN: int
RENEW: int
RATE_REAL: float
NO_CLOSE: int
FundingOffers = List[FundingOffer]
class Wallet(TypedDict):
WALLET_TYPE: str
CURRENCY: str
BALANCE: float
UNSETTLED_INTEREST: float
BALANCE_AVAILABLE: float
DESCRIPTION: str
META: JSON
FundingCredit = TypedDict("FundingCredit", {
"ID": int,
"SYMBOL": str,
"SIDE": int,
"MTS_CREATE": int,
"MTS_UPDATE": int,
"AMOUNT": float,
"FLAGS": int,
"STATUS": str,
"RATE": float,
"PERIOD": int,
"MTS_OPENING": int,
"MTS_LAST_PAYOUT": int,
"NOTIFY": int,
"HIDDEN": int,
"RENEW": int,
"RATE_REAL": float,
"NO_CLOSE": int,
"POSITION_PAIR": str
})
class BalanceInfo(TypedDict):
AUM: float
AUM_NET: float
FundingCredits = List[FundingCredit]
#endregion
FundingLoan = TypedDict("FundingLoan", {
"ID": int,
"SYMBOL": str,
"SIDE": int,
"MTS_CREATE": int,
"MTS_UPDATE": int,
"AMOUNT": float,
"FLAGS": int,
"STATUS": str,
"RATE": float,
"PERIOD": int,
"MTS_OPENING": int,
"MTS_LAST_PAYOUT": int,
"NOTIFY": int,
"HIDDEN": int,
"RENEW": int,
"RATE_REAL": float,
"NO_CLOSE": int
})
#region Serializers definition for Notifications channel
FundingLoans = List[FundingLoan]
Wallet = TypedDict("Wallet", {
"WALLET_TYPE": str,
"CURRENCY": str,
"BALANCE": float,
"UNSETTLED_INTEREST": float,
"BALANCE_AVAILABLE": float,
"DESCRIPTION": str,
"META": JSON
})
Wallets = List[Wallet]
BalanceInfo = TypedDict("BalanceInfo", {
"AUM": float,
"AUM_NET": float
})
class Notification(TypedDict):
MTS: int
TYPE: str
MESSAGE_ID: int
NOTIFY_INFO: JSON
CODE: int
STATUS: str
TEXT: str
#endregion
@@ -304,55 +297,50 @@ BalanceInfo = TypedDict("BalanceInfo", {
class Inputs:
class Order:
New = TypedDict("Inputs.Order.New", {
"gid": Optional[int32],
"cid": int45,
"type": str,
"symbol": str,
"amount": Union[Decimal, str],
"price": Union[Decimal, str],
"lev": int,
"price_trailing": Union[Decimal, str],
"price_aux_limit": Union[Decimal, str],
"price_oco_stop": Union[Decimal, str],
"flags": int16,
"tif": Union[datetime, str],
"meta": JSON
})
class New(TypedDict, total=False):
gid: Union[Int32, int]
cid: Union[Int45, int]
type: str
symbol: str
amount: Union[Decimal, str]
price: Union[Decimal, str]
lev: Union[Int32, int]
price_trailing: Union[Decimal, str]
price_aux_limit: Union[Decimal, str]
price_oco_stop: Union[Decimal, str]
flags: Union[Int16, int]
tif: Union[datetime, str]
meta: JSON
Update = TypedDict("Inputs.Order.Update", {
"id": int64,
"cid": int45,
"cid_date": str,
"gid": int32,
"price": Union[Decimal, str],
"amount": Union[Decimal, str],
"lev": int,
"delta": Union[Decimal, str],
"price_aux_limit": Union[Decimal, str],
"price_trailing": Union[Decimal, str],
"flags": int16,
"tif": Union[datetime, str]
})
class Update(TypedDict, total=False):
id: Union[Int64, int]
cid: Union[Int45, int]
cid_date: str
gid: Union[Int32, int]
price: Union[Decimal, str]
amount: Union[Decimal, str]
lev: Union[Int32, int]
delta: Union[Decimal, str]
price_aux_limit: Union[Decimal, str]
price_trailing: Union[Decimal, str]
flags: Union[Int16, int]
tif: Union[datetime, str]
Cancel = TypedDict("Inputs.Order.Cancel", {
"id": int64,
"cid": int45,
"cid_date": str
})
class Cancel(TypedDict, total=False):
id: Union[Int64, int]
cid: Union[Int45, int]
cid_date: Union[datetime, str]
class Offer:
New = TypedDict("Inputs.Offer.New", {
"type": str,
"symbol": str,
"amount": Union[Decimal, str],
"rate": Union[Decimal, str],
"period": int,
"flags": int16
})
class New(TypedDict, total=False):
type: str
symbol: str
amount: Union[Decimal, str]
rate: Union[Decimal, str]
period: Union[Int32, int]
flags: Union[Int16, int]
Cancel = TypedDict("Inputs.Offer.Cancel", {
"id": int
})
class Cancel(TypedDict, total=False):
id: Union[Int32, int]
#endregion