unicex 0.8.1__py3-none-any.whl → 0.10.1__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/_abc/__init__.py +0 -2
- unicex/_base/websocket.py +26 -18
- unicex/bitget/websocket_manager.py +6 -6
- unicex/bybit/websocket_manager.py +10 -10
- unicex/gateio/websocket_manager.py +503 -1
- unicex/hyperliquid/adapter.py +1 -1
- unicex/hyperliquid/websocket_manager.py +353 -1
- unicex/mexc/_spot_ws_proto/PrivateAccountV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PrivateDealsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PrivateOrdersV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicAggreBookTickerV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicAggreDealsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicAggreDepthsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicBookTickerBatchV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicBookTickerV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicDealsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicFuture_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsBatchV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicLimitDepthsV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicMiniTickerV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicMiniTickersV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PublicSpotKlineV3Api_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/PushDataV3ApiWrapper_pb2.py +0 -2
- unicex/mexc/_spot_ws_proto/__init__.py +335 -332
- unicex/mexc/websocket_manager.py +447 -2
- unicex/okx/websocket_manager.py +733 -1
- {unicex-0.8.1.dist-info → unicex-0.10.1.dist-info}/METADATA +5 -5
- {unicex-0.8.1.dist-info → unicex-0.10.1.dist-info}/RECORD +32 -33
- unicex/_abc/decoder.py +0 -18
- {unicex-0.8.1.dist-info → unicex-0.10.1.dist-info}/WHEEL +0 -0
- {unicex-0.8.1.dist-info → unicex-0.10.1.dist-info}/licenses/LICENSE +0 -0
- {unicex-0.8.1.dist-info → unicex-0.10.1.dist-info}/top_level.txt +0 -0
|
@@ -1,11 +1,513 @@
|
|
|
1
1
|
__all__ = ["WebsocketManager"]
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
import json
|
|
5
|
+
import time
|
|
4
6
|
from collections.abc import Awaitable, Callable
|
|
5
|
-
from typing import Any
|
|
7
|
+
from typing import Any, Literal
|
|
8
|
+
|
|
9
|
+
from unicex._base import Websocket
|
|
10
|
+
|
|
11
|
+
from .client import Client
|
|
6
12
|
|
|
7
13
|
type CallbackType = Callable[[Any], Awaitable[None]]
|
|
8
14
|
|
|
9
15
|
|
|
10
16
|
class WebsocketManager:
|
|
11
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)
|
unicex/hyperliquid/adapter.py
CHANGED
|
@@ -78,7 +78,7 @@ class Adapter:
|
|
|
78
78
|
Возвращает:
|
|
79
79
|
dict[str, float]: Словарь тикеров и последних цен.
|
|
80
80
|
"""
|
|
81
|
-
return {k: v for k, v in raw_data.items() if not k.startswith("@")}
|
|
81
|
+
return {k: float(v) for k, v in raw_data.items() if not k.startswith("@")}
|
|
82
82
|
|
|
83
83
|
@staticmethod
|
|
84
84
|
def ticker_24hr(raw_data: list, resolve_symbols: bool) -> TickerDailyDict:
|