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,202 @@
|
|
|
1
|
+
__all__ = ["Adapter"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from unicex.types import (
|
|
5
|
+
AggTradeDict,
|
|
6
|
+
KlineDict,
|
|
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
|
+
"""Адаптер для унификации данных с Binance API."""
|
|
18
|
+
|
|
19
|
+
@staticmethod
|
|
20
|
+
def tickers(raw_data: list[dict], 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"] for item in raw_data if item["symbol"].endswith("USDT") or not only_usdt
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def ticker_24hr(raw_data: list[dict]) -> TickerDailyDict:
|
|
36
|
+
"""Преобразует сырой ответ, в котором содержатся данные о тикере за последние 24 часа в унифицированный формат.
|
|
37
|
+
|
|
38
|
+
Параметры:
|
|
39
|
+
raw_data (Any): Сырой ответ с биржи.
|
|
40
|
+
|
|
41
|
+
Возвращает:
|
|
42
|
+
TickerDailyDict: Словарь, где ключ - тикер, а значение - статистика за последние 24 часа.
|
|
43
|
+
"""
|
|
44
|
+
return {
|
|
45
|
+
item["symbol"]: TickerDailyItem(
|
|
46
|
+
p=float(item["priceChangePercent"]),
|
|
47
|
+
q=float(item["quoteVolume"]), # объём в долларах
|
|
48
|
+
v=float(item["volume"]), # объём в монетах
|
|
49
|
+
)
|
|
50
|
+
for item in raw_data
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def last_price(raw_data: list[dict]) -> dict[str, float]:
|
|
55
|
+
"""Преобразует сырой ответ, в котором содержатся данные о тикере за последние 24 часа в унифицированный формат.
|
|
56
|
+
|
|
57
|
+
Параметры:
|
|
58
|
+
raw_data (list[dict]): Сырой ответ с биржи.
|
|
59
|
+
|
|
60
|
+
Возвращает:
|
|
61
|
+
dict[str, float]: Словарь, где ключ - тикер, а значение - последняя цена.
|
|
62
|
+
"""
|
|
63
|
+
return {item["symbol"]: float(item["price"]) for item in raw_data}
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def futures_last_price(raw_data: list[dict]) -> dict[str, float]:
|
|
67
|
+
"""Преобразует сырой ответ, в котором содержатся данные о тикере за последние 24 часа в унифицированный формат.
|
|
68
|
+
|
|
69
|
+
Параметры:
|
|
70
|
+
raw_data (list[dict]): Сырой ответ с биржи.
|
|
71
|
+
|
|
72
|
+
Возвращает:
|
|
73
|
+
dict[str, float]: Словарь, где ключ - тикер, а значение - последняя цена.
|
|
74
|
+
"""
|
|
75
|
+
return Adapter.last_price(raw_data)
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def klines(raw_data: list[list], symbol: str) -> list[KlineDict]:
|
|
79
|
+
"""Преобразует сырой ответ, в котором содержатся данные о котировках тикеров в унифицированный формат.
|
|
80
|
+
|
|
81
|
+
Параметры:
|
|
82
|
+
raw_data (list[list]): Сырой ответ с биржи.
|
|
83
|
+
symbol (str): Символ тикера.
|
|
84
|
+
|
|
85
|
+
Возвращает:
|
|
86
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о свече.
|
|
87
|
+
"""
|
|
88
|
+
return [
|
|
89
|
+
KlineDict(
|
|
90
|
+
s=symbol,
|
|
91
|
+
t=kline[0],
|
|
92
|
+
o=float(kline[1]),
|
|
93
|
+
h=float(kline[2]),
|
|
94
|
+
l=float(kline[3]),
|
|
95
|
+
c=float(kline[4]),
|
|
96
|
+
v=float(kline[5]),
|
|
97
|
+
q=float(kline[7]),
|
|
98
|
+
T=kline[6],
|
|
99
|
+
x=None,
|
|
100
|
+
)
|
|
101
|
+
for kline in sorted(
|
|
102
|
+
raw_data,
|
|
103
|
+
key=lambda x: int(x[0]),
|
|
104
|
+
)
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
@staticmethod
|
|
108
|
+
def funding_rate(raw_data: list[dict]) -> dict[str, float]:
|
|
109
|
+
"""Преобразует сырой ответ, в котором содержатся данные о ставках финансирования тикеров в унифицированный формат.
|
|
110
|
+
|
|
111
|
+
Параметры:
|
|
112
|
+
raw_data (list[dict]): Сырой ответ с биржи.
|
|
113
|
+
|
|
114
|
+
Возвращает:
|
|
115
|
+
dict[str, float]: Словарь, где ключ - тикер, а значение - ставка финансирования.
|
|
116
|
+
"""
|
|
117
|
+
return {item["symbol"]: float(item["lastFundingRate"]) * 100 for item in raw_data}
|
|
118
|
+
|
|
119
|
+
@staticmethod
|
|
120
|
+
def open_interest(raw_data: dict) -> OpenInterestItem:
|
|
121
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
122
|
+
объеме открытых позиций в унифицированный вид.
|
|
123
|
+
|
|
124
|
+
Параметры:
|
|
125
|
+
raw_data (Any): Сырое сообщение с вебсокета.
|
|
126
|
+
|
|
127
|
+
Возвращает:
|
|
128
|
+
OpenInterestItem: Словарь со временем и объемом открытого интереса в монетах.
|
|
129
|
+
"""
|
|
130
|
+
return OpenInterestItem(t=raw_data["time"], v=float(raw_data["openInterest"]))
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def klines_message(raw_msg: dict) -> list[KlineDict]:
|
|
134
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
135
|
+
свече/свечах в унифицированный вид.
|
|
136
|
+
|
|
137
|
+
Параметры:
|
|
138
|
+
raw_msg (Any): Сырое сообщение с вебсокета.
|
|
139
|
+
|
|
140
|
+
Возвращает:
|
|
141
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о свече.
|
|
142
|
+
"""
|
|
143
|
+
# Обрабатываем обертку в случае с multiplex stream
|
|
144
|
+
kline = raw_msg.get("data", raw_msg)["k"]
|
|
145
|
+
return [
|
|
146
|
+
KlineDict(
|
|
147
|
+
s=kline["s"],
|
|
148
|
+
t=kline["t"],
|
|
149
|
+
o=float(kline["o"]),
|
|
150
|
+
h=float(kline["h"]),
|
|
151
|
+
l=float(kline["l"]),
|
|
152
|
+
c=float(kline["c"]),
|
|
153
|
+
v=float(kline["v"]), # Используем quote volume (в USDT)
|
|
154
|
+
q=float(kline["q"]), # Используем quote volume (в USDT)
|
|
155
|
+
T=kline["T"],
|
|
156
|
+
x=kline["x"],
|
|
157
|
+
)
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
@staticmethod
|
|
161
|
+
def aggtrades_message(raw_msg: dict) -> list[AggTradeDict]:
|
|
162
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
163
|
+
аггрегированных сделке/сделках в унифицированный вид.
|
|
164
|
+
|
|
165
|
+
Параметры:
|
|
166
|
+
raw_msg (Any): Сырое сообщение с вебсокета.
|
|
167
|
+
|
|
168
|
+
Возвращает:
|
|
169
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о сделке.
|
|
170
|
+
"""
|
|
171
|
+
msg = raw_msg.get("data", raw_msg)
|
|
172
|
+
return [
|
|
173
|
+
AggTradeDict(
|
|
174
|
+
t=int(msg["T"]),
|
|
175
|
+
s=str(msg["s"]),
|
|
176
|
+
S="SELL" if bool(msg["m"]) else "BUY",
|
|
177
|
+
p=float(msg["p"]),
|
|
178
|
+
v=float(msg["q"]),
|
|
179
|
+
)
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
@staticmethod
|
|
183
|
+
def trades_message(raw_msg: dict) -> list[TradeDict]:
|
|
184
|
+
"""Преобразует сырое сообщение с вебсокета, в котором содержится информация о
|
|
185
|
+
сделке/сделках в унифицированный вид.
|
|
186
|
+
|
|
187
|
+
Параметры:
|
|
188
|
+
raw_msg (Any): Сырое сообщение с вебсокета.
|
|
189
|
+
|
|
190
|
+
Возвращает:
|
|
191
|
+
list[KlineDict]: Список словарей, где каждый словарь содержит данные о сделке.
|
|
192
|
+
"""
|
|
193
|
+
msg = raw_msg.get("data", raw_msg)
|
|
194
|
+
return [
|
|
195
|
+
TradeDict(
|
|
196
|
+
t=int(msg["T"]),
|
|
197
|
+
s=str(msg["s"]),
|
|
198
|
+
S="SELL" if bool(msg["m"]) else "BUY",
|
|
199
|
+
p=float(msg["p"]),
|
|
200
|
+
v=float(msg["q"]),
|
|
201
|
+
)
|
|
202
|
+
]
|