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
unicex/bybit/client.py ADDED
@@ -0,0 +1,1876 @@
1
+ __all__ = ["Client"]
2
+
3
+ import json
4
+ import time
5
+ from typing import Any, Literal
6
+
7
+ from unicex._base import BaseClient
8
+ from unicex.exceptions import NotAuthorized
9
+ from unicex.types import RequestMethod
10
+ from unicex.utils import dict_to_query_string, filter_params, generate_hmac_sha256_signature
11
+
12
+
13
+ class Client(BaseClient):
14
+ """Клиент для работы с Bybit API."""
15
+
16
+ _BASE_URL: str = "https://api.bybit.com"
17
+ """Базовый URL для REST API Bybit."""
18
+
19
+ _RECV_WINDOW: str = "5000"
20
+ """Стандартный интервал времени для получения ответа от сервера."""
21
+
22
+ def _get_headers(self, timestamp: str, signature: str | None = None) -> dict:
23
+ """Возвращает заголовки для запросов к Bybit API.
24
+
25
+ Параметры:
26
+ timestamp (str): Временная метка запроса в миллисекундах.
27
+ signature (str | None): Подпись запроса, если запрос авторизированый.
28
+ """
29
+ headers = {"Accept": "application/json", "Content-Type": "application/json"}
30
+ if signature:
31
+ headers["X-BAPI-API-KEY"] = self._api_key # type: ignore
32
+ headers["X-BAPI-SIGN-TYPE"] = "2"
33
+ headers["X-BAPI-SIGN"] = signature
34
+ headers["X-BAPI-RECV-WINDOW"] = self._RECV_WINDOW
35
+ headers["X-BAPI-TIMESTAMP"] = timestamp
36
+ return headers
37
+
38
+ def _generate_signature(self, timestamp: str, payload: dict, method: RequestMethod) -> str:
39
+ """Генерация подписи.
40
+
41
+ Источник: https://github.com/bybit-exchange/api-usage-examples/blob/master/V5_demo/api_demo/Encryption_HMAC.py
42
+ """
43
+ # Проверяем наличие апи ключей для подписи запроса
44
+ if not self.is_authorized():
45
+ raise NotAuthorized("Api key and api secret is required to private endpoints")
46
+
47
+ if method == "POST":
48
+ # timestamp+api_key+recv_window+jsonBodyString
49
+ dumped_payload = json.dumps(payload)
50
+ prepared_query_string = timestamp + self._api_key + self._RECV_WINDOW + dumped_payload # type: ignore[attrDefined]
51
+ return generate_hmac_sha256_signature(self._api_secret, prepared_query_string) # type: ignore[attrDefined]
52
+ else:
53
+ # timestamp+api_key+recv_window+queryString
54
+ query_string = dict_to_query_string(payload)
55
+ prepared_query_string = timestamp + self._api_key + self._RECV_WINDOW + query_string # type: ignore[attrDefined]
56
+ return generate_hmac_sha256_signature(self._api_secret, prepared_query_string) # type: ignore[attrDefined]
57
+
58
+ async def _make_request(
59
+ self,
60
+ method: RequestMethod,
61
+ endpoint: str,
62
+ *,
63
+ params: dict[str, Any] | None = None,
64
+ signed: bool = False,
65
+ ) -> Any:
66
+ """Выполняет HTTP-запрос к эндпоинтам Bybit API с поддержкой подписи.
67
+
68
+ Если signed=True, формируется подпись для приватных endpoint'ов.
69
+ Если signed=False, запрос отправляется как обычный публичный, через
70
+ базовый _make_request без обработки подписи.
71
+
72
+ Параметры:
73
+ method (str): HTTP метод запроса ("GET", "POST", "DELETE" и т.д.).
74
+ endpoint (str): URL эндпоинта Bybit API.
75
+ params (dict | None): Параметры запроса. Передаются в body, если запрос типа "POST", иначе в query_params
76
+ signed (bool): Нужно ли подписывать запрос.
77
+
78
+ Возвращает:
79
+ dict: Ответ в формате JSON.
80
+ """
81
+ # Составляем URL для запроса
82
+ url = self._BASE_URL + endpoint
83
+
84
+ # Фильтруем параметры от None значений
85
+ params = filter_params(params) if params else {}
86
+
87
+ # Генерируем временную метку
88
+ timestamp = str(int(time.time() * 1000))
89
+
90
+ # Проверяем нужно ли подписывать запрос
91
+ if not signed:
92
+ headers = self._get_headers(timestamp)
93
+ return await super()._make_request(
94
+ method=method,
95
+ url=url,
96
+ headers=headers,
97
+ params=params,
98
+ )
99
+
100
+ # Формируем payload
101
+ payload = params
102
+
103
+ # Генерируем строку для подписи
104
+ signature = self._generate_signature(timestamp, payload, method)
105
+
106
+ # Генерируем заголовки (вкл. в себя подпись и апи ключ)
107
+ headers = self._get_headers(timestamp, signature)
108
+
109
+ if method == "POST": # Отправляем параметры в тело запроса
110
+ return await super()._make_request(
111
+ method=method,
112
+ url=url,
113
+ data=payload,
114
+ headers=headers,
115
+ )
116
+ else: # Иначе параметры добавляем к query string
117
+ return await super()._make_request(
118
+ method=method,
119
+ url=url,
120
+ params=params,
121
+ headers=headers,
122
+ )
123
+
124
+ async def request(
125
+ self, method: RequestMethod, endpoint: str, params: dict, signed: bool
126
+ ) -> dict:
127
+ """Специальный метод для выполнения запросов на эндпоинты, которые не обернуты в клиенте.
128
+
129
+ Параметры:
130
+ method (RequestMethod): Метод запроса (GET, POST, PUT, DELETE).
131
+ endpoint (str): URL эндпоинта.
132
+ params (dict): Параметры запроса.
133
+ signed (bool): Флаг, указывающий, требуется ли подпись запроса.
134
+
135
+ Возвращает:
136
+ `dict`: Ответ в формате JSON.
137
+ """
138
+ return await self._make_request(
139
+ method=method, endpoint=endpoint, params=params, signed=signed
140
+ )
141
+
142
+ # topic: market
143
+
144
+ async def ping(self) -> dict:
145
+ """Проверка подключения к REST API.
146
+
147
+ https://bybit-exchange.github.io/docs/v5/market/time
148
+ """
149
+ return await self._make_request("GET", "/v5/market/time")
150
+
151
+ async def klines(
152
+ self,
153
+ symbol: str,
154
+ interval: str,
155
+ category: Literal["spot", "linear", "inverse"],
156
+ start: int | None = None,
157
+ end: int | None = None,
158
+ limit: int | None = None,
159
+ ) -> dict:
160
+ """Исторические свечи.
161
+
162
+ https://bybit-exchange.github.io/docs/v5/market/kline
163
+ """
164
+ params = {
165
+ "category": category,
166
+ "symbol": symbol,
167
+ "interval": interval,
168
+ "start": start,
169
+ "end": end,
170
+ "limit": limit,
171
+ }
172
+
173
+ return await self._make_request("GET", "/v5/market/kline", params=params)
174
+
175
+ async def mark_price_klines(
176
+ self,
177
+ symbol: str,
178
+ interval: str,
179
+ category: Literal["linear", "inverse"] | None = None,
180
+ start: int | None = None,
181
+ end: int | None = None,
182
+ limit: int | None = None,
183
+ ) -> dict:
184
+ """Исторические свечи цены маркировки (mark price).
185
+
186
+ https://bybit-exchange.github.io/docs/v5/market/mark-kline
187
+ """
188
+ params = {
189
+ "category": category,
190
+ "symbol": symbol,
191
+ "interval": interval,
192
+ "start": start,
193
+ "end": end,
194
+ "limit": limit,
195
+ }
196
+
197
+ return await self._make_request("GET", "/v5/market/mark-price-kline", params=params)
198
+
199
+ async def index_price_klines(
200
+ self,
201
+ symbol: str,
202
+ interval: str,
203
+ category: Literal["linear", "inverse"] | None = None,
204
+ start: int | None = None,
205
+ end: int | None = None,
206
+ limit: int | None = None,
207
+ ) -> dict:
208
+ """Исторические свечи индекса (index price).
209
+
210
+ https://bybit-exchange.github.io/docs/v5/market/index-kline
211
+ """
212
+ params = {
213
+ "category": category,
214
+ "symbol": symbol,
215
+ "interval": interval,
216
+ "start": start,
217
+ "end": end,
218
+ "limit": limit,
219
+ }
220
+
221
+ return await self._make_request("GET", "/v5/market/index-price-kline", params=params)
222
+
223
+ async def premium_index_price_klines(
224
+ self,
225
+ symbol: str,
226
+ interval: str,
227
+ category: Literal["linear"] | None = None,
228
+ start: int | None = None,
229
+ end: int | None = None,
230
+ limit: int | None = None,
231
+ ) -> dict:
232
+ """Исторические свечи премиального индекса (premium index).
233
+
234
+ https://bybit-exchange.github.io/docs/v5/market/premium-index-kline
235
+ """
236
+ params = {
237
+ "category": category,
238
+ "symbol": symbol,
239
+ "interval": interval,
240
+ "start": start,
241
+ "end": end,
242
+ "limit": limit,
243
+ }
244
+
245
+ return await self._make_request(
246
+ "GET", "/v5/market/premium-index-price-kline", params=params
247
+ )
248
+
249
+ async def instruments_info(
250
+ self,
251
+ category: Literal["spot", "linear", "inverse", "option"],
252
+ symbol: str | None = None,
253
+ status: str | None = None,
254
+ base_coin: str | None = None,
255
+ limit: int | None = None,
256
+ cursor: str | None = None,
257
+ ) -> dict:
258
+ """Информация об инструментах.
259
+
260
+ https://bybit-exchange.github.io/docs/v5/market/instrument
261
+ """
262
+ params = {
263
+ "category": category,
264
+ "symbol": symbol,
265
+ "status": status,
266
+ "baseCoin": base_coin,
267
+ "limit": limit,
268
+ "cursor": cursor,
269
+ }
270
+
271
+ return await self._make_request("GET", "/v5/market/instruments-info", params=params)
272
+
273
+ async def orderbook(
274
+ self,
275
+ category: Literal["spot", "linear", "inverse", "option"],
276
+ symbol: str,
277
+ limit: int | None = None,
278
+ ) -> dict:
279
+ """Книга ордеров (глубина рынка).
280
+
281
+ https://bybit-exchange.github.io/docs/v5/market/orderbook
282
+ """
283
+ params = {
284
+ "category": category,
285
+ "symbol": symbol,
286
+ "limit": limit,
287
+ }
288
+
289
+ return await self._make_request("GET", "/v5/market/orderbook", params=params)
290
+
291
+ async def rpi_orderbook(
292
+ self,
293
+ symbol: str,
294
+ limit: int,
295
+ category: Literal["spot", "linear", "inverse"] | None = None,
296
+ ) -> dict:
297
+ """Книга ордеров RPI.
298
+
299
+ https://bybit-exchange.github.io/docs/v5/market/rpi-orderbook
300
+ """
301
+ params = {
302
+ "category": category,
303
+ "symbol": symbol,
304
+ "limit": limit,
305
+ }
306
+
307
+ return await self._make_request("GET", "/v5/market/rpi_orderbook", params=params)
308
+
309
+ async def tickers(
310
+ self,
311
+ category: Literal["spot", "linear", "inverse", "option"],
312
+ symbol: str | None = None,
313
+ base_coin: str | None = None,
314
+ exp_date: str | None = None,
315
+ ) -> dict:
316
+ """Тикеры (снимок цен и объёмов).
317
+
318
+ https://bybit-exchange.github.io/docs/v5/market/tickers
319
+ """
320
+ params = {
321
+ "category": category,
322
+ "symbol": symbol,
323
+ "baseCoin": base_coin,
324
+ "expDate": exp_date,
325
+ }
326
+
327
+ return await self._make_request("GET", "/v5/market/tickers", params=params)
328
+
329
+ async def funding_rate_history(
330
+ self,
331
+ category: Literal["linear", "inverse"],
332
+ symbol: str,
333
+ start_time: int | None = None,
334
+ end_time: int | None = None,
335
+ limit: int | None = None,
336
+ ) -> dict:
337
+ """История ставок финансирования.
338
+
339
+ https://bybit-exchange.github.io/docs/v5/market/history-fund-rate
340
+ """
341
+ params = {
342
+ "category": category,
343
+ "symbol": symbol,
344
+ "startTime": start_time,
345
+ "endTime": end_time,
346
+ "limit": limit,
347
+ }
348
+
349
+ return await self._make_request("GET", "/v5/market/funding/history", params=params)
350
+
351
+ async def recent_trades(
352
+ self,
353
+ category: Literal["spot", "linear", "inverse", "option"],
354
+ symbol: str | None = None,
355
+ base_coin: str | None = None,
356
+ option_type: str | None = None,
357
+ limit: int | None = None,
358
+ ) -> dict:
359
+ """Недавние публичные сделки.
360
+
361
+ https://bybit-exchange.github.io/docs/v5/market/recent-trade
362
+ """
363
+ params = {
364
+ "category": category,
365
+ "symbol": symbol,
366
+ "baseCoin": base_coin,
367
+ "optionType": option_type,
368
+ "limit": limit,
369
+ }
370
+
371
+ return await self._make_request("GET", "/v5/market/recent-trade", params=params)
372
+
373
+ async def open_interest(
374
+ self,
375
+ category: Literal["linear", "inverse"],
376
+ symbol: str,
377
+ interval_time: str,
378
+ start_time: int | None = None,
379
+ end_time: int | None = None,
380
+ limit: int | None = None,
381
+ cursor: str | None = None,
382
+ ) -> dict:
383
+ """Открытый интерес по символу.
384
+
385
+ https://bybit-exchange.github.io/docs/v5/market/open-interest
386
+ """
387
+ params = {
388
+ "category": category,
389
+ "symbol": symbol,
390
+ "intervalTime": interval_time,
391
+ "startTime": start_time,
392
+ "endTime": end_time,
393
+ "limit": limit,
394
+ "cursor": cursor,
395
+ }
396
+
397
+ return await self._make_request("GET", "/v5/market/open-interest", params=params)
398
+
399
+ async def historical_volatility(
400
+ self,
401
+ category: Literal["option"],
402
+ base_coin: str | None = None,
403
+ quote_coin: str | None = None,
404
+ period: int | None = None,
405
+ start_time: int | None = None,
406
+ end_time: int | None = None,
407
+ ) -> dict:
408
+ """Историческая волатильность (опционы).
409
+
410
+ https://bybit-exchange.github.io/docs/v5/market/iv
411
+ """
412
+ params = {
413
+ "category": category,
414
+ "baseCoin": base_coin,
415
+ "quoteCoin": quote_coin,
416
+ "period": period,
417
+ "startTime": start_time,
418
+ "endTime": end_time,
419
+ }
420
+
421
+ return await self._make_request("GET", "/v5/market/historical-volatility", params=params)
422
+
423
+ async def insurance_pool(
424
+ self,
425
+ coin: str | None = None,
426
+ ) -> dict:
427
+ """Данные страхового пула.
428
+
429
+ https://bybit-exchange.github.io/docs/v5/market/insurance
430
+ """
431
+ params = {
432
+ "coin": coin,
433
+ }
434
+
435
+ return await self._make_request("GET", "/v5/market/insurance", params=params)
436
+
437
+ async def risk_limit(
438
+ self,
439
+ category: Literal["linear", "inverse"],
440
+ symbol: str | None = None,
441
+ cursor: str | None = None,
442
+ ) -> dict:
443
+ """Параметры лимита риска.
444
+
445
+ https://bybit-exchange.github.io/docs/v5/market/risk-limit
446
+ """
447
+ params = {
448
+ "category": category,
449
+ "symbol": symbol,
450
+ "cursor": cursor,
451
+ }
452
+
453
+ return await self._make_request("GET", "/v5/market/risk-limit", params=params)
454
+
455
+ async def delivery_price(
456
+ self,
457
+ category: Literal["linear", "inverse", "option"],
458
+ symbol: str | None = None,
459
+ base_coin: str | None = None,
460
+ settle_coin: str | None = None,
461
+ limit: int | None = None,
462
+ cursor: str | None = None,
463
+ ) -> dict:
464
+ """Цена поставки (delivery price).
465
+
466
+ https://bybit-exchange.github.io/docs/v5/market/delivery-price
467
+ """
468
+ params = {
469
+ "category": category,
470
+ "symbol": symbol,
471
+ "baseCoin": base_coin,
472
+ "settleCoin": settle_coin,
473
+ "limit": limit,
474
+ "cursor": cursor,
475
+ }
476
+
477
+ return await self._make_request("GET", "/v5/market/delivery-price", params=params)
478
+
479
+ async def new_delivery_price(
480
+ self,
481
+ category: Literal["option"],
482
+ base_coin: str,
483
+ settle_coin: str | None = None,
484
+ ) -> dict:
485
+ """Исторические цены поставки (опционы).
486
+
487
+ https://bybit-exchange.github.io/docs/v5/market/new-delivery-price
488
+ """
489
+ params = {
490
+ "category": category,
491
+ "baseCoin": base_coin,
492
+ "settleCoin": settle_coin,
493
+ }
494
+
495
+ return await self._make_request("GET", "/v5/market/new-delivery-price", params=params)
496
+
497
+ async def long_short_ratio(
498
+ self,
499
+ category: Literal["linear", "inverse"],
500
+ symbol: str,
501
+ period: str,
502
+ start_time: int | None = None,
503
+ end_time: int | None = None,
504
+ limit: int | None = None,
505
+ cursor: str | None = None,
506
+ ) -> dict:
507
+ """Лонг/шорт соотношение.
508
+
509
+ https://bybit-exchange.github.io/docs/v5/market/long-short-ratio
510
+ """
511
+ params = {
512
+ "category": category,
513
+ "symbol": symbol,
514
+ "period": period,
515
+ "startTime": start_time,
516
+ "endTime": end_time,
517
+ "limit": limit,
518
+ "cursor": cursor,
519
+ }
520
+
521
+ return await self._make_request("GET", "/v5/market/account-ratio", params=params)
522
+
523
+ async def index_price_components(
524
+ self,
525
+ index_name: str,
526
+ ) -> dict:
527
+ """Компоненты индексной цены.
528
+
529
+ https://bybit-exchange.github.io/docs/v5/market/index-components
530
+ """
531
+ params = {
532
+ "indexName": index_name,
533
+ }
534
+
535
+ return await self._make_request("GET", "/v5/market/index-price-components", params=params)
536
+
537
+ async def order_price_limit(
538
+ self,
539
+ symbol: str,
540
+ category: Literal["spot", "linear", "inverse"] | None = None,
541
+ ) -> dict:
542
+ """Лимиты цен для ордеров.
543
+
544
+ https://bybit-exchange.github.io/docs/v5/market/order-price-limit
545
+ """
546
+ params = {
547
+ "category": category,
548
+ "symbol": symbol,
549
+ }
550
+
551
+ return await self._make_request("GET", "/v5/market/price-limit", params=params)
552
+
553
+ async def adl_alert(
554
+ self,
555
+ symbol: str | None = None,
556
+ ) -> dict:
557
+ """Уведомления ADL и информация страхового пула.
558
+
559
+ https://bybit-exchange.github.io/docs/v5/market/adl-alert
560
+ """
561
+ params = {
562
+ "symbol": symbol,
563
+ }
564
+
565
+ return await self._make_request("GET", "/v5/market/adlAlert", params=params)
566
+
567
+ async def fee_group_info(
568
+ self,
569
+ product_type: Literal["contract"],
570
+ group_id: str | None = None,
571
+ ) -> dict:
572
+ """Структура групп комиссий и ставки.
573
+
574
+ https://bybit-exchange.github.io/docs/v5/market/fee-group-info
575
+ """
576
+ params = {
577
+ "productType": product_type,
578
+ "groupId": group_id,
579
+ }
580
+
581
+ return await self._make_request("GET", "/v5/market/fee-group-info", params=params)
582
+
583
+ # topic: trade
584
+
585
+ async def create_order(
586
+ self,
587
+ category: Literal["linear", "inverse", "spot", "option"],
588
+ symbol: str,
589
+ side: Literal["Buy", "Sell"],
590
+ order_type: Literal["Market", "Limit"],
591
+ qty: str,
592
+ is_leverage: int | None = None,
593
+ market_unit: str | None = None,
594
+ slippage_tolerance_type: str | None = None,
595
+ slippage_tolerance: str | None = None,
596
+ price: str | None = None,
597
+ trigger_direction: int | None = None,
598
+ order_filter: str | None = None,
599
+ trigger_price: str | None = None,
600
+ trigger_by: str | None = None,
601
+ order_iv: str | None = None,
602
+ time_in_force: str | None = None,
603
+ position_idx: int | None = None,
604
+ order_link_id: str | None = None,
605
+ take_profit: str | None = None,
606
+ stop_loss: str | None = None,
607
+ tp_trigger_by: str | None = None,
608
+ sl_trigger_by: str | None = None,
609
+ reduce_only: bool | None = None,
610
+ close_on_trigger: bool | None = None,
611
+ smp_type: str | None = None,
612
+ mmp: bool | None = None,
613
+ tpsl_mode: str | None = None,
614
+ tp_limit_price: str | None = None,
615
+ sl_limit_price: str | None = None,
616
+ tp_order_type: str | None = None,
617
+ sl_order_type: str | None = None,
618
+ ) -> dict:
619
+ """Создание ордера.
620
+
621
+ https://bybit-exchange.github.io/docs/v5/order/create-order
622
+ """
623
+ params = {
624
+ "category": category,
625
+ "symbol": symbol,
626
+ "isLeverage": is_leverage,
627
+ "side": side,
628
+ "orderType": order_type,
629
+ "qty": qty,
630
+ "marketUnit": market_unit,
631
+ "slippageToleranceType": slippage_tolerance_type,
632
+ "slippageTolerance": slippage_tolerance,
633
+ "price": price,
634
+ "triggerDirection": trigger_direction,
635
+ "orderFilter": order_filter,
636
+ "triggerPrice": trigger_price,
637
+ "triggerBy": trigger_by,
638
+ "orderIv": order_iv,
639
+ "timeInForce": time_in_force,
640
+ "positionIdx": position_idx,
641
+ "orderLinkId": order_link_id,
642
+ "takeProfit": take_profit,
643
+ "stopLoss": stop_loss,
644
+ "tpTriggerBy": tp_trigger_by,
645
+ "slTriggerBy": sl_trigger_by,
646
+ "reduceOnly": reduce_only,
647
+ "closeOnTrigger": close_on_trigger,
648
+ "smpType": smp_type,
649
+ "mmp": mmp,
650
+ "tpslMode": tpsl_mode,
651
+ "tpLimitPrice": tp_limit_price,
652
+ "slLimitPrice": sl_limit_price,
653
+ "tpOrderType": tp_order_type,
654
+ "slOrderType": sl_order_type,
655
+ }
656
+
657
+ return await self._make_request("POST", "/v5/order/create", params=params, signed=True)
658
+
659
+ async def amend_order(
660
+ self,
661
+ category: Literal["linear", "inverse", "spot", "option"],
662
+ symbol: str,
663
+ order_id: str | None = None,
664
+ order_link_id: str | None = None,
665
+ order_iv: str | None = None,
666
+ trigger_price: str | None = None,
667
+ qty: str | None = None,
668
+ price: str | None = None,
669
+ tpsl_mode: str | None = None,
670
+ take_profit: str | None = None,
671
+ stop_loss: str | None = None,
672
+ tp_trigger_by: str | None = None,
673
+ sl_trigger_by: str | None = None,
674
+ trigger_by: str | None = None,
675
+ tp_limit_price: str | None = None,
676
+ sl_limit_price: str | None = None,
677
+ ) -> dict:
678
+ """Изменение параметров ордера.
679
+
680
+ https://bybit-exchange.github.io/docs/v5/order/amend-order
681
+ """
682
+ params = {
683
+ "category": category,
684
+ "symbol": symbol,
685
+ "orderId": order_id,
686
+ "orderLinkId": order_link_id,
687
+ "orderIv": order_iv,
688
+ "triggerPrice": trigger_price,
689
+ "qty": qty,
690
+ "price": price,
691
+ "tpslMode": tpsl_mode,
692
+ "takeProfit": take_profit,
693
+ "stopLoss": stop_loss,
694
+ "tpTriggerBy": tp_trigger_by,
695
+ "slTriggerBy": sl_trigger_by,
696
+ "triggerBy": trigger_by,
697
+ "tpLimitPrice": tp_limit_price,
698
+ "slLimitPrice": sl_limit_price,
699
+ }
700
+
701
+ return await self._make_request("POST", "/v5/order/amend", params=params, signed=True)
702
+
703
+ async def cancel_order(
704
+ self,
705
+ category: Literal["linear", "inverse", "spot", "option"],
706
+ symbol: str,
707
+ order_id: str | None = None,
708
+ order_link_id: str | None = None,
709
+ order_filter: str | None = None,
710
+ ) -> dict:
711
+ """Отмена ордера.
712
+
713
+ https://bybit-exchange.github.io/docs/v5/order/cancel-order
714
+ """
715
+ params = {
716
+ "category": category,
717
+ "symbol": symbol,
718
+ "orderId": order_id,
719
+ "orderLinkId": order_link_id,
720
+ "orderFilter": order_filter,
721
+ }
722
+
723
+ return await self._make_request("POST", "/v5/order/cancel", params=params, signed=True)
724
+
725
+ async def open_orders(
726
+ self,
727
+ category: Literal["linear", "inverse", "spot", "option"],
728
+ symbol: str | None = None,
729
+ base_coin: str | None = None,
730
+ settle_coin: str | None = None,
731
+ order_id: str | None = None,
732
+ order_link_id: str | None = None,
733
+ open_only: int | None = None,
734
+ order_filter: str | None = None,
735
+ limit: int | None = None,
736
+ cursor: str | None = None,
737
+ ) -> dict:
738
+ """Открытые и закрытые ордера (реaltime).
739
+
740
+ https://bybit-exchange.github.io/docs/v5/order/open-order
741
+ """
742
+ params = {
743
+ "category": category,
744
+ "symbol": symbol,
745
+ "baseCoin": base_coin,
746
+ "settleCoin": settle_coin,
747
+ "orderId": order_id,
748
+ "orderLinkId": order_link_id,
749
+ "openOnly": open_only,
750
+ "orderFilter": order_filter,
751
+ "limit": limit,
752
+ "cursor": cursor,
753
+ }
754
+
755
+ return await self._make_request("GET", "/v5/order/realtime", params=params, signed=True)
756
+
757
+ async def cancel_all_orders(
758
+ self,
759
+ category: Literal["linear", "inverse", "spot", "option"],
760
+ symbol: str | None = None,
761
+ base_coin: str | None = None,
762
+ settle_coin: str | None = None,
763
+ order_filter: str | None = None,
764
+ stop_order_type: str | None = None,
765
+ ) -> dict:
766
+ """Отмена всех открытых ордеров.
767
+
768
+ https://bybit-exchange.github.io/docs/v5/order/cancel-all
769
+ """
770
+ params = {
771
+ "category": category,
772
+ "symbol": symbol,
773
+ "baseCoin": base_coin,
774
+ "settleCoin": settle_coin,
775
+ "orderFilter": order_filter,
776
+ "stopOrderType": stop_order_type,
777
+ }
778
+
779
+ return await self._make_request("POST", "/v5/order/cancel-all", params=params, signed=True)
780
+
781
+ async def order_history(
782
+ self,
783
+ category: Literal["linear", "inverse", "spot", "option"],
784
+ symbol: str | None = None,
785
+ base_coin: str | None = None,
786
+ settle_coin: str | None = None,
787
+ order_id: str | None = None,
788
+ order_link_id: str | None = None,
789
+ order_filter: str | None = None,
790
+ order_status: str | None = None,
791
+ start_time: int | None = None,
792
+ end_time: int | None = None,
793
+ limit: int | None = None,
794
+ cursor: str | None = None,
795
+ ) -> dict:
796
+ """История ордеров.
797
+
798
+ https://bybit-exchange.github.io/docs/v5/order/order-list
799
+ """
800
+ params = {
801
+ "category": category,
802
+ "symbol": symbol,
803
+ "baseCoin": base_coin,
804
+ "settleCoin": settle_coin,
805
+ "orderId": order_id,
806
+ "orderLinkId": order_link_id,
807
+ "orderFilter": order_filter,
808
+ "orderStatus": order_status,
809
+ "startTime": start_time,
810
+ "endTime": end_time,
811
+ "limit": limit,
812
+ "cursor": cursor,
813
+ }
814
+
815
+ return await self._make_request("GET", "/v5/order/history", params=params, signed=True)
816
+
817
+ async def trade_history(
818
+ self,
819
+ category: Literal["linear", "inverse", "spot", "option"],
820
+ symbol: str | None = None,
821
+ order_id: str | None = None,
822
+ order_link_id: str | None = None,
823
+ base_coin: str | None = None,
824
+ start_time: int | None = None,
825
+ end_time: int | None = None,
826
+ exec_type: str | None = None,
827
+ limit: int | None = None,
828
+ cursor: str | None = None,
829
+ ) -> dict:
830
+ """История сделок (execution list).
831
+
832
+ https://bybit-exchange.github.io/docs/v5/order/execution
833
+ """
834
+ params = {
835
+ "category": category,
836
+ "symbol": symbol,
837
+ "orderId": order_id,
838
+ "orderLinkId": order_link_id,
839
+ "baseCoin": base_coin,
840
+ "startTime": start_time,
841
+ "endTime": end_time,
842
+ "execType": exec_type,
843
+ "limit": limit,
844
+ "cursor": cursor,
845
+ }
846
+
847
+ return await self._make_request("GET", "/v5/execution/list", params=params, signed=True)
848
+
849
+ async def create_orders_batch(
850
+ self,
851
+ category: Literal["linear", "option", "spot", "inverse"],
852
+ request: list[dict[str, Any]],
853
+ ) -> dict:
854
+ """Массовое создание ордеров.
855
+
856
+ https://bybit-exchange.github.io/docs/v5/order/batch-place
857
+ """
858
+ params = {
859
+ "category": category,
860
+ "request": request,
861
+ }
862
+
863
+ return await self._make_request(
864
+ "POST", "/v5/order/create-batch", params=params, signed=True
865
+ )
866
+
867
+ async def amend_orders_batch(
868
+ self,
869
+ category: Literal["linear", "option", "spot", "inverse"],
870
+ request: list[dict[str, Any]],
871
+ ) -> dict:
872
+ """Массовое изменение ордеров.
873
+
874
+ https://bybit-exchange.github.io/docs/v5/order/batch-amend
875
+ """
876
+ params = {
877
+ "category": category,
878
+ "request": request,
879
+ }
880
+
881
+ return await self._make_request("POST", "/v5/order/amend-batch", params=params, signed=True)
882
+
883
+ async def cancel_orders_batch(
884
+ self,
885
+ category: Literal["linear", "option", "spot", "inverse"],
886
+ request: list[dict[str, Any]],
887
+ ) -> dict:
888
+ """Массовая отмена ордеров.
889
+
890
+ https://bybit-exchange.github.io/docs/v5/order/batch-cancel
891
+ """
892
+ params = {
893
+ "category": category,
894
+ "request": request,
895
+ }
896
+
897
+ return await self._make_request(
898
+ "POST", "/v5/order/cancel-batch", params=params, signed=True
899
+ )
900
+
901
+ async def spot_borrow_quota(
902
+ self,
903
+ category: Literal["spot"],
904
+ symbol: str,
905
+ side: str,
906
+ ) -> dict:
907
+ """Доступная квота заимствования (Spot).
908
+
909
+ https://bybit-exchange.github.io/docs/v5/order/spot-borrow-quota
910
+ """
911
+ params = {
912
+ "category": category,
913
+ "symbol": symbol,
914
+ "side": side,
915
+ }
916
+
917
+ return await self._make_request(
918
+ "GET", "/v5/order/spot-borrow-check", params=params, signed=True
919
+ )
920
+
921
+ async def set_disconnect_cancel_all(
922
+ self,
923
+ time_window: int,
924
+ product: Literal["OPTIONS", "DERIVATIVES", "SPOT"] | None = None,
925
+ ) -> dict:
926
+ """Настройка DCP (отмена ордеров при разрыве соединения).
927
+
928
+ https://bybit-exchange.github.io/docs/v5/order/dcp
929
+ """
930
+ params = {
931
+ "product": product,
932
+ "timeWindow": time_window,
933
+ }
934
+
935
+ return await self._make_request(
936
+ "POST", "/v5/order/disconnected-cancel-all", params=params, signed=True
937
+ )
938
+
939
+ async def pre_check_order(
940
+ self,
941
+ category: Literal["linear", "inverse", "option"],
942
+ symbol: str,
943
+ side: str,
944
+ order_type: str,
945
+ qty: str,
946
+ price: str | None = None,
947
+ trigger_direction: int | None = None,
948
+ trigger_price: str | None = None,
949
+ trigger_by: str | None = None,
950
+ order_iv: str | None = None,
951
+ time_in_force: str | None = None,
952
+ position_idx: int | None = None,
953
+ order_link_id: str | None = None,
954
+ take_profit: str | None = None,
955
+ stop_loss: str | None = None,
956
+ tp_trigger_by: str | None = None,
957
+ sl_trigger_by: str | None = None,
958
+ reduce_only: bool | None = None,
959
+ close_on_trigger: bool | None = None,
960
+ smp_type: str | None = None,
961
+ mmp: bool | None = None,
962
+ tpsl_mode: str | None = None,
963
+ tp_limit_price: str | None = None,
964
+ sl_limit_price: str | None = None,
965
+ tp_order_type: str | None = None,
966
+ sl_order_type: str | None = None,
967
+ ) -> dict:
968
+ """Предварительная проверка ордера (IMR/MMR).
969
+
970
+ https://bybit-exchange.github.io/docs/v5/order/pre-check-order
971
+ """
972
+ params = {
973
+ "category": category,
974
+ "symbol": symbol,
975
+ "side": side,
976
+ "orderType": order_type,
977
+ "qty": qty,
978
+ "price": price,
979
+ "triggerDirection": trigger_direction,
980
+ "triggerPrice": trigger_price,
981
+ "triggerBy": trigger_by,
982
+ "orderIv": order_iv,
983
+ "timeInForce": time_in_force,
984
+ "positionIdx": position_idx,
985
+ "orderLinkId": order_link_id,
986
+ "takeProfit": take_profit,
987
+ "stopLoss": stop_loss,
988
+ "tpTriggerBy": tp_trigger_by,
989
+ "slTriggerBy": sl_trigger_by,
990
+ "reduceOnly": reduce_only,
991
+ "closeOnTrigger": close_on_trigger,
992
+ "smpType": smp_type,
993
+ "mmp": mmp,
994
+ "tpslMode": tpsl_mode,
995
+ "tpLimitPrice": tp_limit_price,
996
+ "slLimitPrice": sl_limit_price,
997
+ "tpOrderType": tp_order_type,
998
+ "slOrderType": sl_order_type,
999
+ }
1000
+
1001
+ return await self._make_request("POST", "/v5/order/pre-check", params=params, signed=True)
1002
+
1003
+ # topic: position
1004
+
1005
+ async def position_info(
1006
+ self,
1007
+ category: Literal["linear", "inverse", "option"],
1008
+ symbol: str | None = None,
1009
+ base_coin: str | None = None,
1010
+ settle_coin: str | None = None,
1011
+ limit: int | None = None,
1012
+ cursor: str | None = None,
1013
+ ) -> dict:
1014
+ """Информация по позициям в реальном времени.
1015
+
1016
+ https://bybit-exchange.github.io/docs/v5/position
1017
+ """
1018
+ params = {
1019
+ "category": category,
1020
+ "symbol": symbol,
1021
+ "baseCoin": base_coin,
1022
+ "settleCoin": settle_coin,
1023
+ "limit": limit,
1024
+ "cursor": cursor,
1025
+ }
1026
+
1027
+ return await self._make_request("GET", "/v5/position/list", params=params, signed=True)
1028
+
1029
+ async def set_leverage(
1030
+ self,
1031
+ category: Literal["linear", "inverse"],
1032
+ symbol: str,
1033
+ buy_leverage: str,
1034
+ sell_leverage: str,
1035
+ ) -> dict:
1036
+ """Установка плеча для символа.
1037
+
1038
+ https://bybit-exchange.github.io/docs/v5/position/leverage
1039
+ """
1040
+ params = {
1041
+ "category": category,
1042
+ "symbol": symbol,
1043
+ "buyLeverage": buy_leverage,
1044
+ "sellLeverage": sell_leverage,
1045
+ }
1046
+
1047
+ return await self._make_request(
1048
+ "POST", "/v5/position/set-leverage", params=params, signed=True
1049
+ )
1050
+
1051
+ async def switch_isolated_margin(
1052
+ self,
1053
+ category: Literal["linear", "inverse"],
1054
+ symbol: str,
1055
+ trade_mode: int,
1056
+ buy_leverage: str,
1057
+ sell_leverage: str,
1058
+ ) -> dict:
1059
+ """Переключение кросс/изолированной маржи для символа.
1060
+
1061
+ https://bybit-exchange.github.io/docs/v5/position/cross-isolate
1062
+ """
1063
+ params = {
1064
+ "category": category,
1065
+ "symbol": symbol,
1066
+ "tradeMode": trade_mode,
1067
+ "buyLeverage": buy_leverage,
1068
+ "sellLeverage": sell_leverage,
1069
+ }
1070
+
1071
+ return await self._make_request(
1072
+ "POST", "/v5/position/switch-isolated", params=params, signed=True
1073
+ )
1074
+
1075
+ async def switch_position_mode(
1076
+ self,
1077
+ category: Literal["linear", "inverse"],
1078
+ mode: int,
1079
+ symbol: str | None = None,
1080
+ coin: str | None = None,
1081
+ ) -> dict:
1082
+ """Переключение режима позиций (one-way/hedge).
1083
+
1084
+ https://bybit-exchange.github.io/docs/v5/position/position-mode
1085
+ """
1086
+ params = {
1087
+ "category": category,
1088
+ "symbol": symbol,
1089
+ "coin": coin,
1090
+ "mode": mode,
1091
+ }
1092
+
1093
+ return await self._make_request(
1094
+ "POST", "/v5/position/switch-mode", params=params, signed=True
1095
+ )
1096
+
1097
+ async def set_trading_stop(
1098
+ self,
1099
+ category: Literal["linear", "inverse"],
1100
+ symbol: str,
1101
+ tpsl_mode: str,
1102
+ position_idx: int,
1103
+ take_profit: str | None = None,
1104
+ stop_loss: str | None = None,
1105
+ trailing_stop: str | None = None,
1106
+ tp_trigger_by: str | None = None,
1107
+ sl_trigger_by: str | None = None,
1108
+ active_price: str | None = None,
1109
+ tp_size: str | None = None,
1110
+ sl_size: str | None = None,
1111
+ tp_limit_price: str | None = None,
1112
+ sl_limit_price: str | None = None,
1113
+ tp_order_type: str | None = None,
1114
+ sl_order_type: str | None = None,
1115
+ ) -> dict:
1116
+ """Установка TP/SL/Trailing Stop для позиции.
1117
+
1118
+ https://bybit-exchange.github.io/docs/v5/position/trading-stop
1119
+ """
1120
+ params = {
1121
+ "category": category,
1122
+ "symbol": symbol,
1123
+ "tpslMode": tpsl_mode,
1124
+ "positionIdx": position_idx,
1125
+ "takeProfit": take_profit,
1126
+ "stopLoss": stop_loss,
1127
+ "trailingStop": trailing_stop,
1128
+ "tpTriggerBy": tp_trigger_by,
1129
+ "slTriggerBy": sl_trigger_by,
1130
+ "activePrice": active_price,
1131
+ "tpSize": tp_size,
1132
+ "slSize": sl_size,
1133
+ "tpLimitPrice": tp_limit_price,
1134
+ "slLimitPrice": sl_limit_price,
1135
+ "tpOrderType": tp_order_type,
1136
+ "slOrderType": sl_order_type,
1137
+ }
1138
+
1139
+ return await self._make_request(
1140
+ "POST", "/v5/position/trading-stop", params=params, signed=True
1141
+ )
1142
+
1143
+ async def set_auto_add_margin(
1144
+ self,
1145
+ category: Literal["linear"],
1146
+ symbol: str,
1147
+ auto_add_margin: int,
1148
+ position_idx: int | None = None,
1149
+ ) -> dict:
1150
+ """Включить/выключить авто-добавление маржи (изолированная позиция).
1151
+
1152
+ https://bybit-exchange.github.io/docs/v5/position/auto-add-margin
1153
+ """
1154
+ params = {
1155
+ "category": category,
1156
+ "symbol": symbol,
1157
+ "autoAddMargin": auto_add_margin,
1158
+ "positionIdx": position_idx,
1159
+ }
1160
+
1161
+ return await self._make_request(
1162
+ "POST", "/v5/position/set-auto-add-margin", params=params, signed=True
1163
+ )
1164
+
1165
+ async def add_margin(
1166
+ self,
1167
+ category: Literal["linear", "inverse"],
1168
+ symbol: str,
1169
+ margin: str,
1170
+ position_idx: int | None = None,
1171
+ ) -> dict:
1172
+ """Ручное добавление/уменьшение маржи (изолированная позиция).
1173
+
1174
+ https://bybit-exchange.github.io/docs/v5/position/manual-add-margin
1175
+ """
1176
+ params = {
1177
+ "category": category,
1178
+ "symbol": symbol,
1179
+ "margin": margin,
1180
+ "positionIdx": position_idx,
1181
+ }
1182
+
1183
+ return await self._make_request(
1184
+ "POST", "/v5/position/add-margin", params=params, signed=True
1185
+ )
1186
+
1187
+ async def closed_pnl(
1188
+ self,
1189
+ category: Literal["linear", "inverse", "option"],
1190
+ symbol: str | None = None,
1191
+ start_time: int | None = None,
1192
+ end_time: int | None = None,
1193
+ limit: int | None = None,
1194
+ cursor: str | None = None,
1195
+ ) -> dict:
1196
+ """История закрытой прибыли/убытка (PnL).
1197
+
1198
+ https://bybit-exchange.github.io/docs/v5/position/close-pnl
1199
+ """
1200
+ params = {
1201
+ "category": category,
1202
+ "symbol": symbol,
1203
+ "startTime": start_time,
1204
+ "endTime": end_time,
1205
+ "limit": limit,
1206
+ "cursor": cursor,
1207
+ }
1208
+
1209
+ return await self._make_request(
1210
+ "GET", "/v5/position/closed-pnl", params=params, signed=True
1211
+ )
1212
+
1213
+ async def closed_option_positions(
1214
+ self,
1215
+ category: Literal["option"],
1216
+ symbol: str | None = None,
1217
+ start_time: int | None = None,
1218
+ end_time: int | None = None,
1219
+ limit: int | None = None,
1220
+ cursor: str | None = None,
1221
+ ) -> dict:
1222
+ """Закрытые опционные позиции.
1223
+
1224
+ https://bybit-exchange.github.io/docs/v5/position/close-position
1225
+ """
1226
+ params = {
1227
+ "category": category,
1228
+ "symbol": symbol,
1229
+ "startTime": start_time,
1230
+ "endTime": end_time,
1231
+ "limit": limit,
1232
+ "cursor": cursor,
1233
+ }
1234
+
1235
+ return await self._make_request(
1236
+ "GET", "/v5/position/get-closed-positions", params=params, signed=True
1237
+ )
1238
+
1239
+ async def move_positions(
1240
+ self,
1241
+ from_uid: str,
1242
+ to_uid: str,
1243
+ legs: list[dict[str, Any]],
1244
+ ) -> dict:
1245
+ """Перемещение позиций между учетными записями.
1246
+
1247
+ https://bybit-exchange.github.io/docs/v5/position/move-position
1248
+ """
1249
+ params = {
1250
+ "fromUid": from_uid,
1251
+ "toUid": to_uid,
1252
+ "list": legs,
1253
+ }
1254
+
1255
+ return await self._make_request(
1256
+ "POST", "/v5/position/move-positions", params=params, signed=True
1257
+ )
1258
+
1259
+ async def move_position_history(
1260
+ self,
1261
+ category: Literal["linear", "spot", "option"] | None = None,
1262
+ symbol: str | None = None,
1263
+ start_time: int | None = None,
1264
+ end_time: int | None = None,
1265
+ status: str | None = None,
1266
+ block_trade_id: str | None = None,
1267
+ limit: int | None = None,
1268
+ cursor: str | None = None,
1269
+ ) -> dict:
1270
+ """История перемещения позиций.
1271
+
1272
+ https://bybit-exchange.github.io/docs/v5/position/move-position-history
1273
+ """
1274
+ params = {
1275
+ "category": category,
1276
+ "symbol": symbol,
1277
+ "startTime": start_time,
1278
+ "endTime": end_time,
1279
+ "status": status,
1280
+ "blockTradeId": block_trade_id,
1281
+ "limit": limit,
1282
+ "cursor": cursor,
1283
+ }
1284
+
1285
+ return await self._make_request(
1286
+ "GET", "/v5/position/move-history", params=params, signed=True
1287
+ )
1288
+
1289
+ async def confirm_pending_mmr(
1290
+ self,
1291
+ category: Literal["linear", "inverse"],
1292
+ symbol: str,
1293
+ ) -> dict:
1294
+ """Подтверждение нового уровня риска (MMR) для снятия reduceOnly.
1295
+
1296
+ https://bybit-exchange.github.io/docs/v5/position/confirm-mmr
1297
+ """
1298
+ params = {
1299
+ "category": category,
1300
+ "symbol": symbol,
1301
+ }
1302
+
1303
+ return await self._make_request(
1304
+ "POST", "/v5/position/confirm-pending-mmr", params=params, signed=True
1305
+ )
1306
+
1307
+ async def set_tpsl_mode(
1308
+ self,
1309
+ category: Literal["linear", "inverse"],
1310
+ symbol: str,
1311
+ tp_sl_mode: str,
1312
+ ) -> dict:
1313
+ """Установка режима TP/SL по умолчанию для символа.
1314
+
1315
+ https://bybit-exchange.github.io/docs/v5/position/tpsl-mode
1316
+ """
1317
+ params = {
1318
+ "category": category,
1319
+ "symbol": symbol,
1320
+ "tpSlMode": tp_sl_mode,
1321
+ }
1322
+
1323
+ return await self._make_request(
1324
+ "POST", "/v5/position/set-tpsl-mode", params=params, signed=True
1325
+ )
1326
+
1327
+ async def set_risk_limit(
1328
+ self,
1329
+ category: Literal["linear", "inverse"],
1330
+ symbol: str,
1331
+ risk_id: int,
1332
+ position_idx: int | None = None,
1333
+ ) -> dict:
1334
+ """Установка лимита риска позиции.
1335
+
1336
+ https://bybit-exchange.github.io/docs/v5/position/set-risk-limit
1337
+ """
1338
+ params = {
1339
+ "category": category,
1340
+ "symbol": symbol,
1341
+ "riskId": risk_id,
1342
+ "positionIdx": position_idx,
1343
+ }
1344
+
1345
+ return await self._make_request(
1346
+ "POST", "/v5/position/set-risk-limit", params=params, signed=True
1347
+ )
1348
+
1349
+ # topic: pre-upgrade
1350
+
1351
+ async def pre_upgrade_order_history(
1352
+ self,
1353
+ category: Literal["linear", "inverse", "option", "spot"],
1354
+ symbol: str | None = None,
1355
+ base_coin: str | None = None,
1356
+ order_id: str | None = None,
1357
+ order_link_id: str | None = None,
1358
+ order_filter: str | None = None,
1359
+ order_status: str | None = None,
1360
+ start_time: int | None = None,
1361
+ end_time: int | None = None,
1362
+ limit: int | None = None,
1363
+ cursor: str | None = None,
1364
+ ) -> dict:
1365
+ """История ордеров до апгрейда аккаунта.
1366
+
1367
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/order-list
1368
+ """
1369
+ params = {
1370
+ "category": category,
1371
+ "symbol": symbol,
1372
+ "baseCoin": base_coin,
1373
+ "orderId": order_id,
1374
+ "orderLinkId": order_link_id,
1375
+ "orderFilter": order_filter,
1376
+ "orderStatus": order_status,
1377
+ "startTime": start_time,
1378
+ "endTime": end_time,
1379
+ "limit": limit,
1380
+ "cursor": cursor,
1381
+ }
1382
+
1383
+ return await self._make_request(
1384
+ "GET", "/v5/pre-upgrade/order/history", params=params, signed=True
1385
+ )
1386
+
1387
+ async def pre_upgrade_trade_history(
1388
+ self,
1389
+ category: Literal["linear", "inverse", "option", "spot"],
1390
+ symbol: str | None = None,
1391
+ order_id: str | None = None,
1392
+ order_link_id: str | None = None,
1393
+ base_coin: str | None = None,
1394
+ start_time: int | None = None,
1395
+ end_time: int | None = None,
1396
+ exec_type: str | None = None,
1397
+ limit: int | None = None,
1398
+ cursor: str | None = None,
1399
+ ) -> dict:
1400
+ """История сделок до апгрейда аккаунта.
1401
+
1402
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/execution
1403
+ """
1404
+ params = {
1405
+ "category": category,
1406
+ "symbol": symbol,
1407
+ "orderId": order_id,
1408
+ "orderLinkId": order_link_id,
1409
+ "baseCoin": base_coin,
1410
+ "startTime": start_time,
1411
+ "endTime": end_time,
1412
+ "execType": exec_type,
1413
+ "limit": limit,
1414
+ "cursor": cursor,
1415
+ }
1416
+
1417
+ return await self._make_request(
1418
+ "GET", "/v5/pre-upgrade/execution/list", params=params, signed=True
1419
+ )
1420
+
1421
+ async def pre_upgrade_closed_pnl(
1422
+ self,
1423
+ category: Literal["linear", "inverse"],
1424
+ symbol: str,
1425
+ start_time: int | None = None,
1426
+ end_time: int | None = None,
1427
+ limit: int | None = None,
1428
+ cursor: str | None = None,
1429
+ ) -> dict:
1430
+ """Закрытый PnL до апгрейда аккаунта.
1431
+
1432
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/close-pnl
1433
+ """
1434
+ params = {
1435
+ "category": category,
1436
+ "symbol": symbol,
1437
+ "startTime": start_time,
1438
+ "endTime": end_time,
1439
+ "limit": limit,
1440
+ "cursor": cursor,
1441
+ }
1442
+
1443
+ return await self._make_request(
1444
+ "GET", "/v5/pre-upgrade/position/closed-pnl", params=params, signed=True
1445
+ )
1446
+
1447
+ async def pre_upgrade_transaction_log(
1448
+ self,
1449
+ category: Literal["linear", "option"],
1450
+ base_coin: str | None = None,
1451
+ type: str | None = None, # noqa: A003 - API param name
1452
+ start_time: int | None = None,
1453
+ end_time: int | None = None,
1454
+ limit: int | None = None,
1455
+ cursor: str | None = None,
1456
+ ) -> dict:
1457
+ """Транзакционный лог USDC деривативов до апгрейда аккаунта.
1458
+
1459
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/transaction-log
1460
+ """
1461
+ params = {
1462
+ "category": category,
1463
+ "baseCoin": base_coin,
1464
+ "type": type,
1465
+ "startTime": start_time,
1466
+ "endTime": end_time,
1467
+ "limit": limit,
1468
+ "cursor": cursor,
1469
+ }
1470
+
1471
+ return await self._make_request(
1472
+ "GET", "/v5/pre-upgrade/account/transaction-log", params=params, signed=True
1473
+ )
1474
+
1475
+ async def pre_upgrade_delivery_record(
1476
+ self,
1477
+ category: Literal["option"],
1478
+ symbol: str | None = None,
1479
+ exp_date: str | None = None,
1480
+ limit: int | None = None,
1481
+ cursor: str | None = None,
1482
+ ) -> dict:
1483
+ """Опционные записи поставок до апгрейда аккаунта.
1484
+
1485
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/delivery
1486
+ """
1487
+ params = {
1488
+ "category": category,
1489
+ "symbol": symbol,
1490
+ "expDate": exp_date,
1491
+ "limit": limit,
1492
+ "cursor": cursor,
1493
+ }
1494
+
1495
+ return await self._make_request(
1496
+ "GET", "/v5/pre-upgrade/asset/delivery-record", params=params, signed=True
1497
+ )
1498
+
1499
+ async def pre_upgrade_settlement_record(
1500
+ self,
1501
+ category: Literal["linear"],
1502
+ symbol: str | None = None,
1503
+ limit: int | None = None,
1504
+ cursor: str | None = None,
1505
+ ) -> dict:
1506
+ """Сессионные расчёты USDC Perpetual до апгрейда аккаунта.
1507
+
1508
+ https://bybit-exchange.github.io/docs/v5/pre-upgrade/settlement
1509
+ """
1510
+ params = {
1511
+ "category": category,
1512
+ "symbol": symbol,
1513
+ "limit": limit,
1514
+ "cursor": cursor,
1515
+ }
1516
+
1517
+ return await self._make_request(
1518
+ "GET", "/v5/pre-upgrade/asset/settlement-record", params=params, signed=True
1519
+ )
1520
+
1521
+ # topic: account
1522
+
1523
+ async def wallet_balance(
1524
+ self,
1525
+ account_type: Literal["UNIFIED", "CONTRACT", "SPOT"],
1526
+ coin: str | None = None,
1527
+ ) -> dict:
1528
+ """Баланс кошелька и активы по монетам.
1529
+
1530
+ https://bybit-exchange.github.io/docs/v5/account/wallet-balance
1531
+ """
1532
+ params = {
1533
+ "accountType": account_type,
1534
+ "coin": coin,
1535
+ }
1536
+
1537
+ return await self._make_request(
1538
+ "GET", "/v5/account/wallet-balance", params=params, signed=True
1539
+ )
1540
+
1541
+ async def transferable_amount(
1542
+ self,
1543
+ coin_name: str,
1544
+ ) -> dict:
1545
+ """Доступная к переводу сумма (Unified).
1546
+
1547
+ https://bybit-exchange.github.io/docs/v5/account/unified-trans-amnt
1548
+ """
1549
+ params = {
1550
+ "coinName": coin_name,
1551
+ }
1552
+
1553
+ return await self._make_request("GET", "/v5/account/withdrawal", params=params, signed=True)
1554
+
1555
+ async def upgrade_to_unified_account(self) -> dict:
1556
+ """Апгрейд до Unified аккаунта.
1557
+
1558
+ https://bybit-exchange.github.io/docs/v5/account/upgrade-unified-account
1559
+ """
1560
+ return await self._make_request(
1561
+ "POST", "/v5/account/upgrade-to-uta", params={}, signed=True
1562
+ )
1563
+
1564
+ async def borrow_history(
1565
+ self,
1566
+ currency: str | None = None,
1567
+ start_time: int | None = None,
1568
+ end_time: int | None = None,
1569
+ limit: int | None = None,
1570
+ cursor: str | None = None,
1571
+ ) -> dict:
1572
+ """История заимствований (проценты).
1573
+
1574
+ https://bybit-exchange.github.io/docs/v5/account/borrow-history
1575
+ """
1576
+ params = {
1577
+ "currency": currency,
1578
+ "startTime": start_time,
1579
+ "endTime": end_time,
1580
+ "limit": limit,
1581
+ "cursor": cursor,
1582
+ }
1583
+
1584
+ return await self._make_request(
1585
+ "GET", "/v5/account/borrow-history", params=params, signed=True
1586
+ )
1587
+
1588
+ async def quick_repayment(
1589
+ self,
1590
+ coin: str | None = None,
1591
+ ) -> dict:
1592
+ """Погашение обязательств Unified аккаунта.
1593
+
1594
+ https://bybit-exchange.github.io/docs/v5/account/repay-liability
1595
+ """
1596
+ params = {
1597
+ "coin": coin,
1598
+ }
1599
+
1600
+ return await self._make_request(
1601
+ "POST", "/v5/account/quick-repayment", params=params, signed=True
1602
+ )
1603
+
1604
+ async def set_collateral_coin(
1605
+ self,
1606
+ coin: str,
1607
+ collateral_switch: Literal["ON", "OFF"],
1608
+ ) -> dict:
1609
+ """Настройка монеты как залога.
1610
+
1611
+ https://bybit-exchange.github.io/docs/v5/account/set-collateral
1612
+ """
1613
+ params = {
1614
+ "coin": coin,
1615
+ "collateralSwitch": collateral_switch,
1616
+ }
1617
+
1618
+ return await self._make_request(
1619
+ "POST", "/v5/account/set-collateral-switch", params=params, signed=True
1620
+ )
1621
+
1622
+ async def set_collateral_coin_batch(
1623
+ self,
1624
+ request: list[dict[str, Any]],
1625
+ ) -> dict:
1626
+ """Пакетная настройка монет как залога.
1627
+
1628
+ https://bybit-exchange.github.io/docs/v5/account/batch-set-collateral
1629
+ """
1630
+ params = {
1631
+ "request": request,
1632
+ }
1633
+
1634
+ return await self._make_request(
1635
+ "POST", "/v5/account/set-collateral-switch-batch", params=params, signed=True
1636
+ )
1637
+
1638
+ async def collateral_info(
1639
+ self,
1640
+ currency: str | None = None,
1641
+ ) -> dict:
1642
+ """Информация о залоге (процентные ставки, коэффициенты и пр.).
1643
+
1644
+ https://bybit-exchange.github.io/docs/v5/account/collateral-info
1645
+ """
1646
+ params = {
1647
+ "currency": currency,
1648
+ }
1649
+
1650
+ return await self._make_request(
1651
+ "GET", "/v5/account/collateral-info", params=params, signed=True
1652
+ )
1653
+
1654
+ async def coin_greeks(
1655
+ self,
1656
+ base_coin: str | None = None,
1657
+ ) -> dict:
1658
+ """Текущие греческие параметры аккаунта по базовым монетам.
1659
+
1660
+ https://bybit-exchange.github.io/docs/v5/account/coin-greeks
1661
+ """
1662
+ params = {
1663
+ "baseCoin": base_coin,
1664
+ }
1665
+
1666
+ return await self._make_request("GET", "/v5/asset/coin-greeks", params=params, signed=True)
1667
+
1668
+ async def fee_rate(
1669
+ self,
1670
+ category: Literal["spot", "linear", "inverse", "option"],
1671
+ symbol: str | None = None,
1672
+ base_coin: str | None = None,
1673
+ ) -> dict:
1674
+ """Торговые комиссии аккаунта.
1675
+
1676
+ https://bybit-exchange.github.io/docs/v5/account/fee-rate
1677
+ """
1678
+ params = {
1679
+ "category": category,
1680
+ "symbol": symbol,
1681
+ "baseCoin": base_coin,
1682
+ }
1683
+
1684
+ return await self._make_request("GET", "/v5/account/fee-rate", params=params, signed=True)
1685
+
1686
+ async def account_info(self) -> dict:
1687
+ """Информация об аккаунте (режимы маржи и т.п.).
1688
+
1689
+ https://bybit-exchange.github.io/docs/v5/account/account-info
1690
+ """
1691
+ return await self._make_request("GET", "/v5/account/info", params={}, signed=True)
1692
+
1693
+ async def dcp_info(self) -> dict:
1694
+ """Конфигурация DCP аккаунта.
1695
+
1696
+ https://bybit-exchange.github.io/docs/v5/account/dcp-info
1697
+ """
1698
+ return await self._make_request("GET", "/v5/account/query-dcp-info", params={}, signed=True)
1699
+
1700
+ async def transaction_log(
1701
+ self,
1702
+ account_type: Literal["UNIFIED"] | None = None,
1703
+ category: Literal["spot", "linear", "option", "inverse"] | None = None,
1704
+ currency: str | None = None,
1705
+ base_coin: str | None = None,
1706
+ type: str | None = None, # noqa: A003 - API param name
1707
+ start_time: int | None = None,
1708
+ end_time: int | None = None,
1709
+ limit: int | None = None,
1710
+ cursor: str | None = None,
1711
+ ) -> dict:
1712
+ """Транзакционный лог Unified аккаунта.
1713
+
1714
+ https://bybit-exchange.github.io/docs/v5/account/transaction-log
1715
+ """
1716
+ params = {
1717
+ "accountType": account_type,
1718
+ "category": category,
1719
+ "currency": currency,
1720
+ "baseCoin": base_coin,
1721
+ "type": type,
1722
+ "startTime": start_time,
1723
+ "endTime": end_time,
1724
+ "limit": limit,
1725
+ "cursor": cursor,
1726
+ }
1727
+
1728
+ return await self._make_request(
1729
+ "GET", "/v5/account/transaction-log", params=params, signed=True
1730
+ )
1731
+
1732
+ async def contract_transaction_log(
1733
+ self,
1734
+ currency: str | None = None,
1735
+ base_coin: str | None = None,
1736
+ type: str | None = None, # noqa: A003 - API param name
1737
+ start_time: int | None = None,
1738
+ end_time: int | None = None,
1739
+ limit: int | None = None,
1740
+ cursor: str | None = None,
1741
+ ) -> dict:
1742
+ """Транзакционный лог деривативного кошелька.
1743
+
1744
+ https://bybit-exchange.github.io/docs/v5/account/contract-transaction-log
1745
+ """
1746
+ params = {
1747
+ "currency": currency,
1748
+ "baseCoin": base_coin,
1749
+ "type": type,
1750
+ "startTime": start_time,
1751
+ "endTime": end_time,
1752
+ "limit": limit,
1753
+ "cursor": cursor,
1754
+ }
1755
+
1756
+ return await self._make_request(
1757
+ "GET", "/v5/account/contract-transaction-log", params=params, signed=True
1758
+ )
1759
+
1760
+ async def smp_group(self) -> dict:
1761
+ """Получить SMP group ID.
1762
+
1763
+ https://bybit-exchange.github.io/docs/v5/account/smp-group
1764
+ """
1765
+ return await self._make_request("GET", "/v5/account/smp-group", params={}, signed=True)
1766
+
1767
+ async def set_margin_mode(
1768
+ self,
1769
+ set_margin_mode: Literal["ISOLATED_MARGIN", "REGULAR_MARGIN", "PORTFOLIO_MARGIN"],
1770
+ ) -> dict:
1771
+ """Установить режим маржи аккаунта.
1772
+
1773
+ https://bybit-exchange.github.io/docs/v5/account/set-margin-mode
1774
+ """
1775
+ params = {
1776
+ "setMarginMode": set_margin_mode,
1777
+ }
1778
+
1779
+ return await self._make_request(
1780
+ "POST", "/v5/account/set-margin-mode", params=params, signed=True
1781
+ )
1782
+
1783
+ async def set_spot_hedging(
1784
+ self,
1785
+ set_hedging_mode: Literal["ON", "OFF"],
1786
+ ) -> dict:
1787
+ """Включить/выключить спотовый hedging в Portfolio margin.
1788
+
1789
+ https://bybit-exchange.github.io/docs/v5/account/set-spot-hedge
1790
+ """
1791
+ params = {
1792
+ "setHedgingMode": set_hedging_mode,
1793
+ }
1794
+
1795
+ return await self._make_request(
1796
+ "POST", "/v5/account/set-hedging-mode", params=params, signed=True
1797
+ )
1798
+
1799
+ async def set_limit_price_action(
1800
+ self,
1801
+ category: Literal["linear", "inverse", "spot"],
1802
+ modify_enable: bool,
1803
+ ) -> dict:
1804
+ """Настройка поведения при выходе лимитной цены за границы.
1805
+
1806
+ https://bybit-exchange.github.io/docs/v5/account/set-price-limit
1807
+ """
1808
+ params = {
1809
+ "category": category,
1810
+ "modifyEnable": modify_enable,
1811
+ }
1812
+
1813
+ return await self._make_request(
1814
+ "POST", "/v5/account/set-limit-px-action", params=params, signed=True
1815
+ )
1816
+
1817
+ async def user_setting_config(self) -> dict:
1818
+ """Получить конфигурацию поведения для лимитных цен.
1819
+
1820
+ https://bybit-exchange.github.io/docs/v5/account/get-user-setting-config
1821
+ """
1822
+ return await self._make_request(
1823
+ "GET", "/v5/account/user-setting-config", params={}, signed=True
1824
+ )
1825
+
1826
+ async def set_mmp(
1827
+ self,
1828
+ base_coin: str,
1829
+ window: str,
1830
+ frozen_period: str,
1831
+ qty_limit: str,
1832
+ delta_limit: str,
1833
+ ) -> dict:
1834
+ """Настроить Market Maker Protection (MMP).
1835
+
1836
+ https://bybit-exchange.github.io/docs/v5/account/set-mmp
1837
+ """
1838
+ params = {
1839
+ "baseCoin": base_coin,
1840
+ "window": window,
1841
+ "frozenPeriod": frozen_period,
1842
+ "qtyLimit": qty_limit,
1843
+ "deltaLimit": delta_limit,
1844
+ }
1845
+
1846
+ return await self._make_request(
1847
+ "POST", "/v5/account/mmp-modify", params=params, signed=True
1848
+ )
1849
+
1850
+ async def reset_mmp(
1851
+ self,
1852
+ base_coin: str,
1853
+ ) -> dict:
1854
+ """Сбросить состояние MMP (разморозить).
1855
+
1856
+ https://bybit-exchange.github.io/docs/v5/account/reset-mmp
1857
+ """
1858
+ params = {
1859
+ "baseCoin": base_coin,
1860
+ }
1861
+
1862
+ return await self._make_request("POST", "/v5/account/mmp-reset", params=params, signed=True)
1863
+
1864
+ async def mmp_state(
1865
+ self,
1866
+ base_coin: str,
1867
+ ) -> dict:
1868
+ """Статус MMP.
1869
+
1870
+ https://bybit-exchange.github.io/docs/v5/account/get-mmp-state
1871
+ """
1872
+ params = {
1873
+ "baseCoin": base_coin,
1874
+ }
1875
+
1876
+ return await self._make_request("GET", "/v5/account/mmp-state", params=params, signed=True)