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,743 @@
|
|
|
1
|
+
__all__ = ["WebsocketManager"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
from collections.abc import Awaitable, Callable
|
|
6
|
+
from typing import Any, Literal
|
|
7
|
+
|
|
8
|
+
from unicex._base import Websocket
|
|
9
|
+
|
|
10
|
+
from .client import Client
|
|
11
|
+
|
|
12
|
+
type CallbackType = Callable[[Any], Awaitable[None]]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class WebsocketManager:
|
|
16
|
+
"""Менеджер асинхронных вебсокетов для Okx."""
|
|
17
|
+
|
|
18
|
+
_BASE_URL = "wss://ws.okx.com:8443/ws"
|
|
19
|
+
"""Базовый URL вебсокетов на Okx."""
|
|
20
|
+
|
|
21
|
+
_PUBLIC_URL = _BASE_URL + "/v5/public"
|
|
22
|
+
"""Публичный URL вебсокетов на Okx."""
|
|
23
|
+
|
|
24
|
+
_BUSINESS_URL = _BASE_URL + "/v5/business"
|
|
25
|
+
"""Бизнес-URL вебсокетов на Okx. (для топиков trades-all и candle)"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, client: Client | None = None, **ws_kwargs: Any) -> None:
|
|
28
|
+
"""Инициализирует менеджер вебсокетов для OKX.
|
|
29
|
+
|
|
30
|
+
Параметры:
|
|
31
|
+
client (`Client | None`): Клиент для выполнения запросов. Нужен, чтобы открыть приватные вебсокеты.
|
|
32
|
+
ws_kwargs (`dict[str, Any]`): Дополнительные аргументы, которые прокидываются в `Websocket`.
|
|
33
|
+
"""
|
|
34
|
+
self.client = client
|
|
35
|
+
self._ws_kwargs = {"ping_message": "ping", **ws_kwargs}
|
|
36
|
+
|
|
37
|
+
def instruments(
|
|
38
|
+
self,
|
|
39
|
+
callback: CallbackType,
|
|
40
|
+
inst_type: Literal["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"],
|
|
41
|
+
) -> Websocket:
|
|
42
|
+
"""Создает вебсокет для получения изменений в состоянии инструментов.
|
|
43
|
+
|
|
44
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-instruments-channel
|
|
45
|
+
|
|
46
|
+
Параметры:
|
|
47
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
48
|
+
inst_type (`Literal["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]`): Тип инструмента.
|
|
49
|
+
|
|
50
|
+
Возвращает:
|
|
51
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
52
|
+
"""
|
|
53
|
+
subscription_message = json.dumps(
|
|
54
|
+
{
|
|
55
|
+
"op": "subscribe",
|
|
56
|
+
"args": [
|
|
57
|
+
{
|
|
58
|
+
"channel": "instruments",
|
|
59
|
+
"instType": inst_type,
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return Websocket(
|
|
66
|
+
callback=callback,
|
|
67
|
+
url=self._PUBLIC_URL,
|
|
68
|
+
subscription_messages=[subscription_message],
|
|
69
|
+
**self._ws_kwargs,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def open_interest(
|
|
73
|
+
self,
|
|
74
|
+
callback: CallbackType,
|
|
75
|
+
inst_id: str,
|
|
76
|
+
) -> Websocket:
|
|
77
|
+
"""Создает вебсокет для получения данных об открытом интересе.
|
|
78
|
+
|
|
79
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-open-interest-channel
|
|
80
|
+
|
|
81
|
+
Параметры:
|
|
82
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
83
|
+
inst_id (`str`): ID инструмента (например, "LTC-USD-SWAP").
|
|
84
|
+
|
|
85
|
+
Возвращает:
|
|
86
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
87
|
+
"""
|
|
88
|
+
subscription_message = json.dumps(
|
|
89
|
+
{
|
|
90
|
+
"op": "subscribe",
|
|
91
|
+
"args": [
|
|
92
|
+
{
|
|
93
|
+
"channel": "open-interest",
|
|
94
|
+
"instId": inst_id,
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return Websocket(
|
|
101
|
+
callback=callback,
|
|
102
|
+
url=self._PUBLIC_URL,
|
|
103
|
+
subscription_messages=[subscription_message],
|
|
104
|
+
**self._ws_kwargs,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def funding_rate(
|
|
108
|
+
self,
|
|
109
|
+
callback: CallbackType,
|
|
110
|
+
inst_id: str,
|
|
111
|
+
) -> Websocket:
|
|
112
|
+
"""Создает вебсокет для получения данных о ставке финансирования.
|
|
113
|
+
|
|
114
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
|
|
115
|
+
|
|
116
|
+
Параметры:
|
|
117
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
118
|
+
inst_id (`str`): ID инструмента (например, "BTC-USD-SWAP").
|
|
119
|
+
|
|
120
|
+
Возвращает:
|
|
121
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
122
|
+
"""
|
|
123
|
+
subscription_message = json.dumps(
|
|
124
|
+
{
|
|
125
|
+
"op": "subscribe",
|
|
126
|
+
"args": [
|
|
127
|
+
{
|
|
128
|
+
"channel": "funding-rate",
|
|
129
|
+
"instId": inst_id,
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return Websocket(
|
|
136
|
+
callback=callback,
|
|
137
|
+
url=self._PUBLIC_URL,
|
|
138
|
+
subscription_messages=[subscription_message],
|
|
139
|
+
**self._ws_kwargs,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
def price_limit(
|
|
143
|
+
self,
|
|
144
|
+
callback: CallbackType,
|
|
145
|
+
inst_id: str,
|
|
146
|
+
) -> Websocket:
|
|
147
|
+
"""Создает вебсокет для получения максимальной цены покупки и минимальной цены продажи инструментов.
|
|
148
|
+
|
|
149
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-price-limit-channel
|
|
150
|
+
|
|
151
|
+
Параметры:
|
|
152
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
153
|
+
inst_id (`str`): ID инструмента (например, "LTC-USD-190628").
|
|
154
|
+
|
|
155
|
+
Возвращает:
|
|
156
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
157
|
+
"""
|
|
158
|
+
subscription_message = json.dumps(
|
|
159
|
+
{
|
|
160
|
+
"op": "subscribe",
|
|
161
|
+
"args": [
|
|
162
|
+
{
|
|
163
|
+
"channel": "price-limit",
|
|
164
|
+
"instId": inst_id,
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
return Websocket(
|
|
171
|
+
callback=callback,
|
|
172
|
+
url=self._PUBLIC_URL,
|
|
173
|
+
subscription_messages=[subscription_message],
|
|
174
|
+
**self._ws_kwargs,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
def option_summary(
|
|
178
|
+
self,
|
|
179
|
+
callback: CallbackType,
|
|
180
|
+
inst_family: str,
|
|
181
|
+
) -> Websocket:
|
|
182
|
+
"""Создает вебсокет для получения детальной информации о ценах всех OPTION контрактов.
|
|
183
|
+
|
|
184
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-option-summary-channel
|
|
185
|
+
|
|
186
|
+
Параметры:
|
|
187
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
188
|
+
inst_family (`str`): Семейство инструментов (например, "BTC-USD").
|
|
189
|
+
|
|
190
|
+
Возвращает:
|
|
191
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
192
|
+
"""
|
|
193
|
+
subscription_message = json.dumps(
|
|
194
|
+
{
|
|
195
|
+
"op": "subscribe",
|
|
196
|
+
"args": [
|
|
197
|
+
{
|
|
198
|
+
"channel": "opt-summary",
|
|
199
|
+
"instFamily": inst_family,
|
|
200
|
+
}
|
|
201
|
+
],
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
return Websocket(
|
|
206
|
+
callback=callback,
|
|
207
|
+
url=self._PUBLIC_URL,
|
|
208
|
+
subscription_messages=[subscription_message],
|
|
209
|
+
**self._ws_kwargs,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
def estimated_price(
|
|
213
|
+
self,
|
|
214
|
+
callback: CallbackType,
|
|
215
|
+
inst_type: Literal["OPTION", "FUTURES"],
|
|
216
|
+
inst_family: str | None = None,
|
|
217
|
+
inst_id: str | None = None,
|
|
218
|
+
) -> Websocket:
|
|
219
|
+
"""Создает вебсокет для получения расчетной цены поставки/исполнения/расчета для FUTURES и OPTION контрактов.
|
|
220
|
+
|
|
221
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-estimated-delivery-exercise-settlement-price-channel
|
|
222
|
+
|
|
223
|
+
Параметры:
|
|
224
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
225
|
+
inst_type (`Literal["OPTION", "FUTURES"]`): Тип инструмента.
|
|
226
|
+
inst_family (`str | None`): Семейство инструментов (например, "BTC-USD"). Обязателен либо inst_family, либо inst_id.
|
|
227
|
+
inst_id (`str | None`): ID инструмента. Обязателен либо inst_family, либо inst_id.
|
|
228
|
+
|
|
229
|
+
Возвращает:
|
|
230
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
231
|
+
"""
|
|
232
|
+
if not inst_family and not inst_id:
|
|
233
|
+
raise ValueError("Either inst_family or inst_id must be provided")
|
|
234
|
+
if inst_family and inst_id:
|
|
235
|
+
raise ValueError("Only one of inst_family or inst_id should be provided")
|
|
236
|
+
|
|
237
|
+
args: dict[str, str] = {
|
|
238
|
+
"channel": "estimated-price",
|
|
239
|
+
"instType": inst_type,
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if inst_family:
|
|
243
|
+
args["instFamily"] = inst_family
|
|
244
|
+
if inst_id:
|
|
245
|
+
args["instId"] = inst_id
|
|
246
|
+
|
|
247
|
+
subscription_message = json.dumps(
|
|
248
|
+
{
|
|
249
|
+
"op": "subscribe",
|
|
250
|
+
"args": [args],
|
|
251
|
+
}
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
return Websocket(
|
|
255
|
+
callback=callback,
|
|
256
|
+
url=self._PUBLIC_URL,
|
|
257
|
+
subscription_messages=[subscription_message],
|
|
258
|
+
**self._ws_kwargs,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
def mark_price(
|
|
262
|
+
self,
|
|
263
|
+
callback: CallbackType,
|
|
264
|
+
inst_id: str,
|
|
265
|
+
) -> Websocket:
|
|
266
|
+
"""Создает вебсокет для получения маркировочной цены.
|
|
267
|
+
|
|
268
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-channel
|
|
269
|
+
|
|
270
|
+
Параметры:
|
|
271
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
272
|
+
inst_id (`str`): ID инструмента (например, "LTC-USD-190628").
|
|
273
|
+
|
|
274
|
+
Возвращает:
|
|
275
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
276
|
+
"""
|
|
277
|
+
subscription_message = json.dumps(
|
|
278
|
+
{
|
|
279
|
+
"op": "subscribe",
|
|
280
|
+
"args": [
|
|
281
|
+
{
|
|
282
|
+
"channel": "mark-price",
|
|
283
|
+
"instId": inst_id,
|
|
284
|
+
}
|
|
285
|
+
],
|
|
286
|
+
}
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
return Websocket(
|
|
290
|
+
callback=callback,
|
|
291
|
+
url=self._PUBLIC_URL,
|
|
292
|
+
subscription_messages=[subscription_message],
|
|
293
|
+
**self._ws_kwargs,
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
def index_tickers(
|
|
297
|
+
self,
|
|
298
|
+
callback: CallbackType,
|
|
299
|
+
inst_id: str,
|
|
300
|
+
) -> Websocket:
|
|
301
|
+
"""Создает вебсокет для получения данных индексных тикеров.
|
|
302
|
+
|
|
303
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-index-tickers-channel
|
|
304
|
+
|
|
305
|
+
Параметры:
|
|
306
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
307
|
+
inst_id (`str`): Индекс с USD, USDT, BTC, USDC в качестве котируемой валюты (например, "BTC-USDT").
|
|
308
|
+
|
|
309
|
+
Возвращает:
|
|
310
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
311
|
+
"""
|
|
312
|
+
subscription_message = json.dumps(
|
|
313
|
+
{
|
|
314
|
+
"op": "subscribe",
|
|
315
|
+
"args": [
|
|
316
|
+
{
|
|
317
|
+
"channel": "index-tickers",
|
|
318
|
+
"instId": inst_id,
|
|
319
|
+
}
|
|
320
|
+
],
|
|
321
|
+
}
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
return Websocket(
|
|
325
|
+
callback=callback,
|
|
326
|
+
url=self._PUBLIC_URL,
|
|
327
|
+
subscription_messages=[subscription_message],
|
|
328
|
+
**self._ws_kwargs,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
def mark_price_candlesticks(
|
|
332
|
+
self,
|
|
333
|
+
callback: CallbackType,
|
|
334
|
+
interval: Literal[
|
|
335
|
+
"3M",
|
|
336
|
+
"1M",
|
|
337
|
+
"1W",
|
|
338
|
+
"1D",
|
|
339
|
+
"2D",
|
|
340
|
+
"3D",
|
|
341
|
+
"5D",
|
|
342
|
+
"12H",
|
|
343
|
+
"6H",
|
|
344
|
+
"4H",
|
|
345
|
+
"2H",
|
|
346
|
+
"1H",
|
|
347
|
+
"30m",
|
|
348
|
+
"15m",
|
|
349
|
+
"5m",
|
|
350
|
+
"3m",
|
|
351
|
+
"1m",
|
|
352
|
+
"1Yutc",
|
|
353
|
+
"3Mutc",
|
|
354
|
+
"1Mutc",
|
|
355
|
+
"1Wutc",
|
|
356
|
+
"1Dutc",
|
|
357
|
+
"2Dutc",
|
|
358
|
+
"3Dutc",
|
|
359
|
+
"5Dutc",
|
|
360
|
+
"12Hutc",
|
|
361
|
+
"6Hutc",
|
|
362
|
+
],
|
|
363
|
+
inst_id: str,
|
|
364
|
+
) -> Websocket:
|
|
365
|
+
"""Создает вебсокет для получения данных свечей маркировочной цены.
|
|
366
|
+
|
|
367
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-candlesticks-channel
|
|
368
|
+
|
|
369
|
+
Параметры:
|
|
370
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
371
|
+
interval (`Literal`): Интервал свечей.
|
|
372
|
+
inst_id (`str`): ID инструмента (например, "BTC-USD-190628").
|
|
373
|
+
|
|
374
|
+
Возвращает:
|
|
375
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
376
|
+
"""
|
|
377
|
+
channel = f"mark-price-candle{interval}"
|
|
378
|
+
subscription_message = json.dumps(
|
|
379
|
+
{
|
|
380
|
+
"op": "subscribe",
|
|
381
|
+
"args": [
|
|
382
|
+
{
|
|
383
|
+
"channel": channel,
|
|
384
|
+
"instId": inst_id,
|
|
385
|
+
}
|
|
386
|
+
],
|
|
387
|
+
}
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
return Websocket(
|
|
391
|
+
callback=callback,
|
|
392
|
+
url=self._BUSINESS_URL,
|
|
393
|
+
subscription_messages=[subscription_message],
|
|
394
|
+
**self._ws_kwargs,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
def index_candlesticks(
|
|
398
|
+
self,
|
|
399
|
+
callback: CallbackType,
|
|
400
|
+
interval: Literal[
|
|
401
|
+
"3M",
|
|
402
|
+
"1M",
|
|
403
|
+
"1W",
|
|
404
|
+
"1D",
|
|
405
|
+
"2D",
|
|
406
|
+
"3D",
|
|
407
|
+
"5D",
|
|
408
|
+
"12H",
|
|
409
|
+
"6H",
|
|
410
|
+
"4H",
|
|
411
|
+
"2H",
|
|
412
|
+
"1H",
|
|
413
|
+
"30m",
|
|
414
|
+
"15m",
|
|
415
|
+
"5m",
|
|
416
|
+
"3m",
|
|
417
|
+
"1m",
|
|
418
|
+
"3Mutc",
|
|
419
|
+
"1Mutc",
|
|
420
|
+
"1Wutc",
|
|
421
|
+
"1Dutc",
|
|
422
|
+
"2Dutc",
|
|
423
|
+
"3Dutc",
|
|
424
|
+
"5Dutc",
|
|
425
|
+
"12Hutc",
|
|
426
|
+
"6Hutc",
|
|
427
|
+
],
|
|
428
|
+
inst_id: str,
|
|
429
|
+
) -> Websocket:
|
|
430
|
+
"""Создает вебсокет для получения данных свечей индекса.
|
|
431
|
+
|
|
432
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-index-candlesticks-channel
|
|
433
|
+
|
|
434
|
+
Параметры:
|
|
435
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
436
|
+
interval (`Literal`): Интервал свечей.
|
|
437
|
+
inst_id (`str`): Индекс (например, "BTC-USD").
|
|
438
|
+
|
|
439
|
+
Возвращает:
|
|
440
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
441
|
+
"""
|
|
442
|
+
channel = f"index-candle{interval}"
|
|
443
|
+
subscription_message = json.dumps(
|
|
444
|
+
{
|
|
445
|
+
"op": "subscribe",
|
|
446
|
+
"args": [
|
|
447
|
+
{
|
|
448
|
+
"channel": channel,
|
|
449
|
+
"instId": inst_id,
|
|
450
|
+
}
|
|
451
|
+
],
|
|
452
|
+
}
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
return Websocket(
|
|
456
|
+
callback=callback,
|
|
457
|
+
url=self._BUSINESS_URL,
|
|
458
|
+
subscription_messages=[subscription_message],
|
|
459
|
+
**self._ws_kwargs,
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
def liquidation_orders(
|
|
463
|
+
self,
|
|
464
|
+
callback: CallbackType,
|
|
465
|
+
inst_type: Literal["SWAP", "FUTURES", "MARGIN", "OPTION"],
|
|
466
|
+
) -> Websocket:
|
|
467
|
+
"""Создает вебсокет для получения недавних ордеров ликвидации.
|
|
468
|
+
|
|
469
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-liquidation-orders-channel
|
|
470
|
+
|
|
471
|
+
Параметры:
|
|
472
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
473
|
+
inst_type (`Literal["SWAP", "FUTURES", "MARGIN", "OPTION"]`): Тип инструмента.
|
|
474
|
+
|
|
475
|
+
Возвращает:
|
|
476
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
477
|
+
"""
|
|
478
|
+
subscription_message = json.dumps(
|
|
479
|
+
{
|
|
480
|
+
"op": "subscribe",
|
|
481
|
+
"args": [
|
|
482
|
+
{
|
|
483
|
+
"channel": "liquidation-orders",
|
|
484
|
+
"instType": inst_type,
|
|
485
|
+
}
|
|
486
|
+
],
|
|
487
|
+
}
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
return Websocket(
|
|
491
|
+
callback=callback,
|
|
492
|
+
url=self._PUBLIC_URL,
|
|
493
|
+
subscription_messages=[subscription_message],
|
|
494
|
+
**self._ws_kwargs,
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
def adl_warning(
|
|
498
|
+
self,
|
|
499
|
+
callback: CallbackType,
|
|
500
|
+
inst_type: Literal["SWAP", "FUTURES", "OPTION"],
|
|
501
|
+
inst_family: str | None = None,
|
|
502
|
+
) -> Websocket:
|
|
503
|
+
"""Создает вебсокет для получения предупреждений об авто-делевередже.
|
|
504
|
+
|
|
505
|
+
https://www.okx.com/docs-v5/en/#public-data-websocket-adl-warning-channel
|
|
506
|
+
|
|
507
|
+
Параметры:
|
|
508
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
509
|
+
inst_type (`Literal["SWAP", "FUTURES", "OPTION"]`): Тип инструмента.
|
|
510
|
+
inst_family (`str | None`): Семейство инструментов (например, "BTC-USDT").
|
|
511
|
+
|
|
512
|
+
Возвращает:
|
|
513
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
514
|
+
"""
|
|
515
|
+
args: dict[str, str] = {
|
|
516
|
+
"channel": "adl-warning",
|
|
517
|
+
"instType": inst_type,
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
if inst_family:
|
|
521
|
+
args["instFamily"] = inst_family
|
|
522
|
+
|
|
523
|
+
subscription_message = json.dumps(
|
|
524
|
+
{
|
|
525
|
+
"op": "subscribe",
|
|
526
|
+
"args": [args],
|
|
527
|
+
}
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
return Websocket(
|
|
531
|
+
callback=callback,
|
|
532
|
+
url=self._PUBLIC_URL,
|
|
533
|
+
subscription_messages=[subscription_message],
|
|
534
|
+
**self._ws_kwargs,
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
def tickers(
|
|
538
|
+
self,
|
|
539
|
+
callback: CallbackType,
|
|
540
|
+
inst_id: str,
|
|
541
|
+
) -> Websocket:
|
|
542
|
+
"""Создает вебсокет для получения последней цены сделки, цены bid, цены ask и 24-часового объема торгов.
|
|
543
|
+
|
|
544
|
+
https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
545
|
+
|
|
546
|
+
Параметры:
|
|
547
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
548
|
+
inst_id (`str`): ID инструмента (например, "BTC-USDT").
|
|
549
|
+
|
|
550
|
+
Возвращает:
|
|
551
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
552
|
+
"""
|
|
553
|
+
subscription_message = json.dumps(
|
|
554
|
+
{
|
|
555
|
+
"op": "subscribe",
|
|
556
|
+
"args": [
|
|
557
|
+
{
|
|
558
|
+
"channel": "tickers",
|
|
559
|
+
"instId": inst_id,
|
|
560
|
+
}
|
|
561
|
+
],
|
|
562
|
+
}
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
return Websocket(
|
|
566
|
+
callback=callback,
|
|
567
|
+
url=self._PUBLIC_URL,
|
|
568
|
+
subscription_messages=[subscription_message],
|
|
569
|
+
**self._ws_kwargs,
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
def candlesticks(
|
|
573
|
+
self,
|
|
574
|
+
callback: CallbackType,
|
|
575
|
+
interval: Literal[
|
|
576
|
+
"3M",
|
|
577
|
+
"1M",
|
|
578
|
+
"1W",
|
|
579
|
+
"1D",
|
|
580
|
+
"2D",
|
|
581
|
+
"3D",
|
|
582
|
+
"5D",
|
|
583
|
+
"12H",
|
|
584
|
+
"6H",
|
|
585
|
+
"4H",
|
|
586
|
+
"2H",
|
|
587
|
+
"1H",
|
|
588
|
+
"30m",
|
|
589
|
+
"15m",
|
|
590
|
+
"5m",
|
|
591
|
+
"3m",
|
|
592
|
+
"1m",
|
|
593
|
+
"1s",
|
|
594
|
+
"3Mutc",
|
|
595
|
+
"1Mutc",
|
|
596
|
+
"1Wutc",
|
|
597
|
+
"1Dutc",
|
|
598
|
+
"2Dutc",
|
|
599
|
+
"3Dutc",
|
|
600
|
+
"5Dutc",
|
|
601
|
+
"12Hutc",
|
|
602
|
+
"6Hutc",
|
|
603
|
+
],
|
|
604
|
+
inst_id: str,
|
|
605
|
+
) -> Websocket:
|
|
606
|
+
"""Создает вебсокет для получения данных свечей инструмента.
|
|
607
|
+
|
|
608
|
+
https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-candlesticks-channel
|
|
609
|
+
|
|
610
|
+
Параметры:
|
|
611
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
612
|
+
interval (`Literal`): Интервал свечей.
|
|
613
|
+
inst_id (`str`): ID инструмента (например, "BTC-USDT").
|
|
614
|
+
|
|
615
|
+
Возвращает:
|
|
616
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
617
|
+
"""
|
|
618
|
+
channel = f"candle{interval}"
|
|
619
|
+
subscription_message = json.dumps(
|
|
620
|
+
{
|
|
621
|
+
"op": "subscribe",
|
|
622
|
+
"args": [
|
|
623
|
+
{
|
|
624
|
+
"channel": channel,
|
|
625
|
+
"instId": inst_id,
|
|
626
|
+
}
|
|
627
|
+
],
|
|
628
|
+
}
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
return Websocket(
|
|
632
|
+
callback=callback,
|
|
633
|
+
url=self._BUSINESS_URL,
|
|
634
|
+
subscription_messages=[subscription_message],
|
|
635
|
+
**self._ws_kwargs,
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
def trades(
|
|
639
|
+
self,
|
|
640
|
+
callback: CallbackType,
|
|
641
|
+
inst_id: str,
|
|
642
|
+
) -> Websocket:
|
|
643
|
+
"""Создает вебсокет для получения данных о последних сделках.
|
|
644
|
+
|
|
645
|
+
https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-trades-channel
|
|
646
|
+
|
|
647
|
+
Параметры:
|
|
648
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
649
|
+
inst_id (`str`): ID инструмента (например, "BTC-USDT").
|
|
650
|
+
|
|
651
|
+
Возвращает:
|
|
652
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
653
|
+
"""
|
|
654
|
+
subscription_message = json.dumps(
|
|
655
|
+
{
|
|
656
|
+
"op": "subscribe",
|
|
657
|
+
"args": [
|
|
658
|
+
{
|
|
659
|
+
"channel": "trades",
|
|
660
|
+
"instId": inst_id,
|
|
661
|
+
}
|
|
662
|
+
],
|
|
663
|
+
}
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
return Websocket(
|
|
667
|
+
callback=callback,
|
|
668
|
+
url=self._PUBLIC_URL,
|
|
669
|
+
subscription_messages=[subscription_message],
|
|
670
|
+
**self._ws_kwargs,
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
def all_trades(
|
|
674
|
+
self,
|
|
675
|
+
callback: CallbackType,
|
|
676
|
+
inst_id: str,
|
|
677
|
+
) -> Websocket:
|
|
678
|
+
"""Создает вебсокет для получения данных о всех сделках (по одной сделке на обновление).
|
|
679
|
+
|
|
680
|
+
https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-all-trades-channel
|
|
681
|
+
|
|
682
|
+
Параметры:
|
|
683
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
684
|
+
inst_id (`str`): ID инструмента (например, "BTC-USDT").
|
|
685
|
+
|
|
686
|
+
Возвращает:
|
|
687
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
688
|
+
"""
|
|
689
|
+
subscription_message = json.dumps(
|
|
690
|
+
{
|
|
691
|
+
"op": "subscribe",
|
|
692
|
+
"args": [
|
|
693
|
+
{
|
|
694
|
+
"channel": "trades-all",
|
|
695
|
+
"instId": inst_id,
|
|
696
|
+
}
|
|
697
|
+
],
|
|
698
|
+
}
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
return Websocket(
|
|
702
|
+
callback=callback,
|
|
703
|
+
url=self._BUSINESS_URL,
|
|
704
|
+
subscription_messages=[subscription_message],
|
|
705
|
+
**self._ws_kwargs,
|
|
706
|
+
)
|
|
707
|
+
|
|
708
|
+
def order_book(
|
|
709
|
+
self,
|
|
710
|
+
callback: CallbackType,
|
|
711
|
+
channel: Literal["books", "books5", "bbo-tbt", "books50-l2-tbt", "books-l2-tbt"],
|
|
712
|
+
inst_id: str,
|
|
713
|
+
) -> Websocket:
|
|
714
|
+
"""Создает вебсокет для получения данных ордербука.
|
|
715
|
+
|
|
716
|
+
https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
|
|
717
|
+
|
|
718
|
+
Параметры:
|
|
719
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
720
|
+
channel (`Literal["books", "books5", "bbo-tbt", "books50-l2-tbt", "books-l2-tbt"]`): Тип канала ордербука.
|
|
721
|
+
inst_id (`str`): ID инструмента (например, "BTC-USDT").
|
|
722
|
+
|
|
723
|
+
Возвращает:
|
|
724
|
+
`Websocket`: Объект для управления вебсокет соединением.
|
|
725
|
+
"""
|
|
726
|
+
subscription_message = json.dumps(
|
|
727
|
+
{
|
|
728
|
+
"op": "subscribe",
|
|
729
|
+
"args": [
|
|
730
|
+
{
|
|
731
|
+
"channel": channel,
|
|
732
|
+
"instId": inst_id,
|
|
733
|
+
}
|
|
734
|
+
],
|
|
735
|
+
}
|
|
736
|
+
)
|
|
737
|
+
|
|
738
|
+
return Websocket(
|
|
739
|
+
callback=callback,
|
|
740
|
+
url=self._PUBLIC_URL,
|
|
741
|
+
subscription_messages=[subscription_message],
|
|
742
|
+
**self._ws_kwargs,
|
|
743
|
+
)
|