unicex 0.10.5__py3-none-any.whl → 0.11.0__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 +16 -1
- unicex/bybit/adapter.py +57 -3
- unicex/bybit/uni_websocket_manager.py +14 -4
- unicex/bybit/websocket_manager.py +2 -2
- unicex/types.py +18 -0
- {unicex-0.10.5.dist-info → unicex-0.11.0.dist-info}/METADATA +2 -2
- {unicex-0.10.5.dist-info → unicex-0.11.0.dist-info}/RECORD +10 -10
- {unicex-0.10.5.dist-info → unicex-0.11.0.dist-info}/WHEEL +0 -0
- {unicex-0.10.5.dist-info → unicex-0.11.0.dist-info}/licenses/LICENSE +0 -0
- {unicex-0.10.5.dist-info → unicex-0.11.0.dist-info}/top_level.txt +0 -0
unicex/__init__.py
CHANGED
|
@@ -26,6 +26,7 @@ __all__ = [
|
|
|
26
26
|
"OpenInterestItem",
|
|
27
27
|
"TickerInfoItem",
|
|
28
28
|
"TickersInfoDict",
|
|
29
|
+
"LiquidationDict",
|
|
29
30
|
# Interfaces
|
|
30
31
|
"IUniClient",
|
|
31
32
|
"IUniWebsocketManager",
|
|
@@ -93,7 +94,21 @@ from ._base import BaseClient, Websocket
|
|
|
93
94
|
# enums, mappers, types
|
|
94
95
|
from .enums import Exchange, MarketType, Side, Timeframe
|
|
95
96
|
from .mapper import get_uni_client, get_uni_websocket_manager, get_exchange_info
|
|
96
|
-
from .types import
|
|
97
|
+
from .types import (
|
|
98
|
+
TickerDailyDict,
|
|
99
|
+
TickerDailyItem,
|
|
100
|
+
KlineDict,
|
|
101
|
+
TradeDict,
|
|
102
|
+
AggTradeDict,
|
|
103
|
+
RequestMethod,
|
|
104
|
+
LoggerLike,
|
|
105
|
+
AccountType,
|
|
106
|
+
OpenInterestDict,
|
|
107
|
+
OpenInterestItem,
|
|
108
|
+
TickerInfoItem,
|
|
109
|
+
TickersInfoDict,
|
|
110
|
+
LiquidationDict,
|
|
111
|
+
)
|
|
97
112
|
|
|
98
113
|
# exchanges
|
|
99
114
|
|
unicex/bybit/adapter.py
CHANGED
|
@@ -4,6 +4,7 @@ from typing import Any
|
|
|
4
4
|
|
|
5
5
|
from unicex.types import (
|
|
6
6
|
KlineDict,
|
|
7
|
+
LiquidationDict,
|
|
7
8
|
OpenInterestDict,
|
|
8
9
|
OpenInterestItem,
|
|
9
10
|
TickerDailyDict,
|
|
@@ -130,6 +131,14 @@ class Adapter:
|
|
|
130
131
|
|
|
131
132
|
@staticmethod
|
|
132
133
|
def Klines_message(raw_msg: Any) -> list[KlineDict]:
|
|
134
|
+
"""Преобразует вебсокет-сообщение с данными о свечах в унифицированный формат.
|
|
135
|
+
|
|
136
|
+
Параметры:
|
|
137
|
+
raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
|
|
138
|
+
|
|
139
|
+
Возвращает:
|
|
140
|
+
`list[KlineDict]`: Список свечей в унифицированном формате.
|
|
141
|
+
"""
|
|
133
142
|
symbol = raw_msg["topic"].split(".")[-1]
|
|
134
143
|
return [
|
|
135
144
|
KlineDict(
|
|
@@ -144,11 +153,56 @@ class Adapter:
|
|
|
144
153
|
T=kline["end"],
|
|
145
154
|
x=kline["confirm"],
|
|
146
155
|
)
|
|
147
|
-
for kline in
|
|
156
|
+
for kline in sorted(
|
|
157
|
+
raw_msg["data"],
|
|
158
|
+
key=lambda x: int(x["start"]),
|
|
159
|
+
)
|
|
148
160
|
]
|
|
149
161
|
|
|
150
162
|
@staticmethod
|
|
151
|
-
def
|
|
163
|
+
def trades_message(raw_msg: Any) -> list[TradeDict]:
|
|
164
|
+
"""Преобразует вебсокет-сообщение с данными о сделках в унифицированный формат.
|
|
165
|
+
|
|
166
|
+
Параметры:
|
|
167
|
+
raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
|
|
168
|
+
|
|
169
|
+
Возвращает:
|
|
170
|
+
`list[TradeDict]`: Список сделок в унифицированном формате.
|
|
171
|
+
"""
|
|
172
|
+
return [
|
|
173
|
+
TradeDict(
|
|
174
|
+
t=trade["T"],
|
|
175
|
+
s=trade["s"],
|
|
176
|
+
S=trade["S"].upper(),
|
|
177
|
+
p=float(trade["p"]),
|
|
178
|
+
v=float(trade["v"]),
|
|
179
|
+
)
|
|
180
|
+
for trade in sorted(
|
|
181
|
+
raw_msg["data"],
|
|
182
|
+
key=lambda x: int(x["T"]),
|
|
183
|
+
)
|
|
184
|
+
]
|
|
152
185
|
|
|
153
186
|
@staticmethod
|
|
154
|
-
def
|
|
187
|
+
def liquidations_message(raw_msg: Any) -> list[LiquidationDict]:
|
|
188
|
+
"""Преобразует вебсокет-сообщение с данными о ликвидациях в унифицированный формат.
|
|
189
|
+
|
|
190
|
+
Параметры:
|
|
191
|
+
raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
|
|
192
|
+
|
|
193
|
+
Возвращает:
|
|
194
|
+
`list[LiquidationDict]`: Список ликвидаций в унифицированном формате.
|
|
195
|
+
"""
|
|
196
|
+
return [
|
|
197
|
+
LiquidationDict(
|
|
198
|
+
t=liquidation["T"],
|
|
199
|
+
s=liquidation["s"],
|
|
200
|
+
S=liquidation["S"].upper(),
|
|
201
|
+
v=float(liquidation["v"]),
|
|
202
|
+
p=float(liquidation["p"]),
|
|
203
|
+
)
|
|
204
|
+
for liquidation in sorted(
|
|
205
|
+
raw_msg["data"],
|
|
206
|
+
key=lambda x: int(x["T"]),
|
|
207
|
+
)
|
|
208
|
+
]
|
|
@@ -72,7 +72,7 @@ class UniWebsocketManager(IUniWebsocketManager):
|
|
|
72
72
|
Возвращает:
|
|
73
73
|
`Websocket`: Экземпляр вебсокета для управления соединением.
|
|
74
74
|
"""
|
|
75
|
-
return self._websocket_manager.
|
|
75
|
+
return self._websocket_manager.kline(
|
|
76
76
|
callback=self._make_wrapper(self._adapter.Klines_message, callback),
|
|
77
77
|
category="spot",
|
|
78
78
|
interval=timeframe.to_exchange_format(Exchange.BYBIT), # type: ignore
|
|
@@ -120,7 +120,7 @@ class UniWebsocketManager(IUniWebsocketManager):
|
|
|
120
120
|
Возвращает:
|
|
121
121
|
`Websocket`: Экземпляр вебсокета.
|
|
122
122
|
"""
|
|
123
|
-
return self._websocket_manager.
|
|
123
|
+
return self._websocket_manager.kline(
|
|
124
124
|
callback=self._make_wrapper(self._adapter.Klines_message, callback),
|
|
125
125
|
category="linear",
|
|
126
126
|
interval=timeframe.to_exchange_format(Exchange.BYBIT), # type: ignore
|
|
@@ -164,7 +164,12 @@ class UniWebsocketManager(IUniWebsocketManager):
|
|
|
164
164
|
Возвращает:
|
|
165
165
|
`Websocket`: Экземпляр вебсокета.
|
|
166
166
|
"""
|
|
167
|
-
|
|
167
|
+
return self._websocket_manager.trade(
|
|
168
|
+
callback=self._make_wrapper(self._adapter.trades_message, callback),
|
|
169
|
+
category="spot",
|
|
170
|
+
symbol=symbol,
|
|
171
|
+
symbols=symbols,
|
|
172
|
+
)
|
|
168
173
|
|
|
169
174
|
@overload
|
|
170
175
|
def aggtrades(
|
|
@@ -240,7 +245,12 @@ class UniWebsocketManager(IUniWebsocketManager):
|
|
|
240
245
|
Возвращает:
|
|
241
246
|
`Websocket`: Экземпляр вебсокета.
|
|
242
247
|
"""
|
|
243
|
-
|
|
248
|
+
return self._websocket_manager.trade(
|
|
249
|
+
callback=self._make_wrapper(self._adapter.trades_message, callback),
|
|
250
|
+
category="linear",
|
|
251
|
+
symbol=symbol,
|
|
252
|
+
symbols=symbols,
|
|
253
|
+
)
|
|
244
254
|
|
|
245
255
|
@overload
|
|
246
256
|
def futures_aggtrades(
|
|
@@ -126,7 +126,7 @@ class WebsocketManager:
|
|
|
126
126
|
**self._ws_kwargs,
|
|
127
127
|
)
|
|
128
128
|
|
|
129
|
-
def
|
|
129
|
+
def kline(
|
|
130
130
|
self,
|
|
131
131
|
callback: CallbackType,
|
|
132
132
|
category: Literal["spot", "linear", "inverse", "option"],
|
|
@@ -170,7 +170,7 @@ class WebsocketManager:
|
|
|
170
170
|
**self._ws_kwargs,
|
|
171
171
|
)
|
|
172
172
|
|
|
173
|
-
def
|
|
173
|
+
def trade(
|
|
174
174
|
self,
|
|
175
175
|
callback: CallbackType,
|
|
176
176
|
category: Literal["spot", "linear", "inverse", "option"],
|
unicex/types.py
CHANGED
|
@@ -13,6 +13,7 @@ __all__ = [
|
|
|
13
13
|
"OpenInterestItem",
|
|
14
14
|
"TickerInfoItem",
|
|
15
15
|
"TickersInfoDict",
|
|
16
|
+
"LiquidationDict",
|
|
16
17
|
]
|
|
17
18
|
|
|
18
19
|
from logging import Logger as LoggingLogger
|
|
@@ -117,6 +118,23 @@ type OpenInterestDict = dict[str, OpenInterestItem]
|
|
|
117
118
|
"""Модель открытого интереса."""
|
|
118
119
|
|
|
119
120
|
|
|
121
|
+
class LiquidationDict(TypedDict):
|
|
122
|
+
t: int
|
|
123
|
+
"""Время. В миллисекундах."""
|
|
124
|
+
|
|
125
|
+
s: str
|
|
126
|
+
"""Символ."""
|
|
127
|
+
|
|
128
|
+
S: Literal["BUY", "SELL"]
|
|
129
|
+
"""Сторона."""
|
|
130
|
+
|
|
131
|
+
v: float
|
|
132
|
+
"""Объем ликвидации. В монетах."""
|
|
133
|
+
|
|
134
|
+
p: float
|
|
135
|
+
"""Цена ликвидации."""
|
|
136
|
+
|
|
137
|
+
|
|
120
138
|
type AccountType = Literal["SPOT", "FUTURES"]
|
|
121
139
|
"""Тип аккаунта."""
|
|
122
140
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: unicex
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.0
|
|
4
4
|
Summary: Unified Crypto Exchange API
|
|
5
5
|
Author-email: LoveBloodAndDiamonds <ayazshakirzyanov27@gmail.com>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -57,7 +57,7 @@ Dynamic: license-file
|
|
|
57
57
|
|-----------------|--------|------|------------|---------|------------|----------------|--------------|
|
|
58
58
|
| **Binance** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
|
|
59
59
|
| **Bitget** | ✓ | ✓ | ✓ | | ✓ | | |
|
|
60
|
-
| **Bybit** | ✓ | ✓ | ✓ | | ✓ |
|
|
60
|
+
| **Bybit** | ✓ | ✓ | ✓ | | ✓ | ✓ | |
|
|
61
61
|
| **Gateio** | ✓ | ✓ | ✓ | | ✓ | | |
|
|
62
62
|
| **Hyperliquid** | ✓ | ✓ | ✓ | ✓ | ✓ | | |
|
|
63
63
|
| **Mexc** | ✓ | ✓ | ✓ | | ✓ | | |
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
unicex/__init__.py,sha256=
|
|
1
|
+
unicex/__init__.py,sha256=v3yO0P9GqC88cV4L-YSJ6h2YzlyOTnt1NPNLSJwhIRE,5806
|
|
2
2
|
unicex/enums.py,sha256=8E_Nb57kriOif57XSLnW8joFufbthZTJ7tcExKWf1Wg,9633
|
|
3
3
|
unicex/exceptions.py,sha256=r-xZzX78VuxVnI5pe99AM8FIiGcdIUDcF5CaTkQ4NE0,2213
|
|
4
4
|
unicex/extra.py,sha256=MZRSsDRok05KZCqKur-hjOexZuoZ-tC9J6e-EIZr_lw,13824
|
|
5
5
|
unicex/mapper.py,sha256=zOuInRQGJnSnwRI5yJ_axx-0svGn-nOqgLr7XXSlq14,4915
|
|
6
|
-
unicex/types.py,sha256=
|
|
6
|
+
unicex/types.py,sha256=cfuS07QVOgAhZsdME6CeY4lqO8KBBfrf_CJMN9DMB_s,4638
|
|
7
7
|
unicex/utils.py,sha256=dwU1VYuP2xcMpzaETtNQerL1V8Y_JH8H8EsLJ__-M4s,8050
|
|
8
8
|
unicex/_abc/__init__.py,sha256=fxZjNFJFeFwWTXz8iSDe7eCWwE6xfFwFwAuG6l-TI8A,289
|
|
9
9
|
unicex/_abc/exchange_info.py,sha256=j0nbTeF9-_LwHGDZLBHYF2Dd1DYBCQ-DlUO5N5tZgEY,7541
|
|
@@ -29,13 +29,13 @@ unicex/bitget/uni_websocket_manager.py,sha256=y-HXrREy_ruNeUzdRv5nHwBZQgbupxzp1U
|
|
|
29
29
|
unicex/bitget/user_websocket.py,sha256=tlkv7Rmsw_FSfCJnEMOK_9jRsXRk2Ah_slqG8C-uhuo,129
|
|
30
30
|
unicex/bitget/websocket_manager.py,sha256=2OhH2gKy2gN03oYeCFvf3_l6RA29dDOvpajGhbXI9Zw,9886
|
|
31
31
|
unicex/bybit/__init__.py,sha256=SrMBh6K5zUt4JheWUpNUYNb1NCDr2ujTFv4IDguaGZI,926
|
|
32
|
-
unicex/bybit/adapter.py,sha256=
|
|
32
|
+
unicex/bybit/adapter.py,sha256=U6QP2eGefZqfXq7H4P1G9M23HieAjmylb5FnrHISn5s,8147
|
|
33
33
|
unicex/bybit/client.py,sha256=U1mCcF-Mg2spiKlp0ucIA-kDOisYLO0edRS6XC16iNo,61014
|
|
34
34
|
unicex/bybit/exchange_info.py,sha256=36WiJ49TxpSdZpeMwZdjQIkRdf2wJXahdkNxVaNjNRE,351
|
|
35
35
|
unicex/bybit/uni_client.py,sha256=0wmIRRgofuJXWvZMB1gHwuIEfoWuPhLJXthmK1f9w40,8382
|
|
36
|
-
unicex/bybit/uni_websocket_manager.py,sha256=
|
|
36
|
+
unicex/bybit/uni_websocket_manager.py,sha256=OpnvWD0xZ8T_By0HZCSg3jWoZqScRATAsku4IIBqhlw,10252
|
|
37
37
|
unicex/bybit/user_websocket.py,sha256=IGGEnwyWs5jOppgK_R7SisBDvsiF1_piTswBrdQOgDg,128
|
|
38
|
-
unicex/bybit/websocket_manager.py,sha256=
|
|
38
|
+
unicex/bybit/websocket_manager.py,sha256=ePHvngoqoVPr6p-BayoEGhCuRK-cJ69CAPzF94qTalQ,15404
|
|
39
39
|
unicex/gateio/__init__.py,sha256=dsKvhQhDcw4_w0S4c9IjKkCoOg4DCUtSecEUOlfstug,929
|
|
40
40
|
unicex/gateio/adapter.py,sha256=PE5lXQORAKLhzFZBtxcarNIt2xEcDrPrphxWS0k0wEk,6842
|
|
41
41
|
unicex/gateio/client.py,sha256=LS-g44vSY8FHCnDjFKzM8gIoPwWpKv15JxQIgwSietI,53732
|
|
@@ -86,8 +86,8 @@ unicex/okx/uni_client.py,sha256=E_Wod0JSGt1K6k1mAIWnOv350pELbv-nic7g1KgOuos,8694
|
|
|
86
86
|
unicex/okx/uni_websocket_manager.py,sha256=b4f_QjA64DJmENQdIGb5IOVc7kvit7KMCdWeCmRbxGY,9326
|
|
87
87
|
unicex/okx/user_websocket.py,sha256=8c9kpm-xVa729pW93OKUGLHaE9MY0uzEpjIgNIFRF80,126
|
|
88
88
|
unicex/okx/websocket_manager.py,sha256=wROXTUDqKzOE-wDnCtXso_MC4SzfPuPols5aPg_Z3y4,26027
|
|
89
|
-
unicex-0.
|
|
90
|
-
unicex-0.
|
|
91
|
-
unicex-0.
|
|
92
|
-
unicex-0.
|
|
93
|
-
unicex-0.
|
|
89
|
+
unicex-0.11.0.dist-info/licenses/LICENSE,sha256=lNNK4Vqak9cXm6qVJLhbqS7iR_BMj6k7fd7XQ6l1k54,1507
|
|
90
|
+
unicex-0.11.0.dist-info/METADATA,sha256=w8bEftaxRniVPd4owyacH8aW6_usW0XoFA7k8oIbxRA,9148
|
|
91
|
+
unicex-0.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
92
|
+
unicex-0.11.0.dist-info/top_level.txt,sha256=_7rar-0OENIg4KRy6cgjWiebFYAJhjKEcMggAocGWG4,7
|
|
93
|
+
unicex-0.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|