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.
Files changed (93) hide show
  1. unicex/__init__.py +200 -0
  2. unicex/_abc/__init__.py +11 -0
  3. unicex/_abc/exchange_info.py +216 -0
  4. unicex/_abc/uni_client.py +329 -0
  5. unicex/_abc/uni_websocket_manager.py +294 -0
  6. unicex/_base/__init__.py +9 -0
  7. unicex/_base/client.py +214 -0
  8. unicex/_base/websocket.py +261 -0
  9. unicex/binance/__init__.py +27 -0
  10. unicex/binance/adapter.py +202 -0
  11. unicex/binance/client.py +1577 -0
  12. unicex/binance/exchange_info.py +62 -0
  13. unicex/binance/uni_client.py +188 -0
  14. unicex/binance/uni_websocket_manager.py +166 -0
  15. unicex/binance/user_websocket.py +186 -0
  16. unicex/binance/websocket_manager.py +912 -0
  17. unicex/bitget/__init__.py +27 -0
  18. unicex/bitget/adapter.py +188 -0
  19. unicex/bitget/client.py +2514 -0
  20. unicex/bitget/exchange_info.py +48 -0
  21. unicex/bitget/uni_client.py +198 -0
  22. unicex/bitget/uni_websocket_manager.py +275 -0
  23. unicex/bitget/user_websocket.py +7 -0
  24. unicex/bitget/websocket_manager.py +232 -0
  25. unicex/bybit/__init__.py +27 -0
  26. unicex/bybit/adapter.py +208 -0
  27. unicex/bybit/client.py +1876 -0
  28. unicex/bybit/exchange_info.py +53 -0
  29. unicex/bybit/uni_client.py +200 -0
  30. unicex/bybit/uni_websocket_manager.py +291 -0
  31. unicex/bybit/user_websocket.py +7 -0
  32. unicex/bybit/websocket_manager.py +339 -0
  33. unicex/enums.py +273 -0
  34. unicex/exceptions.py +64 -0
  35. unicex/extra.py +335 -0
  36. unicex/gate/__init__.py +27 -0
  37. unicex/gate/adapter.py +178 -0
  38. unicex/gate/client.py +1667 -0
  39. unicex/gate/exchange_info.py +55 -0
  40. unicex/gate/uni_client.py +214 -0
  41. unicex/gate/uni_websocket_manager.py +269 -0
  42. unicex/gate/user_websocket.py +7 -0
  43. unicex/gate/websocket_manager.py +513 -0
  44. unicex/hyperliquid/__init__.py +27 -0
  45. unicex/hyperliquid/adapter.py +261 -0
  46. unicex/hyperliquid/client.py +2315 -0
  47. unicex/hyperliquid/exchange_info.py +119 -0
  48. unicex/hyperliquid/uni_client.py +325 -0
  49. unicex/hyperliquid/uni_websocket_manager.py +269 -0
  50. unicex/hyperliquid/user_websocket.py +7 -0
  51. unicex/hyperliquid/websocket_manager.py +393 -0
  52. unicex/mapper.py +111 -0
  53. unicex/mexc/__init__.py +27 -0
  54. unicex/mexc/_spot_ws_proto/PrivateAccountV3Api_pb2.py +38 -0
  55. unicex/mexc/_spot_ws_proto/PrivateDealsV3Api_pb2.py +38 -0
  56. unicex/mexc/_spot_ws_proto/PrivateOrdersV3Api_pb2.py +38 -0
  57. unicex/mexc/_spot_ws_proto/PublicAggreBookTickerV3Api_pb2.py +38 -0
  58. unicex/mexc/_spot_ws_proto/PublicAggreDealsV3Api_pb2.py +40 -0
  59. unicex/mexc/_spot_ws_proto/PublicAggreDepthsV3Api_pb2.py +40 -0
  60. unicex/mexc/_spot_ws_proto/PublicBookTickerBatchV3Api_pb2.py +38 -0
  61. unicex/mexc/_spot_ws_proto/PublicBookTickerV3Api_pb2.py +38 -0
  62. unicex/mexc/_spot_ws_proto/PublicDealsV3Api_pb2.py +40 -0
  63. unicex/mexc/_spot_ws_proto/PublicFuture_pb2.py +103 -0
  64. unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  65. unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsV3Api_pb2.py +40 -0
  66. unicex/mexc/_spot_ws_proto/PublicLimitDepthsV3Api_pb2.py +40 -0
  67. unicex/mexc/_spot_ws_proto/PublicMiniTickerV3Api_pb2.py +38 -0
  68. unicex/mexc/_spot_ws_proto/PublicMiniTickersV3Api_pb2.py +38 -0
  69. unicex/mexc/_spot_ws_proto/PublicSpotKlineV3Api_pb2.py +38 -0
  70. unicex/mexc/_spot_ws_proto/PushDataV3ApiWrapper_pb2.py +38 -0
  71. unicex/mexc/_spot_ws_proto/__init__.py +335 -0
  72. unicex/mexc/adapter.py +239 -0
  73. unicex/mexc/client.py +846 -0
  74. unicex/mexc/exchange_info.py +47 -0
  75. unicex/mexc/uni_client.py +211 -0
  76. unicex/mexc/uni_websocket_manager.py +269 -0
  77. unicex/mexc/user_websocket.py +7 -0
  78. unicex/mexc/websocket_manager.py +456 -0
  79. unicex/okx/__init__.py +27 -0
  80. unicex/okx/adapter.py +150 -0
  81. unicex/okx/client.py +2864 -0
  82. unicex/okx/exchange_info.py +47 -0
  83. unicex/okx/uni_client.py +202 -0
  84. unicex/okx/uni_websocket_manager.py +269 -0
  85. unicex/okx/user_websocket.py +7 -0
  86. unicex/okx/websocket_manager.py +743 -0
  87. unicex/types.py +164 -0
  88. unicex/utils.py +218 -0
  89. unicex-0.13.17.dist-info/METADATA +243 -0
  90. unicex-0.13.17.dist-info/RECORD +93 -0
  91. unicex-0.13.17.dist-info/WHEEL +5 -0
  92. unicex-0.13.17.dist-info/licenses/LICENSE +28 -0
  93. 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
+ ]