unicex 0.14.8__py3-none-any.whl → 0.15.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/bingx/client.py ADDED
@@ -0,0 +1,521 @@
1
+ __all__ = ["Client"]
2
+
3
+
4
+ from typing import Any
5
+
6
+ from unicex._base import BaseClient
7
+ from unicex.types import RequestMethod
8
+ from unicex.utils import filter_params, get_timestamp
9
+
10
+
11
+ class Client(BaseClient):
12
+ """Клиент для работы с BingX API."""
13
+
14
+ _BASE_URL: str = "https://open-api.bingx.com"
15
+ """Базовый URL для REST API BingX."""
16
+
17
+ async def _make_request(
18
+ self,
19
+ method: RequestMethod,
20
+ endpoint: str,
21
+ *,
22
+ params: dict[str, Any] | None = None,
23
+ ) -> dict[str, Any]:
24
+ """Выполняет HTTP-запрос к эндпоинтам BingX API.
25
+
26
+ Параметры:
27
+ method (str): HTTP метод запроса ("GET", "POST", "DELETE" и т.д.).
28
+ endpoint (str): URL эндпоинта Kucoin API.
29
+ params (dict | None): Параметры запроса.
30
+
31
+ Возвращает:
32
+ dict: Ответ в формате JSON.
33
+ """
34
+ # Составляем URL для запроса
35
+ url = self._BASE_URL + endpoint
36
+
37
+ # Добавляем timestap в параметры, если он не указан
38
+ if params and "timestamp" in params and not params["timestamp"]:
39
+ params["timestamp"] = get_timestamp()
40
+
41
+ # Фильтруем параметры от None значений
42
+ params = filter_params(params) if params else {}
43
+
44
+ # Выполняем запрос
45
+ return await super()._make_request(
46
+ method=method,
47
+ url=url,
48
+ params=params,
49
+ )
50
+
51
+ async def futures_contracts(
52
+ self,
53
+ symbol: str | None = None,
54
+ timestamp: int | None = None,
55
+ recv_window: int | None = None,
56
+ ) -> dict[str, Any]:
57
+ """Получение списка USDT-M бессрочных фьючерсных контрактов.
58
+
59
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/USDT-M%20Perp%20Futures%20symbols
60
+ """
61
+ params = {
62
+ "symbol": symbol,
63
+ "timestamp": timestamp,
64
+ "recvWindow": recv_window,
65
+ }
66
+
67
+ return await self._make_request("GET", "/openApi/swap/v2/quote/contracts", params=params)
68
+
69
+ async def futures_order_book(
70
+ self,
71
+ symbol: str,
72
+ limit: int | None = None,
73
+ timestamp: int | None = None,
74
+ recv_window: int | None = None,
75
+ ) -> dict[str, Any]:
76
+ """Получение стакана ордеров.
77
+
78
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Order%20Book
79
+ """
80
+ params = {
81
+ "symbol": symbol,
82
+ "limit": limit,
83
+ "timestamp": timestamp,
84
+ "recvWindow": recv_window,
85
+ }
86
+
87
+ return await self._make_request("GET", "/openApi/swap/v2/quote/depth", params=params)
88
+
89
+ async def futures_trades(
90
+ self,
91
+ symbol: str,
92
+ limit: int | None = None,
93
+ timestamp: int | None = None,
94
+ recv_window: int | None = None,
95
+ ) -> dict[str, Any]:
96
+ """Получение списка последних сделок.
97
+
98
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Recent%20Trades%20List
99
+ """
100
+ params = {
101
+ "symbol": symbol,
102
+ "limit": limit,
103
+ "timestamp": timestamp,
104
+ "recvWindow": recv_window,
105
+ }
106
+
107
+ return await self._make_request("GET", "/openApi/swap/v2/quote/trades", params=params)
108
+
109
+ async def futures_mark_price(
110
+ self,
111
+ symbol: str | None = None,
112
+ timestamp: int | None = None,
113
+ recv_window: int | None = None,
114
+ ) -> dict[str, Any]:
115
+ """Получение цены маркировки и ставки финансирования.
116
+
117
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Mark%20Price%20and%20Funding%20Rate
118
+ """
119
+ params = {
120
+ "symbol": symbol,
121
+ "timestamp": timestamp,
122
+ "recvWindow": recv_window,
123
+ }
124
+
125
+ return await self._make_request("GET", "/openApi/swap/v2/quote/premiumIndex", params=params)
126
+
127
+ async def futures_funding_rate_history(
128
+ self,
129
+ symbol: str | None = None,
130
+ start_time: int | None = None,
131
+ end_time: int | None = None,
132
+ limit: int | None = None,
133
+ timestamp: int | None = None,
134
+ recv_window: int | None = None,
135
+ ) -> dict[str, Any]:
136
+ """Получение истории ставок финансирования.
137
+
138
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Get%20Funding%20Rate%20History
139
+ """
140
+ params = {
141
+ "symbol": symbol,
142
+ "startTime": start_time,
143
+ "endTime": end_time,
144
+ "limit": limit,
145
+ "timestamp": timestamp,
146
+ "recvWindow": recv_window,
147
+ }
148
+
149
+ return await self._make_request("GET", "/openApi/swap/v2/quote/fundingRate", params=params)
150
+
151
+ async def futures_klines(
152
+ self,
153
+ symbol: str,
154
+ interval: str,
155
+ start_time: int | None = None,
156
+ end_time: int | None = None,
157
+ limit: int | None = None,
158
+ timestamp: int | None = None,
159
+ recv_window: int | None = None,
160
+ ) -> dict[str, Any]:
161
+ """Получение свечей.
162
+
163
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Kline%2FCandlestick%20Data
164
+ """
165
+ params = {
166
+ "symbol": symbol,
167
+ "interval": interval,
168
+ "startTime": start_time,
169
+ "endTime": end_time,
170
+ "limit": limit,
171
+ "timestamp": timestamp,
172
+ "recvWindow": recv_window,
173
+ }
174
+
175
+ return await self._make_request("GET", "/openApi/swap/v3/quote/klines", params=params)
176
+
177
+ async def open_interest(
178
+ self,
179
+ symbol: str,
180
+ timestamp: int | None = None,
181
+ recv_window: int | None = None,
182
+ ) -> dict[str, Any]:
183
+ """Получение статистики открытого интереса.
184
+
185
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Open%20Interest%20Statistics
186
+ """
187
+ params = {
188
+ "symbol": symbol,
189
+ "timestamp": timestamp,
190
+ "recvWindow": recv_window,
191
+ }
192
+
193
+ return await self._make_request("GET", "/openApi/swap/v2/quote/openInterest", params=params)
194
+
195
+ async def futures_ticker_24hr(
196
+ self,
197
+ symbol: str | None = None,
198
+ timestamp: int | None = None,
199
+ recv_window: int | None = None,
200
+ ) -> dict[str, Any]:
201
+ """Получение 24-часовой статистики тикера.
202
+
203
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/24hr%20Ticker%20Price%20Change%20Statistics
204
+ """
205
+ params = {
206
+ "symbol": symbol,
207
+ "timestamp": timestamp,
208
+ "recvWindow": recv_window,
209
+ }
210
+
211
+ return await self._make_request("GET", "/openApi/swap/v2/quote/ticker", params=params)
212
+
213
+ async def futures_historical_trades(
214
+ self,
215
+ symbol: str | None = None,
216
+ from_id: int | None = None,
217
+ limit: int | None = None,
218
+ timestamp: int | None = None,
219
+ recv_window: int | None = None,
220
+ ) -> dict[str, Any]:
221
+ """Получение исторических сделок.
222
+
223
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Query%20historical%20transaction%20orders
224
+ """
225
+ params = {
226
+ "fromId": from_id,
227
+ "symbol": symbol,
228
+ "limit": limit,
229
+ "timestamp": timestamp,
230
+ "recvWindow": recv_window,
231
+ }
232
+
233
+ return await self._make_request(
234
+ "GET",
235
+ "/openApi/swap/v1/market/historicalTrades",
236
+ params=params,
237
+ )
238
+
239
+ async def futures_book_ticker(
240
+ self,
241
+ symbol: str,
242
+ timestamp: int | None = None,
243
+ recv_window: int | None = None,
244
+ ) -> dict[str, Any]:
245
+ """Получение лучшего бид/аск по символу.
246
+
247
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Symbol%20Order%20Book%20Ticker
248
+ """
249
+ params = {
250
+ "symbol": symbol,
251
+ "timestamp": timestamp,
252
+ "recvWindow": recv_window,
253
+ }
254
+
255
+ return await self._make_request("GET", "/openApi/swap/v2/quote/bookTicker", params=params)
256
+
257
+ async def futures_mark_price_klines(
258
+ self,
259
+ symbol: str,
260
+ interval: str,
261
+ start_time: int | None = None,
262
+ end_time: int | None = None,
263
+ limit: int | None = None,
264
+ timestamp: int | None = None,
265
+ recv_window: int | None = None,
266
+ ) -> dict[str, Any]:
267
+ """Получение свечей цены маркировки.
268
+
269
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Mark%20Price%20Kline-Candlestick%20Data
270
+ """
271
+ params = {
272
+ "symbol": symbol,
273
+ "interval": interval,
274
+ "startTime": start_time,
275
+ "endTime": end_time,
276
+ "limit": limit,
277
+ "timestamp": timestamp,
278
+ "recvWindow": recv_window,
279
+ }
280
+
281
+ return await self._make_request(
282
+ "GET",
283
+ "/openApi/swap/v1/market/markPriceKlines",
284
+ params=params,
285
+ )
286
+
287
+ async def futures_ticker_price(
288
+ self,
289
+ symbol: str | None = None,
290
+ timestamp: int | None = None,
291
+ recv_window: int | None = None,
292
+ ) -> dict[str, Any]:
293
+ """Получение последней цены тикера.
294
+
295
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Symbol%20Price%20Ticker
296
+ """
297
+ params = {
298
+ "symbol": symbol,
299
+ "timestamp": timestamp,
300
+ "recvWindow": recv_window,
301
+ }
302
+
303
+ return await self._make_request("GET", "/openApi/swap/v1/ticker/price", params=params)
304
+
305
+ async def futures_trading_rules(
306
+ self,
307
+ symbol: str | None = None,
308
+ timestamp: int | None = None,
309
+ recv_window: int | None = None,
310
+ ) -> dict[str, Any]:
311
+ """Получение торговых правил.
312
+
313
+ https://bingx-api.github.io/docs-v3/#/en/Swap/Market%20Data/Trading%20Rules
314
+ """
315
+ params = {
316
+ "symbol": symbol,
317
+ "timestamp": timestamp,
318
+ "recvWindow": recv_window,
319
+ }
320
+
321
+ return await self._make_request("GET", "/openApi/swap/v1/tradingRules", params=params)
322
+
323
+ async def symbols(
324
+ self,
325
+ symbol: str | None = None,
326
+ timestamp: int | None = None,
327
+ recv_window: int | None = None,
328
+ ) -> dict[str, Any]:
329
+ """Получение списка спотовых торговых пар.
330
+
331
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Spot%20trading%20symbols
332
+ """
333
+ params = {
334
+ "symbol": symbol,
335
+ "timestamp": timestamp,
336
+ "recvWindow": recv_window,
337
+ }
338
+
339
+ return await self._make_request("GET", "/openApi/spot/v1/common/symbols", params=params)
340
+
341
+ async def trades(
342
+ self,
343
+ symbol: str,
344
+ limit: int | None = None,
345
+ timestamp: int | None = None,
346
+ recv_window: int | None = None,
347
+ ) -> dict[str, Any]:
348
+ """Получение списка последних сделок.
349
+
350
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Recent%20Trades%20List
351
+ """
352
+ params = {
353
+ "symbol": symbol,
354
+ "limit": limit,
355
+ "timestamp": timestamp,
356
+ "recvWindow": recv_window,
357
+ }
358
+
359
+ return await self._make_request("GET", "/openApi/spot/v1/market/trades", params=params)
360
+
361
+ async def order_book(
362
+ self,
363
+ symbol: str,
364
+ limit: int | None = None,
365
+ timestamp: int | None = None,
366
+ recv_window: int | None = None,
367
+ ) -> dict[str, Any]:
368
+ """Получение стакана ордеров.
369
+
370
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Order%20Book
371
+ """
372
+ params = {
373
+ "symbol": symbol,
374
+ "limit": limit,
375
+ "timestamp": timestamp,
376
+ "recvWindow": recv_window,
377
+ }
378
+
379
+ return await self._make_request("GET", "/openApi/spot/v1/market/depth", params=params)
380
+
381
+ async def klines(
382
+ self,
383
+ symbol: str,
384
+ interval: str,
385
+ start_time: int | None = None,
386
+ end_time: int | None = None,
387
+ limit: int | None = None,
388
+ timestamp: int | None = None,
389
+ recv_window: int | None = None,
390
+ ) -> dict[str, Any]:
391
+ """Получение свечей.
392
+
393
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Kline-Candlestick%20Data
394
+ """
395
+ params = {
396
+ "symbol": symbol,
397
+ "interval": interval,
398
+ "startTime": start_time,
399
+ "endTime": end_time,
400
+ "limit": limit,
401
+ "timestamp": timestamp,
402
+ "recvWindow": recv_window,
403
+ }
404
+
405
+ return await self._make_request("GET", "/openApi/spot/v2/market/kline", params=params)
406
+
407
+ async def ticker_24hr(
408
+ self,
409
+ symbol: str | None = None,
410
+ timestamp: int | None = None,
411
+ recv_window: int | None = None,
412
+ ) -> dict[str, Any]:
413
+ """Получение 24-часовой статистики тикера.
414
+
415
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/24hr%20Ticker%20Price%20Change%20Statistics
416
+ """
417
+ params = {
418
+ "symbol": symbol,
419
+ "timestamp": timestamp,
420
+ "recvWindow": recv_window,
421
+ }
422
+
423
+ return await self._make_request("GET", "/openApi/spot/v1/ticker/24hr", params=params)
424
+
425
+ async def order_book_agg(
426
+ self,
427
+ symbol: str,
428
+ depth: int,
429
+ type_: str,
430
+ timestamp: int | None = None,
431
+ recv_window: int | None = None,
432
+ ) -> dict[str, Any]:
433
+ """Получение агрегированного стакана ордеров.
434
+
435
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Order%20Book%20aggregation
436
+ """
437
+ params = {
438
+ "symbol": symbol,
439
+ "depth": depth,
440
+ "type": type_,
441
+ "timestamp": timestamp,
442
+ "recvWindow": recv_window,
443
+ }
444
+
445
+ return await self._make_request("GET", "/openApi/spot/v2/market/depth", params=params)
446
+
447
+ async def ticker_price(
448
+ self,
449
+ symbol: str,
450
+ timestamp: int | None = None,
451
+ recv_window: int | None = None,
452
+ ) -> dict[str, Any]:
453
+ """Получение последней цены тикера.
454
+
455
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Symbol%20Price%20Ticker
456
+ """
457
+ params = {
458
+ "symbol": symbol,
459
+ "timestamp": timestamp,
460
+ "recvWindow": recv_window,
461
+ }
462
+
463
+ return await self._make_request("GET", "/openApi/spot/v2/ticker/price", params=params)
464
+
465
+ async def book_ticker(
466
+ self,
467
+ symbol: str,
468
+ timestamp: int | None = None,
469
+ recv_window: int | None = None,
470
+ ) -> dict[str, Any]:
471
+ """Получение лучшего бид/аск по символу.
472
+
473
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Symbol%20Order%20Book%20Ticker
474
+ """
475
+ params = {
476
+ "symbol": symbol,
477
+ "timestamp": timestamp,
478
+ "recvWindow": recv_window,
479
+ }
480
+
481
+ return await self._make_request("GET", "/openApi/spot/v1/ticker/bookTicker", params=params)
482
+
483
+ async def historical_klines(
484
+ self,
485
+ symbol: str,
486
+ interval: str,
487
+ start_time: int | None = None,
488
+ end_time: int | None = None,
489
+ limit: int | None = None,
490
+ ) -> dict[str, Any]:
491
+ """Получение исторических свечей.
492
+
493
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Historical%20K-line
494
+ """
495
+ params = {
496
+ "symbol": symbol,
497
+ "interval": interval,
498
+ "startTime": start_time,
499
+ "endTime": end_time,
500
+ "limit": limit,
501
+ }
502
+
503
+ return await self._make_request("GET", "/openApi/market/his/v1/kline", params=params)
504
+
505
+ async def historical_trades(
506
+ self,
507
+ symbol: str,
508
+ limit: int | None = None,
509
+ from_id: str | None = None,
510
+ ) -> dict[str, Any]:
511
+ """Получение исторических сделок.
512
+
513
+ https://bingx-api.github.io/docs-v3/#/en/Spot/Market%20Data/Old%20Trade%20Lookup
514
+ """
515
+ params = {
516
+ "symbol": symbol,
517
+ "limit": limit,
518
+ "fromId": from_id,
519
+ }
520
+
521
+ return await self._make_request("GET", "/openApi/market/his/v1/trade", params=params)
@@ -0,0 +1,22 @@
1
+ __all__ = ["ExchangeInfo"]
2
+
3
+ import aiohttp
4
+
5
+ from unicex._abc import IExchangeInfo
6
+
7
+
8
+ class ExchangeInfo(IExchangeInfo):
9
+ """Предзагружает информацию о тикерах для биржи BingX."""
10
+
11
+ exchange_name = "BingX"
12
+ """Название биржи, на которой работает класс."""
13
+
14
+ @classmethod
15
+ async def _load_spot_exchange_info(cls, session: aiohttp.ClientSession) -> None:
16
+ """Загружает информацию о бирже для спотового рынка."""
17
+ ...
18
+
19
+ @classmethod
20
+ async def _load_futures_exchange_info(cls, session: aiohttp.ClientSession) -> None:
21
+ """Загружает информацию о бирже для фьючерсного рынка."""
22
+ ...