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,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)
@@ -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
+ }