unicex 0.4.0__tar.gz → 0.7.0__tar.gz

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 (142) hide show
  1. unicex-0.7.0/PKG-INFO +192 -0
  2. unicex-0.7.0/README.md +144 -0
  3. {unicex-0.4.0 → unicex-0.7.0}/pyproject.toml +3 -1
  4. {unicex-0.4.0 → unicex-0.7.0}/unicex/__init__.py +56 -124
  5. {unicex-0.4.0 → unicex-0.7.0}/unicex/_abc/__init__.py +2 -0
  6. unicex-0.7.0/unicex/_abc/exchange_info.py +176 -0
  7. {unicex-0.4.0 → unicex-0.7.0}/unicex/_abc/uni_client.py +2 -2
  8. {unicex-0.4.0 → unicex-0.7.0}/unicex/_base/client.py +2 -2
  9. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/__init__.py +12 -0
  10. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/adapter.py +1 -1
  11. unicex-0.7.0/unicex/binance/exchange_info.py +12 -0
  12. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/__init__.py +14 -4
  13. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/adapter.py +1 -1
  14. unicex-0.7.0/unicex/bitget/exchange_info.py +12 -0
  15. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/uni_websocket_manager.py +1 -1
  16. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/__init__.py +12 -0
  17. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/adapter.py +1 -1
  18. unicex-0.7.0/unicex/bybit/exchange_info.py +12 -0
  19. {unicex-0.4.0 → unicex-0.7.0}/unicex/enums.py +16 -5
  20. {unicex-0.4.0 → unicex-0.7.0}/unicex/extra.py +49 -0
  21. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/__init__.py +12 -0
  22. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/adapter.py +2 -2
  23. unicex-0.7.0/unicex/gateio/exchange_info.py +12 -0
  24. {unicex-0.4.0 → unicex-0.7.0}/unicex/hyperliquid/__init__.py +12 -0
  25. unicex-0.7.0/unicex/hyperliquid/adapter.py +250 -0
  26. unicex-0.7.0/unicex/hyperliquid/client.py +2315 -0
  27. unicex-0.7.0/unicex/hyperliquid/exchange_info.py +100 -0
  28. unicex-0.7.0/unicex/hyperliquid/uni_client.py +325 -0
  29. {unicex-0.4.0 → unicex-0.7.0}/unicex/mapper.py +35 -33
  30. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/__init__.py +12 -0
  31. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/adapter.py +28 -11
  32. unicex-0.7.0/unicex/mexc/exchange_info.py +32 -0
  33. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/uni_client.py +6 -0
  34. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/__init__.py +12 -0
  35. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/adapter.py +23 -7
  36. unicex-0.7.0/unicex/okx/exchange_info.py +50 -0
  37. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/uni_client.py +2 -2
  38. {unicex-0.4.0 → unicex-0.7.0}/unicex/types.py +31 -0
  39. unicex-0.7.0/unicex.egg-info/PKG-INFO +192 -0
  40. {unicex-0.4.0 → unicex-0.7.0}/unicex.egg-info/SOURCES.txt +9 -57
  41. {unicex-0.4.0 → unicex-0.7.0}/unicex.egg-info/requires.txt +2 -0
  42. unicex-0.4.0/PKG-INFO +0 -170
  43. unicex-0.4.0/README.md +0 -124
  44. unicex-0.4.0/unicex/bitrue/__init__.py +0 -15
  45. unicex-0.4.0/unicex/bitrue/adapter.py +0 -8
  46. unicex-0.4.0/unicex/bitrue/client.py +0 -128
  47. unicex-0.4.0/unicex/bitrue/uni_client.py +0 -151
  48. unicex-0.4.0/unicex/bitrue/uni_websocket_manager.py +0 -269
  49. unicex-0.4.0/unicex/bitrue/user_websocket.py +0 -7
  50. unicex-0.4.0/unicex/bitrue/websocket_manager.py +0 -11
  51. unicex-0.4.0/unicex/bitunix/__init__.py +0 -15
  52. unicex-0.4.0/unicex/bitunix/adapter.py +0 -8
  53. unicex-0.4.0/unicex/bitunix/client.py +0 -8
  54. unicex-0.4.0/unicex/bitunix/uni_client.py +0 -151
  55. unicex-0.4.0/unicex/bitunix/uni_websocket_manager.py +0 -269
  56. unicex-0.4.0/unicex/bitunix/user_websocket.py +0 -7
  57. unicex-0.4.0/unicex/bitunix/websocket_manager.py +0 -11
  58. unicex-0.4.0/unicex/btse/__init__.py +0 -15
  59. unicex-0.4.0/unicex/btse/adapter.py +0 -8
  60. unicex-0.4.0/unicex/btse/client.py +0 -123
  61. unicex-0.4.0/unicex/btse/uni_client.py +0 -151
  62. unicex-0.4.0/unicex/btse/uni_websocket_manager.py +0 -269
  63. unicex-0.4.0/unicex/btse/user_websocket.py +0 -7
  64. unicex-0.4.0/unicex/btse/websocket_manager.py +0 -11
  65. unicex-0.4.0/unicex/hyperliquid/adapter.py +0 -140
  66. unicex-0.4.0/unicex/hyperliquid/client.py +0 -232
  67. unicex-0.4.0/unicex/hyperliquid/uni_client.py +0 -171
  68. unicex-0.4.0/unicex/kcex/__init__.py +0 -15
  69. unicex-0.4.0/unicex/kcex/adapter.py +0 -8
  70. unicex-0.4.0/unicex/kcex/client.py +0 -8
  71. unicex-0.4.0/unicex/kcex/uni_client.py +0 -151
  72. unicex-0.4.0/unicex/kcex/uni_websocket_manager.py +0 -269
  73. unicex-0.4.0/unicex/kcex/user_websocket.py +0 -7
  74. unicex-0.4.0/unicex/kcex/websocket_manager.py +0 -11
  75. unicex-0.4.0/unicex/kraken/__init__.py +0 -15
  76. unicex-0.4.0/unicex/kraken/adapter.py +0 -8
  77. unicex-0.4.0/unicex/kraken/client.py +0 -165
  78. unicex-0.4.0/unicex/kraken/uni_client.py +0 -151
  79. unicex-0.4.0/unicex/kraken/uni_websocket_manager.py +0 -269
  80. unicex-0.4.0/unicex/kraken/user_websocket.py +0 -7
  81. unicex-0.4.0/unicex/kraken/websocket_manager.py +0 -11
  82. unicex-0.4.0/unicex/kucoin/__init__.py +0 -15
  83. unicex-0.4.0/unicex/kucoin/adapter.py +0 -8
  84. unicex-0.4.0/unicex/kucoin/client.py +0 -120
  85. unicex-0.4.0/unicex/kucoin/uni_client.py +0 -151
  86. unicex-0.4.0/unicex/kucoin/uni_websocket_manager.py +0 -269
  87. unicex-0.4.0/unicex/kucoin/user_websocket.py +0 -7
  88. unicex-0.4.0/unicex/kucoin/websocket_manager.py +0 -11
  89. unicex-0.4.0/unicex/weex/__init__.py +0 -15
  90. unicex-0.4.0/unicex/weex/adapter.py +0 -8
  91. unicex-0.4.0/unicex/weex/client.py +0 -8
  92. unicex-0.4.0/unicex/weex/uni_client.py +0 -151
  93. unicex-0.4.0/unicex/weex/uni_websocket_manager.py +0 -269
  94. unicex-0.4.0/unicex/weex/user_websocket.py +0 -7
  95. unicex-0.4.0/unicex/weex/websocket_manager.py +0 -11
  96. unicex-0.4.0/unicex/xt/__init__.py +0 -15
  97. unicex-0.4.0/unicex/xt/adapter.py +0 -8
  98. unicex-0.4.0/unicex/xt/client.py +0 -8
  99. unicex-0.4.0/unicex/xt/uni_client.py +0 -151
  100. unicex-0.4.0/unicex/xt/uni_websocket_manager.py +0 -269
  101. unicex-0.4.0/unicex/xt/user_websocket.py +0 -7
  102. unicex-0.4.0/unicex/xt/websocket_manager.py +0 -11
  103. unicex-0.4.0/unicex.egg-info/PKG-INFO +0 -170
  104. {unicex-0.4.0 → unicex-0.7.0}/LICENSE +0 -0
  105. {unicex-0.4.0 → unicex-0.7.0}/setup.cfg +0 -0
  106. {unicex-0.4.0 → unicex-0.7.0}/unicex/_abc/uni_websocket_manager.py +0 -0
  107. {unicex-0.4.0 → unicex-0.7.0}/unicex/_base/__init__.py +0 -0
  108. {unicex-0.4.0 → unicex-0.7.0}/unicex/_base/websocket.py +0 -0
  109. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/client.py +0 -0
  110. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/uni_client.py +0 -0
  111. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/uni_websocket_manager.py +0 -0
  112. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/user_websocket.py +0 -0
  113. {unicex-0.4.0 → unicex-0.7.0}/unicex/binance/websocket_manager.py +0 -0
  114. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/client.py +0 -0
  115. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/uni_client.py +0 -0
  116. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/user_websocket.py +0 -0
  117. {unicex-0.4.0 → unicex-0.7.0}/unicex/bitget/websocket_manager.py +0 -0
  118. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/client.py +0 -0
  119. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/uni_client.py +0 -0
  120. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/uni_websocket_manager.py +0 -0
  121. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/user_websocket.py +0 -0
  122. {unicex-0.4.0 → unicex-0.7.0}/unicex/bybit/websocket_manager.py +0 -0
  123. {unicex-0.4.0 → unicex-0.7.0}/unicex/exceptions.py +0 -0
  124. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/client.py +0 -0
  125. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/uni_client.py +0 -0
  126. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/uni_websocket_manager.py +0 -0
  127. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/user_websocket.py +0 -0
  128. {unicex-0.4.0 → unicex-0.7.0}/unicex/gateio/websocket_manager.py +0 -0
  129. {unicex-0.4.0 → unicex-0.7.0}/unicex/hyperliquid/uni_websocket_manager.py +0 -0
  130. {unicex-0.4.0 → unicex-0.7.0}/unicex/hyperliquid/user_websocket.py +0 -0
  131. {unicex-0.4.0 → unicex-0.7.0}/unicex/hyperliquid/websocket_manager.py +0 -0
  132. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/client.py +0 -0
  133. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/uni_websocket_manager.py +0 -0
  134. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/user_websocket.py +0 -0
  135. {unicex-0.4.0 → unicex-0.7.0}/unicex/mexc/websocket_manager.py +0 -0
  136. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/client.py +0 -0
  137. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/uni_websocket_manager.py +0 -0
  138. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/user_websocket.py +0 -0
  139. {unicex-0.4.0 → unicex-0.7.0}/unicex/okx/websocket_manager.py +0 -0
  140. {unicex-0.4.0 → unicex-0.7.0}/unicex/utils.py +0 -0
  141. {unicex-0.4.0 → unicex-0.7.0}/unicex.egg-info/dependency_links.txt +0 -0
  142. {unicex-0.4.0 → unicex-0.7.0}/unicex.egg-info/top_level.txt +0 -0
unicex-0.7.0/PKG-INFO ADDED
@@ -0,0 +1,192 @@
1
+ Metadata-Version: 2.4
2
+ Name: unicex
3
+ Version: 0.7.0
4
+ Summary: Unified Crypto Exchange API
5
+ Author-email: LoveBloodAndDiamonds <ayazshakirzyanov27@gmail.com>
6
+ License: BSD 3-Clause License
7
+
8
+ Copyright (c) 2025, LoveBloodAndDiamonds
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions are met:
12
+
13
+ 1. Redistributions of source code must retain the above copyright notice, this
14
+ list of conditions and the following disclaimer.
15
+
16
+ 2. Redistributions in binary form must reproduce the above copyright notice,
17
+ this list of conditions and the following disclaimer in the documentation
18
+ and/or other materials provided with the distribution.
19
+
20
+ 3. Neither the name of the copyright holder nor the names of its
21
+ contributors may be used to endorse or promote products derived from
22
+ this software without specific prior written permission.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+
35
+ Project-URL: Github, https://github.com/LoveBloodAndDiamonds/uni-cex-api
36
+ Project-URL: Author, https://t.me/LoveBloodAndDiamonds
37
+ Project-URL: Readthedocs, https://unicex.readthedocs.io/ru/latest/
38
+ Requires-Python: >=3.12
39
+ Description-Content-Type: text/markdown
40
+ License-File: LICENSE
41
+ Requires-Dist: aiohttp>=3.12.15
42
+ Requires-Dist: eth-account>=0.13.7
43
+ Requires-Dist: loguru>=0.7.3
44
+ Requires-Dist: msgpack>=1.1.1
45
+ Requires-Dist: orjson>=3.11.3
46
+ Requires-Dist: websockets>=15.0.1
47
+ Dynamic: license-file
48
+
49
+ # Unified Crypto Exchange API
50
+
51
+ `unicex` — асинхронная библиотека для работы с криптовалютными биржами, реализующая унифицированный интерфейс поверх «сырых» REST и WebSocket API разных бирж.
52
+
53
+ ## ✅ Статус реализации
54
+
55
+ | Exchange | Client | Auth | WS Manager | User WS | Uni Client | Uni WS Manager | ExchangeInfo |
56
+ |-----------------|--------|------|------------|---------|------------|----------------|--------------|
57
+ | **Binance** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
58
+ | **Bitget** | ✓ | ✓ | ✓ | | ✓ | | |
59
+ | **Bybit** | ✓ | ✓ | | | ✓ | | |
60
+ | **Gateio** | ✓ | ✓ | | | ✓ | | |
61
+ | **Hyperliquid** | ✓ | ✓ | | | ✓ | | |
62
+ | **Mexc** | ✓ | ✓ | | | ✓ | | |
63
+ | **Okx** | | ✓ | | | ✓ | | ✓ |
64
+ ---
65
+
66
+
67
+ ### 📖 Описание колонок
68
+
69
+ - **Client** – Обертки над HTTP методами следующих разделов: market, order, position, account.
70
+ - **Auth** – Поддержка авторизации и приватных эндпоинтов.
71
+ - **WS Manager** – Обертки над вебсокетами биржи.
72
+ - **User WS** – Поддержка пользовательских вебсокетов.
73
+ - **UniClient** –Унифированный клиент.
74
+ - **UniWebsocketManager** – Унифированный менеджер вебсокетов.
75
+ - **ExchangeInfo** - Информация о бирже для округления цен и объемов
76
+ ---
77
+
78
+ ## 🚀 Быстрый старт
79
+
80
+ - Установка: `pip install unicex` или из исходников: `pip install -e .`
81
+ - Библиотека полностью асинхронная. Примеры импорта:
82
+ - Сырые клиенты: `from unicex.binance import Client`
83
+ - Унифицированные клиенты: `from unicex.binance import UniClient`
84
+ - Вебсокет менеджеры: `from unicex.binance import WebsocketManager, UniWebsocketManager`
85
+
86
+ ### Пример: Получение рыночных данных через API
87
+
88
+ ```python
89
+ import asyncio
90
+
91
+ from unicex import Exchange, Timeframe, get_uni_client
92
+
93
+ # Выбираем биржу, с которой хотим работать.
94
+ # Поддерживаются: Binance, Bybit, Bitget, Mexc, Gateio, Hyperliquid и другие.
95
+ exchange = Exchange.BYBIT
96
+
97
+
98
+ async def main() -> None:
99
+ """Пример простого использования унифицированного клиента unicex."""
100
+ # 1️⃣ Создаём клиент для выбранной биржи
101
+ client = await get_uni_client(exchange).create()
102
+
103
+ # 2️⃣ Получаем открытый интерес по всем контрактам
104
+ open_interest = await client.open_interest()
105
+ print(open_interest)
106
+
107
+ # Пример вывода:
108
+ # {
109
+ # "BTCUSDT": {"t": 1759669833728, "v": 61099320.0},
110
+ # "ETHUSDT": {"t": 1759669833728, "v": 16302340.0},
111
+ # "SOLUSDT": {"t": 1759669833728, "v": 3427780.0},
112
+ # ...
113
+ # }
114
+
115
+ # 3️⃣ Можно точно так же получать другие данные в едином формате:
116
+ await client.tickers() # список всех тикеров
117
+ await client.futures_tickers() # тикеры фьючерсов
118
+ await client.ticker_24hr() # статистика за 24 часа (spot)
119
+ await client.futures_ticker_24hr() # статистика за 24 часа (futures)
120
+ await client.klines("BTCUSDT", Timeframe.MIN_5) # свечи спота
121
+ await client.futures_klines("BTCUSDT", Timeframe.HOUR_1) # свечи фьючерсов
122
+ await client.funding_rate() # ставка финансирования
123
+
124
+
125
+ if __name__ == "__main__":
126
+ asyncio.run(main())
127
+
128
+ ```
129
+
130
+ ### Пример: Получение данных в реальном времени через Websocket API
131
+
132
+ ```python
133
+ import asyncio
134
+ from unicex import Exchange, TradeDict, get_uni_websocket_manager
135
+ from unicex.enums import Timeframe
136
+
137
+ # Выбираем биржу, с которой хотим работать.
138
+ # Поддерживаются: Binance, Bybit, Bitget, Mexc, Gateio, Hyperliquid и другие.
139
+ exchange = Exchange.BITGET
140
+
141
+
142
+ async def main() -> None:
143
+ """Пример простого использования унифицированного менеджера Websocket от UniCEX."""
144
+
145
+ # 1️⃣ Создаём WebSocket-менеджер для выбранной биржи
146
+ ws_manager = get_uni_websocket_manager(exchange)()
147
+
148
+ # 2️⃣ Подключаемся к потоку сделок (aggTrades)
149
+ aggtrades_ws = ws_manager.aggtrades(
150
+ callback=callback,
151
+ symbols=["BTCUSDT", "ETHUSDT"],
152
+ )
153
+
154
+ # Запускаем получение данных
155
+ await aggtrades_ws.start()
156
+
157
+ # 3️⃣ Примеры других типов потоков:
158
+ futures_aggtrades_ws = ws_manager.futures_aggtrades(
159
+ callback=callback,
160
+ symbols=["BTCUSDT", "ETHUSDT"],
161
+ )
162
+
163
+ klines_ws = ws_manager.klines(
164
+ callback=callback,
165
+ symbols=["BTCUSDT", "ETHUSDT"],
166
+ timeframe=Timeframe.MIN_5,
167
+ )
168
+
169
+ futures_klines_ws = ws_manager.futures_klines(
170
+ callback=callback,
171
+ symbols=["BTCUSDT", "ETHUSDT"],
172
+ timeframe=Timeframe.MIN_1,
173
+ )
174
+
175
+ # 💡 Также у каждой биржи есть свой WebsocketManager:
176
+ # unicex.<exchange>.websocket_manager.WebsocketManager
177
+ # В нём реализованы остальные методы для работы с WS API.
178
+
179
+
180
+ async def callback(trade: TradeDict) -> None:
181
+ """Обработка входящих данных из Websocket."""
182
+ print(trade)
183
+ # Пример вывода:
184
+ # {'t': 1759670527594, 's': 'BTCUSDT', 'S': 'BUY', 'p': 123238.87, 'v': 0.05}
185
+ # {'t': 1759670527594, 's': 'BTCUSDT', 'S': 'BUY', 'p': 123238.87, 'v': 0.04}
186
+ # {'t': 1759670346828, 's': 'ETHUSDT', 'S': 'SELL', 'p': 4535.0, 'v': 0.0044}
187
+ # {'t': 1759670347087, 's': 'ETHUSDT', 'S': 'BUY', 'p': 4534.91, 'v': 0.2712}
188
+
189
+
190
+ if __name__ == "__main__":
191
+ asyncio.run(main())
192
+ ```
unicex-0.7.0/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # Unified Crypto Exchange API
2
+
3
+ `unicex` — асинхронная библиотека для работы с криптовалютными биржами, реализующая унифицированный интерфейс поверх «сырых» REST и WebSocket API разных бирж.
4
+
5
+ ## ✅ Статус реализации
6
+
7
+ | Exchange | Client | Auth | WS Manager | User WS | Uni Client | Uni WS Manager | ExchangeInfo |
8
+ |-----------------|--------|------|------------|---------|------------|----------------|--------------|
9
+ | **Binance** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
10
+ | **Bitget** | ✓ | ✓ | ✓ | | ✓ | | |
11
+ | **Bybit** | ✓ | ✓ | | | ✓ | | |
12
+ | **Gateio** | ✓ | ✓ | | | ✓ | | |
13
+ | **Hyperliquid** | ✓ | ✓ | | | ✓ | | |
14
+ | **Mexc** | ✓ | ✓ | | | ✓ | | |
15
+ | **Okx** | | ✓ | | | ✓ | | ✓ |
16
+ ---
17
+
18
+
19
+ ### 📖 Описание колонок
20
+
21
+ - **Client** – Обертки над HTTP методами следующих разделов: market, order, position, account.
22
+ - **Auth** – Поддержка авторизации и приватных эндпоинтов.
23
+ - **WS Manager** – Обертки над вебсокетами биржи.
24
+ - **User WS** – Поддержка пользовательских вебсокетов.
25
+ - **UniClient** –Унифированный клиент.
26
+ - **UniWebsocketManager** – Унифированный менеджер вебсокетов.
27
+ - **ExchangeInfo** - Информация о бирже для округления цен и объемов
28
+ ---
29
+
30
+ ## 🚀 Быстрый старт
31
+
32
+ - Установка: `pip install unicex` или из исходников: `pip install -e .`
33
+ - Библиотека полностью асинхронная. Примеры импорта:
34
+ - Сырые клиенты: `from unicex.binance import Client`
35
+ - Унифицированные клиенты: `from unicex.binance import UniClient`
36
+ - Вебсокет менеджеры: `from unicex.binance import WebsocketManager, UniWebsocketManager`
37
+
38
+ ### Пример: Получение рыночных данных через API
39
+
40
+ ```python
41
+ import asyncio
42
+
43
+ from unicex import Exchange, Timeframe, get_uni_client
44
+
45
+ # Выбираем биржу, с которой хотим работать.
46
+ # Поддерживаются: Binance, Bybit, Bitget, Mexc, Gateio, Hyperliquid и другие.
47
+ exchange = Exchange.BYBIT
48
+
49
+
50
+ async def main() -> None:
51
+ """Пример простого использования унифицированного клиента unicex."""
52
+ # 1️⃣ Создаём клиент для выбранной биржи
53
+ client = await get_uni_client(exchange).create()
54
+
55
+ # 2️⃣ Получаем открытый интерес по всем контрактам
56
+ open_interest = await client.open_interest()
57
+ print(open_interest)
58
+
59
+ # Пример вывода:
60
+ # {
61
+ # "BTCUSDT": {"t": 1759669833728, "v": 61099320.0},
62
+ # "ETHUSDT": {"t": 1759669833728, "v": 16302340.0},
63
+ # "SOLUSDT": {"t": 1759669833728, "v": 3427780.0},
64
+ # ...
65
+ # }
66
+
67
+ # 3️⃣ Можно точно так же получать другие данные в едином формате:
68
+ await client.tickers() # список всех тикеров
69
+ await client.futures_tickers() # тикеры фьючерсов
70
+ await client.ticker_24hr() # статистика за 24 часа (spot)
71
+ await client.futures_ticker_24hr() # статистика за 24 часа (futures)
72
+ await client.klines("BTCUSDT", Timeframe.MIN_5) # свечи спота
73
+ await client.futures_klines("BTCUSDT", Timeframe.HOUR_1) # свечи фьючерсов
74
+ await client.funding_rate() # ставка финансирования
75
+
76
+
77
+ if __name__ == "__main__":
78
+ asyncio.run(main())
79
+
80
+ ```
81
+
82
+ ### Пример: Получение данных в реальном времени через Websocket API
83
+
84
+ ```python
85
+ import asyncio
86
+ from unicex import Exchange, TradeDict, get_uni_websocket_manager
87
+ from unicex.enums import Timeframe
88
+
89
+ # Выбираем биржу, с которой хотим работать.
90
+ # Поддерживаются: Binance, Bybit, Bitget, Mexc, Gateio, Hyperliquid и другие.
91
+ exchange = Exchange.BITGET
92
+
93
+
94
+ async def main() -> None:
95
+ """Пример простого использования унифицированного менеджера Websocket от UniCEX."""
96
+
97
+ # 1️⃣ Создаём WebSocket-менеджер для выбранной биржи
98
+ ws_manager = get_uni_websocket_manager(exchange)()
99
+
100
+ # 2️⃣ Подключаемся к потоку сделок (aggTrades)
101
+ aggtrades_ws = ws_manager.aggtrades(
102
+ callback=callback,
103
+ symbols=["BTCUSDT", "ETHUSDT"],
104
+ )
105
+
106
+ # Запускаем получение данных
107
+ await aggtrades_ws.start()
108
+
109
+ # 3️⃣ Примеры других типов потоков:
110
+ futures_aggtrades_ws = ws_manager.futures_aggtrades(
111
+ callback=callback,
112
+ symbols=["BTCUSDT", "ETHUSDT"],
113
+ )
114
+
115
+ klines_ws = ws_manager.klines(
116
+ callback=callback,
117
+ symbols=["BTCUSDT", "ETHUSDT"],
118
+ timeframe=Timeframe.MIN_5,
119
+ )
120
+
121
+ futures_klines_ws = ws_manager.futures_klines(
122
+ callback=callback,
123
+ symbols=["BTCUSDT", "ETHUSDT"],
124
+ timeframe=Timeframe.MIN_1,
125
+ )
126
+
127
+ # 💡 Также у каждой биржи есть свой WebsocketManager:
128
+ # unicex.<exchange>.websocket_manager.WebsocketManager
129
+ # В нём реализованы остальные методы для работы с WS API.
130
+
131
+
132
+ async def callback(trade: TradeDict) -> None:
133
+ """Обработка входящих данных из Websocket."""
134
+ print(trade)
135
+ # Пример вывода:
136
+ # {'t': 1759670527594, 's': 'BTCUSDT', 'S': 'BUY', 'p': 123238.87, 'v': 0.05}
137
+ # {'t': 1759670527594, 's': 'BTCUSDT', 'S': 'BUY', 'p': 123238.87, 'v': 0.04}
138
+ # {'t': 1759670346828, 's': 'ETHUSDT', 'S': 'SELL', 'p': 4535.0, 'v': 0.0044}
139
+ # {'t': 1759670347087, 's': 'ETHUSDT', 'S': 'BUY', 'p': 4534.91, 'v': 0.2712}
140
+
141
+
142
+ if __name__ == "__main__":
143
+ asyncio.run(main())
144
+ ```
@@ -4,7 +4,7 @@ name = "unicex"
4
4
  # • PATCH (x.y.Z) → увеличивается при багфиксе, который не ломает совместимость.
5
5
  # • MINOR (x.Y.z) → увеличивается при добавлении новой функциональности, но без ломающих изменений (backward-compatible).
6
6
  # • MAJOR (X.y.z) → увеличивается при изменениях, которые ломают обратную совместимость.
7
- version = "0.4.0"
7
+ version = "0.7.0"
8
8
 
9
9
  description = "Unified Crypto Exchange API "
10
10
  readme = "README.md"
@@ -15,7 +15,9 @@ authors = [
15
15
  requires-python = ">=3.12"
16
16
  dependencies = [
17
17
  "aiohttp>=3.12.15",
18
+ "eth-account>=0.13.7",
18
19
  "loguru>=0.7.3",
20
+ "msgpack>=1.1.1",
19
21
  "orjson>=3.11.3",
20
22
  "websockets>=15.0.1",
21
23
  ]
@@ -4,18 +4,28 @@ __all__ = [
4
4
  # Mappers
5
5
  "get_uni_client",
6
6
  "get_uni_websocket_manager",
7
+ "get_exchange_info",
8
+ # Exchanges info
9
+ "load_exchanges_info",
10
+ "start_exchanges_info",
7
11
  # Enums
8
12
  "MarketType",
9
13
  "Exchange",
10
14
  "Timeframe",
11
15
  "Side",
12
16
  # Types
17
+ "TickerDailyDict",
18
+ "TickerDailyItem",
13
19
  "KlineDict",
14
- "AggTradeDict",
15
20
  "TradeDict",
16
- "TickerDailyDict",
21
+ "AggTradeDict",
17
22
  "RequestMethod",
18
23
  "LoggerLike",
24
+ "AccountType",
25
+ "OpenInterestDict",
26
+ "OpenInterestItem",
27
+ "TickerInfoItem",
28
+ "TickersInfoDict",
19
29
  # Interfaces
20
30
  "IUniClient",
21
31
  "IUniWebsocketManager",
@@ -28,109 +38,62 @@ __all__ = [
28
38
  "BinanceWebsocketManager",
29
39
  "BinanceUniWebsocketManager",
30
40
  "BinanceUserWebsocket",
41
+ "BinanceExchangeInfo",
31
42
  # Bitget
32
43
  "BitgetClient",
33
44
  "BitgetUniClient",
34
45
  "BitgetUniWebsocketManager",
35
46
  "BitgetWebsocketManager",
36
47
  "BitgetUserWebsocket",
37
- # Bitrue
38
- "BitrueClient",
39
- "BitrueUniClient",
40
- "BitrueUniWebsocketManager",
41
- "BitrueWebsocketManager",
42
- "BitrueUserWebsocket",
48
+ "BitgetExchangeInfo",
43
49
  # Mexc
44
50
  "MexcClient",
45
51
  "MexcUniClient",
46
52
  "MexcUniWebsocketManager",
47
53
  "MexcWebsocketManager",
48
54
  "MexcUserWebsocket",
55
+ "MexcExchangeInfo",
49
56
  # Bybit
50
57
  "BybitClient",
51
58
  "BybitUniClient",
52
59
  "BybitUniWebsocketManager",
53
60
  "BybitWebsocketManager",
54
61
  "BybitUserWebsocket",
62
+ "BybitExchangeInfo",
55
63
  # Okx
56
64
  "OkxClient",
57
65
  "OkxUniClient",
58
66
  "OkxUniWebsocketManager",
59
67
  "OkxWebsocketManager",
60
68
  "OkxUserWebsocket",
69
+ "OkxExchangeInfo",
61
70
  # Hyperliquid
62
71
  "HyperliquidClient",
63
72
  "HyperliquidUniClient",
64
73
  "HyperliquidUniWebsocketManager",
65
74
  "HyperliquidWebsocketManager",
66
75
  "HyperliquidUserWebsocket",
76
+ "HyperliquidExchangeInfo",
67
77
  # Gateio
68
78
  "GateioClient",
69
79
  "GateioUniClient",
70
80
  "GateioUniWebsocketManager",
71
81
  "GateioWebsocketManager",
72
82
  "GateioUserWebsocket",
73
- # Bitunix
74
- "BitunixClient",
75
- "BitunixUniClient",
76
- "BitunixUniWebsocketManager",
77
- "BitunixWebsocketManager",
78
- "BitunixUserWebsocket",
79
- # Btse
80
- "BtseClient",
81
- "BtseUniClient",
82
- "BtseUniWebsocketManager",
83
- "BtseWebsocketManager",
84
- "BtseUserWebsocket",
85
- # Kcex
86
- "KcexClient",
87
- "KcexUniClient",
88
- "KcexUniWebsocketManager",
89
- "KcexWebsocketManager",
90
- "KcexUserWebsocket",
91
- # Kraken
92
- "KrakenClient",
93
- "KrakenUniClient",
94
- "KrakenUniWebsocketManager",
95
- "KrakenWebsocketManager",
96
- "KrakenUserWebsocket",
97
- # Kucoin
98
- "KucoinClient",
99
- "KucoinUniClient",
100
- "KucoinUniWebsocketManager",
101
- "KucoinWebsocketManager",
102
- "KucoinUserWebsocket",
103
- # Weex
104
- "WeexClient",
105
- "WeexUniClient",
106
- "WeexUniWebsocketManager",
107
- "WeexWebsocketManager",
108
- "WeexUserWebsocket",
109
- # Xt
110
- "XtClient",
111
- "XtUniClient",
112
- "XtUniWebsocketManager",
113
- "XtWebsocketManager",
114
- "XtUserWebsocket",
83
+ "GateioExchangeInfo",
115
84
  ]
116
85
 
117
86
  # ruff: noqa
118
87
 
119
88
  # abstract & base
89
+ import asyncio
120
90
  from ._abc import IUniClient, IUniWebsocketManager
121
91
  from ._base import BaseClient, Websocket
122
92
 
123
93
  # enums, mappers, types
124
94
  from .enums import Exchange, MarketType, Side, Timeframe
125
- from .mapper import get_uni_client, get_uni_websocket_manager
126
- from .types import (
127
- AggTradeDict,
128
- KlineDict,
129
- LoggerLike,
130
- RequestMethod,
131
- TickerDailyDict,
132
- TradeDict,
133
- )
95
+ from .mapper import get_uni_client, get_uni_websocket_manager, get_exchange_info
96
+ from .types import *
134
97
 
135
98
  # exchanges
136
99
 
@@ -140,6 +103,7 @@ from .binance import (
140
103
  UniWebsocketManager as BinanceUniWebsocketManager,
141
104
  UserWebsocket as BinanceUserWebsocket,
142
105
  WebsocketManager as BinanceWebsocketManager,
106
+ ExchangeInfo as BinanceExchangeInfo,
143
107
  )
144
108
 
145
109
  from .bitget import (
@@ -148,30 +112,7 @@ from .bitget import (
148
112
  UniWebsocketManager as BitgetUniWebsocketManager,
149
113
  UserWebsocket as BitgetUserWebsocket,
150
114
  WebsocketManager as BitgetWebsocketManager,
151
- )
152
-
153
- from .bitrue import (
154
- Client as BitrueClient,
155
- UniClient as BitrueUniClient,
156
- UniWebsocketManager as BitrueUniWebsocketManager,
157
- UserWebsocket as BitrueUserWebsocket,
158
- WebsocketManager as BitrueWebsocketManager,
159
- )
160
-
161
- from .bitunix import (
162
- Client as BitunixClient,
163
- UniClient as BitunixUniClient,
164
- UniWebsocketManager as BitunixUniWebsocketManager,
165
- UserWebsocket as BitunixUserWebsocket,
166
- WebsocketManager as BitunixWebsocketManager,
167
- )
168
-
169
- from .btse import (
170
- Client as BtseClient,
171
- UniClient as BtseUniClient,
172
- UniWebsocketManager as BtseUniWebsocketManager,
173
- UserWebsocket as BtseUserWebsocket,
174
- WebsocketManager as BtseWebsocketManager,
115
+ ExchangeInfo as BitgetExchangeInfo,
175
116
  )
176
117
 
177
118
  from .bybit import (
@@ -180,6 +121,7 @@ from .bybit import (
180
121
  UniWebsocketManager as BybitUniWebsocketManager,
181
122
  UserWebsocket as BybitUserWebsocket,
182
123
  WebsocketManager as BybitWebsocketManager,
124
+ ExchangeInfo as BybitExchangeInfo,
183
125
  )
184
126
 
185
127
  from .gateio import (
@@ -188,6 +130,7 @@ from .gateio import (
188
130
  UniWebsocketManager as GateioUniWebsocketManager,
189
131
  UserWebsocket as GateioUserWebsocket,
190
132
  WebsocketManager as GateioWebsocketManager,
133
+ ExchangeInfo as GateioExchangeInfo,
191
134
  )
192
135
 
193
136
  from .hyperliquid import (
@@ -196,30 +139,7 @@ from .hyperliquid import (
196
139
  UniWebsocketManager as HyperliquidUniWebsocketManager,
197
140
  UserWebsocket as HyperliquidUserWebsocket,
198
141
  WebsocketManager as HyperliquidWebsocketManager,
199
- )
200
-
201
- from .kcex import (
202
- Client as KcexClient,
203
- UniClient as KcexUniClient,
204
- UniWebsocketManager as KcexUniWebsocketManager,
205
- UserWebsocket as KcexUserWebsocket,
206
- WebsocketManager as KcexWebsocketManager,
207
- )
208
-
209
- from .kraken import (
210
- Client as KrakenClient,
211
- UniClient as KrakenUniClient,
212
- UniWebsocketManager as KrakenUniWebsocketManager,
213
- UserWebsocket as KrakenUserWebsocket,
214
- WebsocketManager as KrakenWebsocketManager,
215
- )
216
-
217
- from .kucoin import (
218
- Client as KucoinClient,
219
- UniClient as KucoinUniClient,
220
- UniWebsocketManager as KucoinUniWebsocketManager,
221
- UserWebsocket as KucoinUserWebsocket,
222
- WebsocketManager as KucoinWebsocketManager,
142
+ ExchangeInfo as HyperliquidExchangeInfo,
223
143
  )
224
144
 
225
145
  from .mexc import (
@@ -228,6 +148,7 @@ from .mexc import (
228
148
  UniWebsocketManager as MexcUniWebsocketManager,
229
149
  UserWebsocket as MexcUserWebsocket,
230
150
  WebsocketManager as MexcWebsocketManager,
151
+ ExchangeInfo as MexcExchangeInfo,
231
152
  )
232
153
 
233
154
  from .okx import (
@@ -236,20 +157,31 @@ from .okx import (
236
157
  UniWebsocketManager as OkxUniWebsocketManager,
237
158
  UserWebsocket as OkxUserWebsocket,
238
159
  WebsocketManager as OkxWebsocketManager,
239
- )
240
-
241
- from .weex import (
242
- Client as WeexClient,
243
- UniClient as WeexUniClient,
244
- UniWebsocketManager as WeexUniWebsocketManager,
245
- UserWebsocket as WeexUserWebsocket,
246
- WebsocketManager as WeexWebsocketManager,
247
- )
248
-
249
- from .xt import (
250
- Client as XtClient,
251
- UniClient as XtUniClient,
252
- UniWebsocketManager as XtUniWebsocketManager,
253
- UserWebsocket as XtUserWebsocket,
254
- WebsocketManager as XtWebsocketManager,
255
- )
160
+ ExchangeInfo as OkxExchangeInfo,
161
+ )
162
+
163
+
164
+ async def load_exchanges_info() -> None:
165
+ """Единожды загружает информацию о тикерах на всех биржах."""
166
+ await asyncio.gather(
167
+ BinanceExchangeInfo.load_exchange_info(),
168
+ BitgetExchangeInfo.load_exchange_info(),
169
+ BybitExchangeInfo.load_exchange_info(),
170
+ GateioExchangeInfo.load_exchange_info(),
171
+ HyperliquidExchangeInfo.load_exchange_info(),
172
+ MexcExchangeInfo.load_exchange_info(),
173
+ OkxExchangeInfo.load_exchange_info(),
174
+ )
175
+
176
+
177
+ async def start_exchanges_info(parse_interval_seconds: int = 60 * 60) -> None:
178
+ """Запускает цикл обновления информации о тикерах на всех биржах."""
179
+ asyncio.gather(
180
+ BinanceExchangeInfo.start(parse_interval_seconds),
181
+ BitgetExchangeInfo.start(parse_interval_seconds),
182
+ BybitExchangeInfo.start(parse_interval_seconds),
183
+ GateioExchangeInfo.start(parse_interval_seconds),
184
+ HyperliquidExchangeInfo.start(parse_interval_seconds),
185
+ MexcExchangeInfo.start(parse_interval_seconds),
186
+ OkxExchangeInfo.start(parse_interval_seconds),
187
+ )
@@ -1,7 +1,9 @@
1
1
  __all__ = [
2
2
  "IUniClient",
3
3
  "IUniWebsocketManager",
4
+ "IExchangeInfo",
4
5
  ]
5
6
 
7
+ from .exchange_info import IExchangeInfo
6
8
  from .uni_client import IUniClient
7
9
  from .uni_websocket_manager import IUniWebsocketManager