unicex 0.13.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- unicex/__init__.py +200 -0
- unicex/_abc/__init__.py +11 -0
- unicex/_abc/exchange_info.py +216 -0
- unicex/_abc/uni_client.py +329 -0
- unicex/_abc/uni_websocket_manager.py +294 -0
- unicex/_base/__init__.py +9 -0
- unicex/_base/client.py +214 -0
- unicex/_base/websocket.py +261 -0
- unicex/binance/__init__.py +27 -0
- unicex/binance/adapter.py +202 -0
- unicex/binance/client.py +1577 -0
- unicex/binance/exchange_info.py +62 -0
- unicex/binance/uni_client.py +188 -0
- unicex/binance/uni_websocket_manager.py +166 -0
- unicex/binance/user_websocket.py +186 -0
- unicex/binance/websocket_manager.py +912 -0
- unicex/bitget/__init__.py +27 -0
- unicex/bitget/adapter.py +188 -0
- unicex/bitget/client.py +2514 -0
- unicex/bitget/exchange_info.py +48 -0
- unicex/bitget/uni_client.py +198 -0
- unicex/bitget/uni_websocket_manager.py +275 -0
- unicex/bitget/user_websocket.py +7 -0
- unicex/bitget/websocket_manager.py +232 -0
- unicex/bybit/__init__.py +27 -0
- unicex/bybit/adapter.py +208 -0
- unicex/bybit/client.py +1876 -0
- unicex/bybit/exchange_info.py +53 -0
- unicex/bybit/uni_client.py +200 -0
- unicex/bybit/uni_websocket_manager.py +291 -0
- unicex/bybit/user_websocket.py +7 -0
- unicex/bybit/websocket_manager.py +339 -0
- unicex/enums.py +273 -0
- unicex/exceptions.py +64 -0
- unicex/extra.py +335 -0
- unicex/gate/__init__.py +27 -0
- unicex/gate/adapter.py +178 -0
- unicex/gate/client.py +1667 -0
- unicex/gate/exchange_info.py +55 -0
- unicex/gate/uni_client.py +214 -0
- unicex/gate/uni_websocket_manager.py +269 -0
- unicex/gate/user_websocket.py +7 -0
- unicex/gate/websocket_manager.py +513 -0
- unicex/hyperliquid/__init__.py +27 -0
- unicex/hyperliquid/adapter.py +261 -0
- unicex/hyperliquid/client.py +2315 -0
- unicex/hyperliquid/exchange_info.py +119 -0
- unicex/hyperliquid/uni_client.py +325 -0
- unicex/hyperliquid/uni_websocket_manager.py +269 -0
- unicex/hyperliquid/user_websocket.py +7 -0
- unicex/hyperliquid/websocket_manager.py +393 -0
- unicex/mapper.py +111 -0
- unicex/mexc/__init__.py +27 -0
- unicex/mexc/_spot_ws_proto/PrivateAccountV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PrivateDealsV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PrivateOrdersV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicAggreBookTickerV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicAggreDealsV3Api_pb2.py +40 -0
- unicex/mexc/_spot_ws_proto/PublicAggreDepthsV3Api_pb2.py +40 -0
- unicex/mexc/_spot_ws_proto/PublicBookTickerBatchV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicBookTickerV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicDealsV3Api_pb2.py +40 -0
- unicex/mexc/_spot_ws_proto/PublicFuture_pb2.py +103 -0
- unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsV3Api_pb2.py +40 -0
- unicex/mexc/_spot_ws_proto/PublicLimitDepthsV3Api_pb2.py +40 -0
- unicex/mexc/_spot_ws_proto/PublicMiniTickerV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicMiniTickersV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PublicSpotKlineV3Api_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/PushDataV3ApiWrapper_pb2.py +38 -0
- unicex/mexc/_spot_ws_proto/__init__.py +335 -0
- unicex/mexc/adapter.py +239 -0
- unicex/mexc/client.py +846 -0
- unicex/mexc/exchange_info.py +47 -0
- unicex/mexc/uni_client.py +211 -0
- unicex/mexc/uni_websocket_manager.py +269 -0
- unicex/mexc/user_websocket.py +7 -0
- unicex/mexc/websocket_manager.py +456 -0
- unicex/okx/__init__.py +27 -0
- unicex/okx/adapter.py +150 -0
- unicex/okx/client.py +2864 -0
- unicex/okx/exchange_info.py +47 -0
- unicex/okx/uni_client.py +202 -0
- unicex/okx/uni_websocket_manager.py +269 -0
- unicex/okx/user_websocket.py +7 -0
- unicex/okx/websocket_manager.py +743 -0
- unicex/types.py +164 -0
- unicex/utils.py +218 -0
- unicex-0.13.17.dist-info/METADATA +243 -0
- unicex-0.13.17.dist-info/RECORD +93 -0
- unicex-0.13.17.dist-info/WHEEL +5 -0
- unicex-0.13.17.dist-info/licenses/LICENSE +28 -0
- unicex-0.13.17.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Пакет, содержащий реализации клиентов и менеджеров для работы с биржей Bitget."""
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"Client",
|
|
5
|
+
"UniClient",
|
|
6
|
+
"UserWebsocket",
|
|
7
|
+
"WebsocketManager",
|
|
8
|
+
"UniWebsocketManager",
|
|
9
|
+
"ExchangeInfo",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
from .client import Client
|
|
13
|
+
from .exchange_info import ExchangeInfo
|
|
14
|
+
from .uni_client import UniClient
|
|
15
|
+
from .uni_websocket_manager import UniWebsocketManager
|
|
16
|
+
from .user_websocket import UserWebsocket
|
|
17
|
+
from .websocket_manager import WebsocketManager
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def load_exchange_info() -> None:
|
|
21
|
+
"""Загружает информацию о бирже Bitget."""
|
|
22
|
+
await ExchangeInfo.load_exchange_info()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def start_exchange_info(parse_interval_seconds: int = 60 * 60) -> None:
|
|
26
|
+
"""Запускает процесс обновления информации о бирже Bitget."""
|
|
27
|
+
await ExchangeInfo.start(parse_interval_seconds)
|
unicex/bitget/adapter.py
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from unicex.types import (
|
|
4
|
+
AggTradeDict,
|
|
5
|
+
KlineDict,
|
|
6
|
+
OpenInterestDict,
|
|
7
|
+
OpenInterestItem,
|
|
8
|
+
TickerDailyDict,
|
|
9
|
+
TickerDailyItem,
|
|
10
|
+
TradeDict,
|
|
11
|
+
)
|
|
12
|
+
from unicex.utils import catch_adapter_errors, decorate_all_methods
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@decorate_all_methods(catch_adapter_errors)
|
|
16
|
+
class Adapter:
|
|
17
|
+
"""Адаптер для унификации данных с Bitget API."""
|
|
18
|
+
|
|
19
|
+
@staticmethod
|
|
20
|
+
def tickers(raw_data: Any, only_usdt: bool) -> list[str]:
|
|
21
|
+
"""Преобразует сырой ответ, в котором содержатся данные о тикерах в список тикеров.
|
|
22
|
+
|
|
23
|
+
Параметры:
|
|
24
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
25
|
+
only_usdt (bool): Флаг, указывающий, нужно ли включать только тикеры в паре к USDT.
|
|
26
|
+
|
|
27
|
+
Возвращает:
|
|
28
|
+
list[str]: Список тикеров.
|
|
29
|
+
"""
|
|
30
|
+
return [
|
|
31
|
+
item["symbol"]
|
|
32
|
+
for item in raw_data["data"]
|
|
33
|
+
if item["symbol"].endswith("USDT") or not only_usdt
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def ticker_24hr(raw_data: Any) -> TickerDailyDict:
|
|
38
|
+
"""Преобразует сырой ответ, в котором содержатся данные о тикере за последние 24 часа
|
|
39
|
+
в унифицированный формат.
|
|
40
|
+
|
|
41
|
+
Параметры:
|
|
42
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
43
|
+
|
|
44
|
+
Возвращает:
|
|
45
|
+
TickerDailyDict: Словарь, где ключ - тикер, а значение - статистика за последние 24 часа.
|
|
46
|
+
"""
|
|
47
|
+
return {
|
|
48
|
+
item["symbol"]: TickerDailyItem(
|
|
49
|
+
p=round(float(item["change24h"]) * 100, 2), # конвертируем в проценты
|
|
50
|
+
v=float(item["baseVolume"]), # объём в COIN
|
|
51
|
+
q=float(item["usdtVolume"]), # объём в USDT
|
|
52
|
+
)
|
|
53
|
+
for item in raw_data["data"]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@staticmethod
|
|
57
|
+
def last_price(raw_data: Any) -> dict[str, float]:
|
|
58
|
+
"""Преобразует сырой ответ, в котором содержатся данные о последних ценах тикеров
|
|
59
|
+
в унифицированный формат.
|
|
60
|
+
|
|
61
|
+
Параметры:
|
|
62
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
63
|
+
|
|
64
|
+
Возвращает:
|
|
65
|
+
dict[str, float]: Словарь, где ключ - тикер, а значение - последняя цена.
|
|
66
|
+
"""
|
|
67
|
+
return {item["symbol"]: float(item["lastPr"]) for item in raw_data["data"]}
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def klines(raw_data: Any, symbol: str) -> list[KlineDict]:
|
|
71
|
+
"""Преобразует сырой ответ, в котором содержатся данные о котировках тикеров в
|
|
72
|
+
унифицированный формат.
|
|
73
|
+
|
|
74
|
+
Параметры:
|
|
75
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
76
|
+
symbol (str): Тикер, для которого нужно преобразовать данные.
|
|
77
|
+
|
|
78
|
+
Возвращает:
|
|
79
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о свече.
|
|
80
|
+
"""
|
|
81
|
+
return [
|
|
82
|
+
KlineDict(
|
|
83
|
+
s=symbol,
|
|
84
|
+
t=int(kline[0]),
|
|
85
|
+
o=float(kline[1]),
|
|
86
|
+
h=float(kline[2]),
|
|
87
|
+
l=float(kline[3]),
|
|
88
|
+
c=float(kline[4]),
|
|
89
|
+
v=float(kline[5]),
|
|
90
|
+
q=float(kline[6]),
|
|
91
|
+
T=None,
|
|
92
|
+
x=None,
|
|
93
|
+
)
|
|
94
|
+
for kline in sorted(
|
|
95
|
+
raw_data["data"],
|
|
96
|
+
key=lambda x: int(x[0]), # Bitget присылает пачку трейдов в обратном порядке
|
|
97
|
+
)
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def funding_rate(raw_data: Any) -> dict[str, float]:
|
|
102
|
+
"""Преобразует сырой ответ, в котором содержатся данные о ставках финансирования
|
|
103
|
+
тикеров в унифицированный формат.
|
|
104
|
+
|
|
105
|
+
Параметры:
|
|
106
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
107
|
+
|
|
108
|
+
Возвращает:
|
|
109
|
+
dict[str, float]: Словарь, где ключ - тикер, а значение - ставка финансирования.
|
|
110
|
+
"""
|
|
111
|
+
return {item["symbol"]: float(item["fundingRate"]) * 100 for item in raw_data["data"]}
|
|
112
|
+
|
|
113
|
+
@staticmethod
|
|
114
|
+
def klines_message(raw_msg: Any) -> list[KlineDict]:
|
|
115
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
116
|
+
свече/свечах в унифицированный вид.
|
|
117
|
+
|
|
118
|
+
Параметры:
|
|
119
|
+
raw_msg (Any): Сырое сообщение с вебсокета.
|
|
120
|
+
|
|
121
|
+
Возвращает:
|
|
122
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о свече.
|
|
123
|
+
"""
|
|
124
|
+
symbol = raw_msg["arg"]["instId"]
|
|
125
|
+
|
|
126
|
+
return [
|
|
127
|
+
KlineDict(
|
|
128
|
+
s=symbol,
|
|
129
|
+
t=int(kline[0]),
|
|
130
|
+
o=float(kline[1]),
|
|
131
|
+
h=float(kline[2]),
|
|
132
|
+
l=float(kline[3]),
|
|
133
|
+
c=float(kline[4]),
|
|
134
|
+
v=float(kline[5]),
|
|
135
|
+
q=float(kline[6]),
|
|
136
|
+
T=None,
|
|
137
|
+
x=None,
|
|
138
|
+
)
|
|
139
|
+
for kline in sorted(
|
|
140
|
+
raw_msg["data"],
|
|
141
|
+
key=lambda x: int(x[0]), # Bitget присылает пачку трейдов в обратном порядке
|
|
142
|
+
)
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def trades_message(raw_msg: Any) -> list[TradeDict]:
|
|
147
|
+
"""Преобразует сырое сообщение вебсокета со сделками в унифицированный формат.
|
|
148
|
+
|
|
149
|
+
Параметры:
|
|
150
|
+
raw_msg (Any): Сырое сообщение с вебсокета.
|
|
151
|
+
|
|
152
|
+
Возвращает:
|
|
153
|
+
list[TradeDict]: Список сделок в унифицированном формате.
|
|
154
|
+
"""
|
|
155
|
+
symbol = raw_msg["arg"]["instId"]
|
|
156
|
+
|
|
157
|
+
return [
|
|
158
|
+
AggTradeDict(
|
|
159
|
+
t=int(trade["ts"]),
|
|
160
|
+
s=symbol,
|
|
161
|
+
S=trade["side"].upper(),
|
|
162
|
+
p=float(trade["price"]),
|
|
163
|
+
v=float(trade["size"]),
|
|
164
|
+
)
|
|
165
|
+
for trade in sorted(
|
|
166
|
+
raw_msg["data"],
|
|
167
|
+
key=lambda x: int(x["ts"]), # Bitget присылает пачку трейдов в обратном порядке
|
|
168
|
+
)
|
|
169
|
+
]
|
|
170
|
+
|
|
171
|
+
@staticmethod
|
|
172
|
+
def open_interest(raw_data: Any) -> OpenInterestDict:
|
|
173
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
174
|
+
объеме открытых позиций в унифицированный вид.
|
|
175
|
+
|
|
176
|
+
Параметры:
|
|
177
|
+
raw_data (Any): Сырое сообщение с вебсокета.
|
|
178
|
+
|
|
179
|
+
Возвращает:
|
|
180
|
+
`OpenInterestDict`: Cловарь, где ключи - название тикера, а значения - объемы открытых позиций в монетах.
|
|
181
|
+
"""
|
|
182
|
+
return {
|
|
183
|
+
i["symbol"]: OpenInterestItem(
|
|
184
|
+
t=int(i["ts"]),
|
|
185
|
+
v=float(i["holdingAmount"]),
|
|
186
|
+
)
|
|
187
|
+
for i in raw_data["data"]
|
|
188
|
+
}
|