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,513 @@
1
+ __all__ = ["WebsocketManager"]
2
+
3
+
4
+ import json
5
+ import time
6
+ from collections.abc import Awaitable, Callable
7
+ from typing import Any, Literal
8
+
9
+ from unicex._base import Websocket
10
+
11
+ from .client import Client
12
+
13
+ type CallbackType = Callable[[Any], Awaitable[None]]
14
+
15
+
16
+ class WebsocketManager:
17
+ """Менеджер асинхронных вебсокетов для Gateio."""
18
+
19
+ _SPOT_URL = "wss://api.gateio.ws/ws/v4/"
20
+ """Адрес вебсокета для спотового рынка."""
21
+
22
+ _FUTURES_URL = "wss://fx-ws.gateio.ws/v4/ws/usdt"
23
+ """Адрес вебсокета для фьючерсного рынка."""
24
+
25
+ def __init__(self, client: Client | None = None, **ws_kwargs: Any) -> None:
26
+ """Инициализирует менеджер вебсокетов для Mexc.
27
+
28
+ Параметры:
29
+ client (`Client | None`): Клиент для выполнения запросов. Нужен, чтобы открыть приватные вебсокеты.
30
+ ws_kwargs (`dict[str, Any]`): Дополнительные аргументы, которые прокидываются в `Websocket`.
31
+ """
32
+ self.client = client
33
+ self._ws_kwargs = ws_kwargs
34
+
35
+ def _build_subscription_message(
36
+ self,
37
+ channel: str,
38
+ payload: list,
39
+ event: Literal["subscribe", "unsubscribe"] = "subscribe",
40
+ ) -> str:
41
+ """Формирует JSON сообщение для подписки."""
42
+ return json.dumps(
43
+ {
44
+ "time": int(time.time()),
45
+ "id": int(time.time() * 1e6),
46
+ "channel": channel,
47
+ "event": event,
48
+ "payload": payload,
49
+ }
50
+ )
51
+
52
+ def _create_keepalive_message_callable(
53
+ self,
54
+ type: Literal["ping", "pong"],
55
+ market: Literal["spot", "futures"] = "spot",
56
+ ) -> Callable[[], str]:
57
+ """Функция для генерации ping или pong сообщения в рантайме."""
58
+ return lambda: json.dumps(
59
+ {
60
+ "time": int(time.time()),
61
+ "channel": f"{market}.{type}",
62
+ }
63
+ )
64
+
65
+ def _create_websocket(
66
+ self,
67
+ callback: CallbackType,
68
+ subscription_messages: list[str],
69
+ ) -> Websocket:
70
+ """Шорткат для создания вебсокета."""
71
+ return Websocket(
72
+ callback=callback,
73
+ url=self._SPOT_URL,
74
+ subscription_messages=subscription_messages,
75
+ ping_message=self._create_keepalive_message_callable("ping", "spot"),
76
+ pong_message=self._create_keepalive_message_callable("pong", "spot"),
77
+ **self._ws_kwargs,
78
+ )
79
+
80
+ def _create_futures_websocket(
81
+ self,
82
+ callback: CallbackType,
83
+ subscription_messages: list[str],
84
+ ) -> Websocket:
85
+ """Шорткат для создания фьючерсного вебсокета."""
86
+ return Websocket(
87
+ callback=callback,
88
+ url=self._FUTURES_URL,
89
+ subscription_messages=subscription_messages,
90
+ ping_message=self._create_keepalive_message_callable("ping", "futures"),
91
+ pong_message=self._create_keepalive_message_callable("pong", "futures"),
92
+ **self._ws_kwargs,
93
+ )
94
+
95
+ def tickers(
96
+ self,
97
+ callback: CallbackType,
98
+ symbols: list[str],
99
+ ) -> Websocket:
100
+ """Открывает вебсокет с общений информацией о тикерах.
101
+
102
+ https://www.gate.com/docs/developers/apiv4/ws/en/#tickers-channel.
103
+
104
+
105
+ Параметры:
106
+ callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
107
+ symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
108
+
109
+ Возвращает:
110
+ `Websocket`: Объект для управления вебсокет соединением.
111
+ """
112
+ return self._create_websocket(
113
+ callback, [self._build_subscription_message("spot.tickers", symbols)]
114
+ )
115
+
116
+ def trades(
117
+ self,
118
+ callback: CallbackType,
119
+ symbols: list[str],
120
+ ) -> Websocket:
121
+ """Открывает вебсокет для получения публичных трейдов.
122
+
123
+ https://www.gate.com/docs/developers/apiv4/ws/en/#public-trades-channel
124
+
125
+ Канал `spot.trades` отправляет сообщение при каждом новом трейде (только со стороны тейкера).
126
+
127
+ Параметры:
128
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
129
+ symbols (`list[str]`): Список торговых пар (например, ["BTC_USDT", "ETH_USDT"]).
130
+
131
+ Возвращает:
132
+ `Websocket`: Объект для управления вебсокет-соединением.
133
+ """
134
+ return self._create_websocket(
135
+ callback, [self._build_subscription_message("spot.trades", symbols)]
136
+ )
137
+
138
+ def candlesticks(
139
+ self,
140
+ callback: CallbackType,
141
+ interval: str,
142
+ symbols: list[str],
143
+ ) -> Websocket:
144
+ """Открывает вебсокет для получения данных свечей (candlesticks).
145
+
146
+ https://www.gate.com/docs/developers/apiv4/ws/en/#candlesticks-channel
147
+
148
+ Канал `spot.candlesticks` передаёт информацию о свечах каждые 2 секунды.
149
+
150
+ Параметры:
151
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
152
+ interval (`str`): Интервал свечей (например: "1m", "5m", "1h", "1d").
153
+ symbols (`list[str]`): Список торговых пар (например: ["BTC_USDT", "ETH_USDT"]).
154
+
155
+ Возвращает:
156
+ `Websocket`: Объект для управления вебсокет-соединением.
157
+ """
158
+ payloads = [[interval, symbol] for symbol in symbols]
159
+ subscription_messages = [
160
+ self._build_subscription_message("spot.candlesticks", payload) for payload in payloads
161
+ ]
162
+ return self._create_websocket(callback, subscription_messages)
163
+
164
+ def book_ticker(
165
+ self,
166
+ callback: CallbackType,
167
+ symbols: list[str],
168
+ ) -> Websocket:
169
+ """Открывает вебсокет для получения лучшего бид/аск (best bid / best ask).
170
+
171
+ Документация: Best bid or ask price — канал `spot.book_ticker`.
172
+ Канал обновляется с частотой ~10 мс.
173
+
174
+ Параметры:
175
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
176
+ symbols (`list[str]`): Список торговых пар (например ["BTC_USDT", "ETH_USDT"]).
177
+
178
+ Возвращает:
179
+ `Websocket`: Объект для управления вебсокет-соединением.
180
+ """
181
+ return self._create_websocket(
182
+ callback, [self._build_subscription_message("spot.book_ticker", symbols)]
183
+ )
184
+
185
+ def order_book_update(
186
+ self,
187
+ callback: CallbackType,
188
+ symbols: list[str],
189
+ interval: str = "100ms",
190
+ ) -> Websocket:
191
+ """Открывает вебсокет для получения обновлений стакана (изменения уровней ордербука).
192
+
193
+ https://www.gate.com/docs/developers/apiv4/ws/en/#changed-order-book-levels
194
+
195
+ Канал `spot.order_book_update` передаёт изменения уровней стакана с частотой 20 мс или 100 мс.
196
+
197
+ Параметры:
198
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
199
+ symbols (`list[str]`): Список торговых пар (например: ["BTC_USDT", "ETH_USDT"]).
200
+ interval (`str`): Частота обновлений — "20ms" (глубина 20) или "100ms" (глубина 100). По умолчанию — "100ms".
201
+
202
+ Возвращает:
203
+ `Websocket`: Объект для управления вебсокет-соединением.
204
+ """
205
+ payloads = [[symbol, interval] for symbol in symbols]
206
+ subscription_messages = [
207
+ self._build_subscription_message("spot.order_book_update", payload)
208
+ for payload in payloads
209
+ ]
210
+ return self._create_websocket(callback, subscription_messages)
211
+
212
+ def order_book(
213
+ self,
214
+ callback: CallbackType,
215
+ symbols: list[str],
216
+ level: Literal["5", "10", "20", "50", "100"] = "20",
217
+ interval: Literal["100ms", "1000ms"] = "1000ms",
218
+ ) -> Websocket:
219
+ """Открывает вебсокет для получения снапшота ордербука ограниченного уровня.
220
+
221
+ https://www.gate.com/docs/developers/apiv4/ws/en/#limited-level-full-order-book-snapshot
222
+
223
+ Канал `spot.order_book` передаёт полный снимок стакана (ограниченной глубины)
224
+ с частотой 100 мс или 1000 мс.
225
+
226
+ Параметры:
227
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
228
+ symbols (`list[str]`): Список торговых пар (например ["BTC_USDT", "ETH_USDT"]).
229
+ level (`Literal["5", "10", "20", "50", "100"]`): Глубина стакана. По умолчанию — "20".
230
+ interval (`Literal["100ms", "1000ms"]`): Частота обновлений. По умолчанию — "1000ms".
231
+
232
+ Возвращает:
233
+ `Websocket`: Объект для управления вебсокет-соединением.
234
+ """
235
+ payloads = [[symbol, level, interval] for symbol in symbols]
236
+ subscription_messages = [
237
+ self._build_subscription_message("spot.order_book", payload) for payload in payloads
238
+ ]
239
+ return self._create_websocket(callback, subscription_messages)
240
+
241
+ def order_book_v2(
242
+ self,
243
+ callback: CallbackType,
244
+ symbols: list[str],
245
+ level: Literal["400", "50"] = "400",
246
+ ) -> Websocket:
247
+ """Открывает вебсокет для получения обновлений ордербука V2 по спотовым контрактам.
248
+
249
+ Канал `spot.obu` передаёт изменения ордербука в формате V2.
250
+ Формат подписки для каждого символа: ob.{symbol}.{level}.
251
+ - Level "400": обновления каждые 100 мс
252
+ - Level "50": обновления каждые 20 мс
253
+
254
+ Документация: https://www.gate.com/docs/developers/apiv4/ws/en/#order-book-v2-subscription
255
+
256
+ Параметры:
257
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
258
+ symbols (`list[str]`): Список спотовых торговых пар (например ["BTC_USDT", "ETH_USDT"]).
259
+ level (`Literal["400", "50"]`): Глубина ордербука. По умолчанию — "400".
260
+
261
+ Возвращает:
262
+ `Websocket`: Объект для управления вебсокет-соединением.
263
+ """
264
+ payloads = [f"ob.{symbol}.{level}" for symbol in symbols]
265
+ return self._create_websocket(
266
+ callback, [self._build_subscription_message("spot.obu", payloads)]
267
+ )
268
+
269
+ def futures_tickers(
270
+ self,
271
+ callback: CallbackType,
272
+ symbols: list[str],
273
+ ) -> Websocket:
274
+ """Открывает вебсокет для получения информации по фьючерсным контрактам.
275
+
276
+ Канал `futures.tickers` передаёт данные о:
277
+ - последней цене
278
+ - максимальной/минимальной цене за день
279
+ - дневном объёме
280
+ - изменении цены за 24 часа
281
+
282
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#tickers-api
283
+
284
+ Параметры:
285
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
286
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
287
+
288
+ Возвращает:
289
+ `Websocket`: Объект для управления вебсокет-соединением.
290
+ """
291
+ return self._create_futures_websocket(
292
+ callback, [self._build_subscription_message("futures.tickers", symbols)]
293
+ )
294
+
295
+ def futures_trades(
296
+ self,
297
+ callback: CallbackType,
298
+ symbols: list[str],
299
+ ) -> Websocket:
300
+ """Открывает вебсокет для получения информации о сделках по фьючерсным контрактам.
301
+
302
+ Канал `futures.trades` отправляет сообщение при каждом новом трейде.
303
+ Содержит детали сделки: цену, объём, время и тип сделки.
304
+
305
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#trades-api
306
+
307
+ Параметры:
308
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
309
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
310
+
311
+ Возвращает:
312
+ `Websocket`: Объект для управления вебсокет-соединением.
313
+ """
314
+ return self._create_futures_websocket(
315
+ callback, [self._build_subscription_message("futures.trades", symbols)]
316
+ )
317
+
318
+ def futures_book_ticker(
319
+ self,
320
+ callback: CallbackType,
321
+ symbols: list[str],
322
+ ) -> Websocket:
323
+ """Открывает вебсокет для получения лучшего бид/аск (best bid / best ask) по фьючерсным контрактам.
324
+
325
+ Канал `futures.book_ticker` передаёт обновления лучших цен бид и аск для указанных контрактов.
326
+
327
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#best-ask-bid-subscription
328
+
329
+ Параметры:
330
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
331
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
332
+
333
+ Возвращает:
334
+ `Websocket`: Объект для управления вебсокет-соединением.
335
+ """
336
+ return self._create_futures_websocket(
337
+ callback, [self._build_subscription_message("futures.book_ticker", symbols)]
338
+ )
339
+
340
+ def futures_order_book_update(
341
+ self,
342
+ callback: CallbackType,
343
+ symbols: list[str],
344
+ frequency: Literal["20ms", "100ms"] = "100ms",
345
+ level: Literal["20", "50", "100"] | None = None,
346
+ ) -> Websocket:
347
+ """Открывает вебсокет для получения обновлений ордербука фьючерсных контрактов.
348
+
349
+ Канал `futures.order_book_update` передаёт изменения уровней стакана с заданной частотой.
350
+
351
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#order-book-update-subscription
352
+
353
+ Параметры:
354
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
355
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
356
+ frequency (`Literal["20ms", "100ms"]`): Частота обновлений. По умолчанию — "100ms".
357
+ level (`Literal["20", "50", "100"] | None`): Опциональная глубина ордербука. Только для частоты 20ms разрешено "20".
358
+
359
+ Возвращает:
360
+ `Websocket`: Объект для управления вебсокет-соединением.
361
+ """
362
+ payloads = [
363
+ [symbol, frequency] + ([level] if level is not None else []) for symbol in symbols
364
+ ]
365
+ subscription_messages = [
366
+ self._build_subscription_message("futures.order_book_update", payload)
367
+ for payload in payloads
368
+ ]
369
+ return self._create_futures_websocket(callback, subscription_messages)
370
+
371
+ def futures_order_book_v2(
372
+ self,
373
+ callback: CallbackType,
374
+ symbols: list[str],
375
+ level: Literal["400", "50"] = "400",
376
+ ) -> Websocket:
377
+ """Открывает вебсокет для получения обновлений ордербука V2 по фьючерсным контрактам.
378
+
379
+ Канал `futures.obu` передаёт изменения ордербука в формате V2.
380
+ Формат подписки для каждого символа: ob.{symbol}.{level}.
381
+ - Level "400": обновления каждые 100 мс
382
+ - Level "50": обновления каждые 20 мс
383
+
384
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#order-book-v2-subscription
385
+
386
+ Параметры:
387
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
388
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
389
+ level (`Literal["400", "50"]`): Глубина ордербука. По умолчанию — "400".
390
+
391
+ Возвращает:
392
+ `Websocket`: Объект для управления вебсокет-соединением.
393
+ """
394
+ payloads = [f"ob.{symbol}.{level}" for symbol in symbols]
395
+ return self._create_futures_websocket(
396
+ callback, [self._build_subscription_message("futures.obu", payloads)]
397
+ )
398
+
399
+ def futures_order_book(
400
+ self,
401
+ callback: CallbackType,
402
+ symbols: list[str],
403
+ limit: Literal["100", "50", "20", "10", "5", "1"] = "20",
404
+ interval: Literal["0"] = "0",
405
+ ) -> Websocket:
406
+ """Открывает вебсокет для получения снапшота ордербука фьючерсных контрактов.
407
+
408
+ Канал `futures.order_book` передаёт полный снимок стакана с указанной глубиной и интервалом.
409
+
410
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#legacy-order-book-subscription
411
+
412
+ Параметры:
413
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
414
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
415
+ limit (`Literal["100", "50", "20", "10", "5", "1"]`): Глубина ордербука. По умолчанию — "20".
416
+ interval (`Literal["0"]`): Интервал обновления. По документации всегда "0".
417
+
418
+ Возвращает:
419
+ `Websocket`: Объект для управления вебсокет-соединением.
420
+ """
421
+ payloads = [[symbol, limit, interval] for symbol in symbols]
422
+ subscription_messages = [
423
+ self._build_subscription_message("futures.order_book", payload) for payload in payloads
424
+ ]
425
+ return self._create_futures_websocket(callback, subscription_messages)
426
+
427
+ def futures_candlesticks(
428
+ self,
429
+ callback: CallbackType,
430
+ interval: str,
431
+ symbols: list[str],
432
+ price_type: Literal["index", "mark"] | None = None,
433
+ ) -> Websocket:
434
+ """Открывает вебсокет для получения данных свечей (candlesticks) по фьючерсным контрактам.
435
+
436
+ Канал `futures.candlesticks` передаёт информацию о свечах с указанным интервалом.
437
+ Для подписки на специальные типы цен можно указать `price_type`:
438
+ - "mark_" для mark price
439
+ - "index_" для index price
440
+
441
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#candlesticks-api
442
+
443
+ Параметры:
444
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
445
+ interval (`str`): Интервал свечей, например "10s", "1m", "5m", "1h", "1d".
446
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
447
+ price_type (`Literal["index", "mark"] | None`): Тип цены для свечей. По умолчанию — обычные контракты.
448
+
449
+ Возвращает:
450
+ `Websocket`: Объект для управления вебсокет-соединением.
451
+ """
452
+ if price_type:
453
+ prefix = f"{price_type}_"
454
+ symbols = [f"{prefix}{symbol}" for symbol in symbols]
455
+
456
+ payloads = [[interval, symbol] for symbol in symbols]
457
+ subscription_messages = [
458
+ self._build_subscription_message("futures.candlesticks", payload)
459
+ for payload in payloads
460
+ ]
461
+ return self._create_futures_websocket(callback, subscription_messages)
462
+
463
+ def futures_public_liquidates(
464
+ self,
465
+ callback: CallbackType,
466
+ symbols: list[str],
467
+ ) -> Websocket:
468
+ """Открывает вебсокет для получения информации о ликвидациях по фьючерсным контрактам.
469
+
470
+ Канал `futures.public_liquidates` передаёт данные о ликвидационных ордерах.
471
+ Каждый контракт может присылать до одного сообщения о ликвидации в секунду.
472
+ Для подписки на все контракты можно использовать значение ["!all"] в списке `symbols`.
473
+
474
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#public-liquidates-order-api
475
+
476
+ Параметры:
477
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
478
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]) или ["!all"] для всех контрактов.
479
+
480
+ Возвращает:
481
+ `Websocket`: Объект для управления вебсокет-соединением.
482
+ """
483
+ return self._create_futures_websocket(
484
+ callback, [self._build_subscription_message("futures.public_liquidates", symbols)]
485
+ )
486
+
487
+ def futures_contract_stats(
488
+ self,
489
+ callback: CallbackType,
490
+ interval: str,
491
+ symbols: list[str],
492
+ ) -> Websocket:
493
+ """Открывает вебсокет для получения статистики по фьючерсным контрактам.
494
+
495
+ Канал `futures.contract_stats` передаёт агрегированную статистику по каждому контракту.
496
+ Интервал определяет период агрегирования данных (например, "1m", "5m", "1h", "1d").
497
+
498
+ Документация: https://www.gate.com/docs/developers/futures/ws/en/#contract-stats-api
499
+
500
+ Параметры:
501
+ callback (`CallbackType`): Асинхронная функция для обработки входящих сообщений.
502
+ interval (`str`): Интервал статистики, например "1m", "5m", "1h", "1d".
503
+ symbols (`list[str]`): Список фьючерсных контрактов (например ["BTC_USDT", "ETH_USDT"]).
504
+
505
+ Возвращает:
506
+ `Websocket`: Объект для управления вебсокет-соединением.
507
+ """
508
+ payloads = [[symbol, interval] for symbol in symbols]
509
+ subscription_messages = [
510
+ self._build_subscription_message("futures.contract_stats", payload)
511
+ for payload in payloads
512
+ ]
513
+ return self._create_futures_websocket(callback, subscription_messages)
@@ -0,0 +1,27 @@
1
+ """Пакет, содержащий реализации клиентов и менеджеров для работы с биржей Hyperliquid."""
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
+ """Загружает информацию о бирже Hyperliquid."""
22
+ await ExchangeInfo.load_exchange_info()
23
+
24
+
25
+ async def start_exchange_info(parse_interval_seconds: int = 60 * 60) -> None:
26
+ """Запускает процесс обновления информации о бирже Hyperliquid."""
27
+ await ExchangeInfo.start(parse_interval_seconds)