unicex 0.16.7__py3-none-any.whl → 0.17.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/__init__.py +5 -4
- unicex/aster/__init__.py +27 -0
- unicex/aster/adapter.py +173 -0
- unicex/aster/client.py +794 -0
- unicex/aster/exchange_info.py +44 -0
- unicex/aster/uni_client.py +184 -0
- unicex/aster/uni_websocket_manager.py +286 -0
- unicex/aster/user_websocket.py +191 -0
- unicex/aster/websocket_manager.py +403 -0
- unicex/binance/uni_client.py +2 -2
- unicex/enums.py +18 -0
- unicex/mapper.py +8 -0
- {unicex-0.16.7.dist-info → unicex-0.17.1.dist-info}/METADATA +2 -1
- {unicex-0.16.7.dist-info → unicex-0.17.1.dist-info}/RECORD +17 -9
- {unicex-0.16.7.dist-info → unicex-0.17.1.dist-info}/WHEEL +0 -0
- {unicex-0.16.7.dist-info → unicex-0.17.1.dist-info}/licenses/LICENSE +0 -0
- {unicex-0.16.7.dist-info → unicex-0.17.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
__all__ = ["ExchangeInfo"]
|
|
2
|
+
|
|
3
|
+
import aiohttp
|
|
4
|
+
|
|
5
|
+
from unicex._abc import IExchangeInfo
|
|
6
|
+
from unicex.types import TickerInfoItem
|
|
7
|
+
|
|
8
|
+
from .client import Client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ExchangeInfo(IExchangeInfo):
|
|
12
|
+
"""Предзагружает информацию о тикерах для биржи Aster."""
|
|
13
|
+
|
|
14
|
+
exchange_name = "Aster"
|
|
15
|
+
"""Название биржи, на которой работает класс."""
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
async def _load_spot_exchange_info(cls, session: aiohttp.ClientSession) -> None:
|
|
19
|
+
"""Загружает информацию о бирже для спотового рынка."""
|
|
20
|
+
# В документации Aster нет спотового API, поэтому не загружаем данные.
|
|
21
|
+
cls._tickers_info = {}
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
async def _load_futures_exchange_info(cls, session: aiohttp.ClientSession) -> None:
|
|
25
|
+
"""Загружает информацию о бирже для фьючерсного рынка."""
|
|
26
|
+
exchange_info = await Client(session).futures_exchange_info()
|
|
27
|
+
tickers_info: dict[str, TickerInfoItem] = {}
|
|
28
|
+
for symbol_info in exchange_info.get("symbols", []):
|
|
29
|
+
filters = {
|
|
30
|
+
flt["filterType"]: flt
|
|
31
|
+
for flt in symbol_info.get("filters", [])
|
|
32
|
+
if "filterType" in flt
|
|
33
|
+
}
|
|
34
|
+
price_filter = filters["PRICE_FILTER"]
|
|
35
|
+
lot_size_filter = filters["LOT_SIZE"]
|
|
36
|
+
tickers_info[symbol_info["symbol"]] = TickerInfoItem(
|
|
37
|
+
tick_step=float(price_filter["tickSize"]),
|
|
38
|
+
tick_precision=None,
|
|
39
|
+
size_step=float(lot_size_filter["stepSize"]),
|
|
40
|
+
size_precision=None,
|
|
41
|
+
contract_size=1,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
cls._futures_tickers_info = tickers_info
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
__all__ = ["UniClient"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from typing import overload
|
|
5
|
+
|
|
6
|
+
from unicex._abc import IUniClient
|
|
7
|
+
from unicex.enums import Exchange, Timeframe
|
|
8
|
+
from unicex.exceptions import NotSupported
|
|
9
|
+
from unicex.types import KlineDict, OpenInterestDict, OpenInterestItem, TickerDailyDict
|
|
10
|
+
|
|
11
|
+
from .adapter import Adapter
|
|
12
|
+
from .client import Client
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class UniClient(IUniClient[Client]):
|
|
16
|
+
"""Унифицированный клиент для работы с Aster API."""
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def _client_cls(self) -> type[Client]:
|
|
20
|
+
"""Возвращает класс клиента для Aster.
|
|
21
|
+
|
|
22
|
+
Возвращает:
|
|
23
|
+
type[Client]: Класс клиента для Aster.
|
|
24
|
+
"""
|
|
25
|
+
return Client
|
|
26
|
+
|
|
27
|
+
async def tickers(self, only_usdt: bool = True) -> list[str]:
|
|
28
|
+
"""Возвращает список тикеров.
|
|
29
|
+
|
|
30
|
+
Параметры:
|
|
31
|
+
only_usdt (bool): Если True, возвращает только тикеры в паре к USDT.
|
|
32
|
+
|
|
33
|
+
Возвращает:
|
|
34
|
+
list[str]: Список тикеров.
|
|
35
|
+
"""
|
|
36
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
37
|
+
|
|
38
|
+
async def futures_tickers(self, only_usdt: bool = True) -> list[str]:
|
|
39
|
+
"""Возвращает список тикеров.
|
|
40
|
+
|
|
41
|
+
Параметры:
|
|
42
|
+
only_usdt (bool): Если True, возвращает только тикеры в паре к USDT.
|
|
43
|
+
|
|
44
|
+
Возвращает:
|
|
45
|
+
list[str]: Список тикеров.
|
|
46
|
+
"""
|
|
47
|
+
raw_data = await self._client.futures_ticker_price()
|
|
48
|
+
return Adapter.tickers(raw_data=raw_data, only_usdt=only_usdt) # type: ignore[arg-type] | raw_data is list[dict] if symbol param is not ommited
|
|
49
|
+
|
|
50
|
+
async def last_price(self) -> dict[str, float]:
|
|
51
|
+
"""Возвращает последнюю цену для каждого тикера.
|
|
52
|
+
|
|
53
|
+
Возвращает:
|
|
54
|
+
dict[str, float]: Словарь с последними ценами для каждого тикера.
|
|
55
|
+
"""
|
|
56
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
57
|
+
|
|
58
|
+
async def futures_last_price(self) -> dict[str, float]:
|
|
59
|
+
"""Возвращает последнюю цену для каждого тикера.
|
|
60
|
+
|
|
61
|
+
Возвращает:
|
|
62
|
+
dict[str, float]: Словарь с последними ценами для каждого тикера.
|
|
63
|
+
"""
|
|
64
|
+
raw_data = await self._client.futures_ticker_price()
|
|
65
|
+
return Adapter.last_price(raw_data) # type: ignore[arg-type] | raw_data is list[dict] if symbol param is not ommited
|
|
66
|
+
|
|
67
|
+
async def ticker_24hr(self) -> TickerDailyDict:
|
|
68
|
+
"""Возвращает статистику за последние 24 часа для каждого тикера.
|
|
69
|
+
|
|
70
|
+
Возвращает:
|
|
71
|
+
TickerDailyDict: Словарь с статистикой за последние 24 часа для каждого тикера.
|
|
72
|
+
"""
|
|
73
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
74
|
+
|
|
75
|
+
async def futures_ticker_24hr(self) -> TickerDailyDict:
|
|
76
|
+
"""Возвращает статистику за последние 24 часа для каждого тикера.
|
|
77
|
+
|
|
78
|
+
Возвращает:
|
|
79
|
+
TickerDailyDict: Словарь с статистикой за последние 24 часа для каждого тикера.
|
|
80
|
+
"""
|
|
81
|
+
raw_data = await self._client.futures_ticker_24hr()
|
|
82
|
+
return Adapter.ticker_24hr(raw_data=raw_data) # type: ignore[arg-type] | raw_data is list[dict] if symbol param is not ommited
|
|
83
|
+
|
|
84
|
+
async def klines(
|
|
85
|
+
self,
|
|
86
|
+
symbol: str,
|
|
87
|
+
interval: Timeframe | str,
|
|
88
|
+
limit: int | None = None,
|
|
89
|
+
start_time: int | None = None,
|
|
90
|
+
end_time: int | None = None,
|
|
91
|
+
) -> list[KlineDict]:
|
|
92
|
+
"""Возвращает список свечей для тикера.
|
|
93
|
+
|
|
94
|
+
Параметры:
|
|
95
|
+
symbol (str): Название тикера.
|
|
96
|
+
limit (int | None): Количество свечей.
|
|
97
|
+
interval (Timeframe | str): Таймфрейм свечей.
|
|
98
|
+
start_time (int | None): Время начала периода в миллисекундах.
|
|
99
|
+
end_time (int | None): Время окончания периода в миллисекундах.
|
|
100
|
+
|
|
101
|
+
Возвращает:
|
|
102
|
+
list[KlineDict]: Список свечей для тикера.
|
|
103
|
+
"""
|
|
104
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
105
|
+
|
|
106
|
+
async def futures_klines(
|
|
107
|
+
self,
|
|
108
|
+
symbol: str,
|
|
109
|
+
interval: Timeframe | str,
|
|
110
|
+
limit: int | None = None,
|
|
111
|
+
start_time: int | None = None,
|
|
112
|
+
end_time: int | None = None,
|
|
113
|
+
) -> list[KlineDict]:
|
|
114
|
+
"""Возвращает список свечей для тикера.
|
|
115
|
+
|
|
116
|
+
Параметры:
|
|
117
|
+
symbol (str): Название тикера.
|
|
118
|
+
limit (int | None): Количество свечей.
|
|
119
|
+
interval (Timeframe | str): Таймфрейм свечей.
|
|
120
|
+
start_time (int | None): Время начала периода в миллисекундах.
|
|
121
|
+
end_time (int | None): Время окончания периода в миллисекундах.
|
|
122
|
+
|
|
123
|
+
Возвращает:
|
|
124
|
+
list[KlineDict]: Список свечей для тикера.
|
|
125
|
+
"""
|
|
126
|
+
interval = (
|
|
127
|
+
interval.to_exchange_format(Exchange.ASTER)
|
|
128
|
+
if isinstance(interval, Timeframe)
|
|
129
|
+
else interval
|
|
130
|
+
)
|
|
131
|
+
raw_data = await self._client.futures_klines(
|
|
132
|
+
symbol=symbol,
|
|
133
|
+
interval=interval,
|
|
134
|
+
limit=limit,
|
|
135
|
+
start_time=start_time,
|
|
136
|
+
end_time=end_time,
|
|
137
|
+
)
|
|
138
|
+
return Adapter.klines(raw_data=raw_data, symbol=symbol)
|
|
139
|
+
|
|
140
|
+
@overload
|
|
141
|
+
async def funding_rate(self, symbol: str) -> float: ...
|
|
142
|
+
|
|
143
|
+
@overload
|
|
144
|
+
async def funding_rate(self, symbol: None) -> dict[str, float]: ...
|
|
145
|
+
|
|
146
|
+
@overload
|
|
147
|
+
async def funding_rate(self) -> dict[str, float]: ...
|
|
148
|
+
|
|
149
|
+
async def funding_rate(self, symbol: str | None = None) -> dict[str, float] | float:
|
|
150
|
+
"""Возвращает ставку финансирования для всех тикеров.
|
|
151
|
+
|
|
152
|
+
Параметры:
|
|
153
|
+
symbol (`str | None`): Название тикера (Опционально).
|
|
154
|
+
|
|
155
|
+
Возвращает:
|
|
156
|
+
dict[str, float]: Ставка финансирования для каждого тикера.
|
|
157
|
+
"""
|
|
158
|
+
raw_data = await self._client.futures_mark_price()
|
|
159
|
+
adapted_data = Adapter.funding_rate(raw_data if isinstance(raw_data, list) else [raw_data]) # type: ignore[arg-type]
|
|
160
|
+
return adapted_data[symbol] if symbol else adapted_data
|
|
161
|
+
|
|
162
|
+
@overload
|
|
163
|
+
async def open_interest(self, symbol: str) -> OpenInterestItem: ...
|
|
164
|
+
|
|
165
|
+
@overload
|
|
166
|
+
async def open_interest(self, symbol: None) -> OpenInterestDict: ...
|
|
167
|
+
|
|
168
|
+
@overload
|
|
169
|
+
async def open_interest(self) -> OpenInterestDict: ...
|
|
170
|
+
|
|
171
|
+
async def open_interest(self, symbol: str | None = None) -> OpenInterestItem | OpenInterestDict:
|
|
172
|
+
"""Возвращает объем открытого интереса для тикера или всех тикеров, если тикер не указан.
|
|
173
|
+
|
|
174
|
+
Параметры:
|
|
175
|
+
symbol (`str | None`): Название тикера. (Опционально, но обязателен для следующих бирж: BINANCE).
|
|
176
|
+
|
|
177
|
+
Возвращает:
|
|
178
|
+
`OpenInterestItem | OpenInterestDict`: Если тикер передан - словарь со временем и объемом
|
|
179
|
+
открытого интереса в USDT. Если нет передан - то словарь, в котором ключ - тикер,
|
|
180
|
+
а значение - словарь с временем и объемом открытого интереса в USDT.
|
|
181
|
+
"""
|
|
182
|
+
raw_data = await self._client.open_interest()
|
|
183
|
+
adapted_data = Adapter.open_interest(raw_data)
|
|
184
|
+
return adapted_data[symbol] if symbol else adapted_data
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
__all__ = ["UniWebsocketManager"]
|
|
2
|
+
|
|
3
|
+
from collections.abc import Awaitable, Callable, Sequence
|
|
4
|
+
from typing import Any, overload
|
|
5
|
+
|
|
6
|
+
from unicex._abc import IUniWebsocketManager
|
|
7
|
+
from unicex._base import Websocket
|
|
8
|
+
from unicex.enums import Exchange, Timeframe
|
|
9
|
+
from unicex.exceptions import NotSupported
|
|
10
|
+
from unicex.types import LoggerLike
|
|
11
|
+
|
|
12
|
+
from .adapter import Adapter
|
|
13
|
+
from .client import Client
|
|
14
|
+
from .uni_client import UniClient
|
|
15
|
+
from .websocket_manager import WebsocketManager
|
|
16
|
+
|
|
17
|
+
type CallbackType = Callable[[Any], Awaitable[None]]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class UniWebsocketManager(IUniWebsocketManager):
|
|
21
|
+
"""Реализация менеджера асинхронных унифицированных вебсокетов."""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
client: Client | UniClient | None = None,
|
|
26
|
+
logger: LoggerLike | None = None,
|
|
27
|
+
**ws_kwargs: Any,
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Инициализирует унифицированный менеджер вебсокетов.
|
|
30
|
+
|
|
31
|
+
Параметры:
|
|
32
|
+
client (`Client | UniClient | None`): Клиент Aster или унифицированный клиент. Нужен для подключения к приватным топикам.
|
|
33
|
+
logger (`LoggerLike | None`): Логгер для записи логов.
|
|
34
|
+
ws_kwargs (`dict[str, Any]`): Дополнительные параметры инициализации, которые будут переданы WebsocketManager/Websocket.
|
|
35
|
+
"""
|
|
36
|
+
super().__init__(client=client, logger=logger)
|
|
37
|
+
self._websocket_manager = WebsocketManager(self._client, **ws_kwargs) # type: ignore
|
|
38
|
+
self._adapter = Adapter()
|
|
39
|
+
|
|
40
|
+
@overload
|
|
41
|
+
def klines(
|
|
42
|
+
self,
|
|
43
|
+
callback: CallbackType,
|
|
44
|
+
timeframe: Timeframe,
|
|
45
|
+
*,
|
|
46
|
+
symbol: str,
|
|
47
|
+
symbols: None = None,
|
|
48
|
+
) -> Websocket: ...
|
|
49
|
+
|
|
50
|
+
@overload
|
|
51
|
+
def klines(
|
|
52
|
+
self,
|
|
53
|
+
callback: CallbackType,
|
|
54
|
+
timeframe: Timeframe,
|
|
55
|
+
*,
|
|
56
|
+
symbol: None = None,
|
|
57
|
+
symbols: Sequence[str],
|
|
58
|
+
) -> Websocket: ...
|
|
59
|
+
|
|
60
|
+
def klines(
|
|
61
|
+
self,
|
|
62
|
+
callback: CallbackType,
|
|
63
|
+
timeframe: Timeframe,
|
|
64
|
+
symbol: str | None = None,
|
|
65
|
+
symbols: Sequence[str] | None = None,
|
|
66
|
+
) -> Websocket:
|
|
67
|
+
"""Открывает стрим свечей (spot) с унификацией сообщений.
|
|
68
|
+
|
|
69
|
+
Параметры:
|
|
70
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
71
|
+
timeframe (`Timeframe`): Временной интервал свечей.
|
|
72
|
+
symbol (`str | None`): Один символ для подписки.
|
|
73
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
74
|
+
|
|
75
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
76
|
+
|
|
77
|
+
Возвращает:
|
|
78
|
+
`Websocket`: Экземпляр вебсокета для управления соединением.
|
|
79
|
+
"""
|
|
80
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
81
|
+
|
|
82
|
+
@overload
|
|
83
|
+
def futures_klines(
|
|
84
|
+
self,
|
|
85
|
+
callback: CallbackType,
|
|
86
|
+
timeframe: Timeframe,
|
|
87
|
+
*,
|
|
88
|
+
symbol: str,
|
|
89
|
+
symbols: None = None,
|
|
90
|
+
) -> Websocket: ...
|
|
91
|
+
|
|
92
|
+
@overload
|
|
93
|
+
def futures_klines(
|
|
94
|
+
self,
|
|
95
|
+
callback: CallbackType,
|
|
96
|
+
timeframe: Timeframe,
|
|
97
|
+
*,
|
|
98
|
+
symbol: None = None,
|
|
99
|
+
symbols: Sequence[str],
|
|
100
|
+
) -> Websocket: ...
|
|
101
|
+
|
|
102
|
+
def futures_klines(
|
|
103
|
+
self,
|
|
104
|
+
callback: CallbackType,
|
|
105
|
+
timeframe: Timeframe,
|
|
106
|
+
symbol: str | None = None,
|
|
107
|
+
symbols: Sequence[str] | None = None,
|
|
108
|
+
) -> Websocket:
|
|
109
|
+
"""Открывает стрим свечей (futures) с унификацией сообщений.
|
|
110
|
+
|
|
111
|
+
Параметры:
|
|
112
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
113
|
+
timeframe (`Timeframe`): Временной интервал свечей.
|
|
114
|
+
symbol (`str | None`): Один символ для подписки.
|
|
115
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
116
|
+
|
|
117
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
118
|
+
|
|
119
|
+
Возвращает:
|
|
120
|
+
`Websocket`: Экземпляр вебсокета.
|
|
121
|
+
"""
|
|
122
|
+
wrapper = self._make_wrapper(self._adapter.Klines_message, callback)
|
|
123
|
+
return self._websocket_manager.futures_klines(
|
|
124
|
+
callback=wrapper,
|
|
125
|
+
symbol=symbol,
|
|
126
|
+
symbols=symbols,
|
|
127
|
+
interval=timeframe.to_exchange_format(Exchange.ASTER),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
@overload
|
|
131
|
+
def trades(
|
|
132
|
+
self,
|
|
133
|
+
callback: CallbackType,
|
|
134
|
+
*,
|
|
135
|
+
symbol: str,
|
|
136
|
+
symbols: None = None,
|
|
137
|
+
) -> Websocket: ...
|
|
138
|
+
|
|
139
|
+
@overload
|
|
140
|
+
def trades(
|
|
141
|
+
self,
|
|
142
|
+
callback: CallbackType,
|
|
143
|
+
*,
|
|
144
|
+
symbol: None = None,
|
|
145
|
+
symbols: Sequence[str],
|
|
146
|
+
) -> Websocket: ...
|
|
147
|
+
|
|
148
|
+
def trades(
|
|
149
|
+
self,
|
|
150
|
+
callback: CallbackType,
|
|
151
|
+
symbol: str | None = None,
|
|
152
|
+
symbols: Sequence[str] | None = None,
|
|
153
|
+
) -> Websocket:
|
|
154
|
+
"""Открывает стрим сделок (spot) с унификацией сообщений.
|
|
155
|
+
|
|
156
|
+
Параметры:
|
|
157
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
158
|
+
symbol (`str | None`): Один символ для подписки.
|
|
159
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
160
|
+
|
|
161
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
162
|
+
|
|
163
|
+
Возвращает:
|
|
164
|
+
`Websocket`: Экземпляр вебсокета.
|
|
165
|
+
"""
|
|
166
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
167
|
+
|
|
168
|
+
@overload
|
|
169
|
+
def aggtrades(
|
|
170
|
+
self,
|
|
171
|
+
callback: CallbackType,
|
|
172
|
+
*,
|
|
173
|
+
symbol: str,
|
|
174
|
+
symbols: None = None,
|
|
175
|
+
) -> Websocket: ...
|
|
176
|
+
|
|
177
|
+
@overload
|
|
178
|
+
def aggtrades(
|
|
179
|
+
self,
|
|
180
|
+
callback: CallbackType,
|
|
181
|
+
*,
|
|
182
|
+
symbol: None = None,
|
|
183
|
+
symbols: Sequence[str],
|
|
184
|
+
) -> Websocket: ...
|
|
185
|
+
|
|
186
|
+
def aggtrades(
|
|
187
|
+
self,
|
|
188
|
+
callback: CallbackType,
|
|
189
|
+
symbol: str | None = None,
|
|
190
|
+
symbols: Sequence[str] | None = None,
|
|
191
|
+
) -> Websocket:
|
|
192
|
+
"""Открывает стрим агрегированных сделок (spot) с унификацией сообщений.
|
|
193
|
+
|
|
194
|
+
Параметры:
|
|
195
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
196
|
+
symbol (`str | None`): Один символ для подписки.
|
|
197
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
198
|
+
|
|
199
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
200
|
+
|
|
201
|
+
Возвращает:
|
|
202
|
+
`Websocket`: Экземпляр вебсокета.
|
|
203
|
+
"""
|
|
204
|
+
raise NotSupported("Spot market data is not supported for Aster")
|
|
205
|
+
|
|
206
|
+
@overload
|
|
207
|
+
def futures_trades(
|
|
208
|
+
self,
|
|
209
|
+
callback: CallbackType,
|
|
210
|
+
*,
|
|
211
|
+
symbol: str,
|
|
212
|
+
symbols: None = None,
|
|
213
|
+
) -> Websocket: ...
|
|
214
|
+
|
|
215
|
+
@overload
|
|
216
|
+
def futures_trades(
|
|
217
|
+
self,
|
|
218
|
+
callback: CallbackType,
|
|
219
|
+
*,
|
|
220
|
+
symbol: None = None,
|
|
221
|
+
symbols: Sequence[str],
|
|
222
|
+
) -> Websocket: ...
|
|
223
|
+
|
|
224
|
+
def futures_trades(
|
|
225
|
+
self,
|
|
226
|
+
callback: CallbackType,
|
|
227
|
+
symbol: str | None = None,
|
|
228
|
+
symbols: Sequence[str] | None = None,
|
|
229
|
+
) -> Websocket:
|
|
230
|
+
"""Открывает стрим агрегированных сделок (futures) с унификацией сообщений.
|
|
231
|
+
|
|
232
|
+
Параметры:
|
|
233
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
234
|
+
symbol (`str | None`): Один символ для подписки.
|
|
235
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
236
|
+
|
|
237
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
238
|
+
|
|
239
|
+
В Aster доступен только поток агрегированных сделок, поэтому `futures_aggtrades`
|
|
240
|
+
будет использован автоматически.
|
|
241
|
+
|
|
242
|
+
Возвращает:
|
|
243
|
+
`Websocket`: Экземпляр вебсокета.
|
|
244
|
+
"""
|
|
245
|
+
return self.futures_aggtrades(callback, symbol, symbols) # type: ignore
|
|
246
|
+
|
|
247
|
+
@overload
|
|
248
|
+
def futures_aggtrades(
|
|
249
|
+
self,
|
|
250
|
+
callback: CallbackType,
|
|
251
|
+
*,
|
|
252
|
+
symbol: str,
|
|
253
|
+
symbols: None = None,
|
|
254
|
+
) -> Websocket: ...
|
|
255
|
+
|
|
256
|
+
@overload
|
|
257
|
+
def futures_aggtrades(
|
|
258
|
+
self,
|
|
259
|
+
callback: CallbackType,
|
|
260
|
+
*,
|
|
261
|
+
symbol: None = None,
|
|
262
|
+
symbols: Sequence[str],
|
|
263
|
+
) -> Websocket: ...
|
|
264
|
+
|
|
265
|
+
def futures_aggtrades(
|
|
266
|
+
self,
|
|
267
|
+
callback: CallbackType,
|
|
268
|
+
symbol: str | None = None,
|
|
269
|
+
symbols: Sequence[str] | None = None,
|
|
270
|
+
) -> Websocket:
|
|
271
|
+
"""Открывает стрим агрегированных сделок (futures) с унификацией сообщений.
|
|
272
|
+
|
|
273
|
+
Параметры:
|
|
274
|
+
callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
|
|
275
|
+
symbol (`str | None`): Один символ для подписки.
|
|
276
|
+
symbols (`Sequence[str] | None`): Список символов для мультиплекс‑подключения.
|
|
277
|
+
|
|
278
|
+
Должен быть указан либо `symbol`, либо `symbols`.
|
|
279
|
+
|
|
280
|
+
Возвращает:
|
|
281
|
+
`Websocket`: Экземпляр вебсокета.
|
|
282
|
+
"""
|
|
283
|
+
wrapper = self._make_wrapper(self._adapter.trades_message, callback)
|
|
284
|
+
return self._websocket_manager.futures_agg_trade(
|
|
285
|
+
callback=wrapper, symbol=symbol, symbols=symbols
|
|
286
|
+
)
|