unicex 0.1.18__tar.gz → 0.4.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.
- unicex-0.4.0/PKG-INFO +170 -0
- unicex-0.4.0/README.md +124 -0
- {unicex-0.1.18 → unicex-0.4.0}/pyproject.toml +1 -5
- unicex-0.4.0/unicex/__init__.py +255 -0
- {unicex-0.1.18/unicex/_abc/asyncio → unicex-0.4.0/unicex/_abc}/__init__.py +4 -1
- {unicex-0.1.18/unicex/_abc/asyncio → unicex-0.4.0/unicex/_abc}/uni_client.py +45 -42
- {unicex-0.1.18/unicex/_abc/asyncio → unicex-0.4.0/unicex/_abc}/uni_websocket_manager.py +7 -7
- {unicex-0.1.18/unicex/_base/asyncio → unicex-0.4.0/unicex/_base}/websocket.py +7 -7
- unicex-0.4.0/unicex/binance/__init__.py +15 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex/binance/adapter.py +42 -123
- {unicex-0.1.18/unicex/binance/asyncio → unicex-0.4.0/unicex/binance}/client.py +141 -131
- unicex-0.4.0/unicex/binance/uni_client.py +188 -0
- {unicex-0.1.18/unicex/binance/asyncio → unicex-0.4.0/unicex/binance}/uni_websocket_manager.py +7 -7
- {unicex-0.1.18/unicex/binance/asyncio → unicex-0.4.0/unicex/binance}/user_websocket.py +21 -4
- {unicex-0.1.18/unicex/binance/asyncio → unicex-0.4.0/unicex/binance}/websocket_manager.py +39 -4
- unicex-0.4.0/unicex/bitget/__init__.py +17 -0
- unicex-0.4.0/unicex/bitget/adapter.py +188 -0
- unicex-0.4.0/unicex/bitget/client.py +2497 -0
- unicex-0.4.0/unicex/bitget/uni_client.py +198 -0
- unicex-0.4.0/unicex/bitget/uni_websocket_manager.py +275 -0
- unicex-0.4.0/unicex/bitget/user_websocket.py +7 -0
- unicex-0.4.0/unicex/bitget/websocket_manager.py +232 -0
- unicex-0.4.0/unicex/bitrue/__init__.py +15 -0
- unicex-0.4.0/unicex/bitrue/adapter.py +8 -0
- unicex-0.4.0/unicex/bitrue/client.py +128 -0
- {unicex-0.1.18/unicex/binance/asyncio → unicex-0.4.0/unicex/bitrue}/uni_client.py +54 -62
- unicex-0.4.0/unicex/bitrue/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/bitrue/user_websocket.py +7 -0
- unicex-0.4.0/unicex/bitrue/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/bitunix/__init__.py +15 -0
- unicex-0.4.0/unicex/bitunix/adapter.py +8 -0
- unicex-0.4.0/unicex/bitunix/client.py +8 -0
- unicex-0.4.0/unicex/bitunix/uni_client.py +151 -0
- {unicex-0.1.18/unicex/bitget/asyncio → unicex-0.4.0/unicex/bitunix}/uni_websocket_manager.py +5 -6
- unicex-0.4.0/unicex/bitunix/user_websocket.py +7 -0
- unicex-0.4.0/unicex/bitunix/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/btse/__init__.py +15 -0
- unicex-0.4.0/unicex/btse/adapter.py +8 -0
- unicex-0.4.0/unicex/btse/client.py +123 -0
- unicex-0.4.0/unicex/btse/uni_client.py +151 -0
- {unicex-0.1.18/unicex/_abc/sync → unicex-0.4.0/unicex/btse}/uni_websocket_manager.py +27 -52
- unicex-0.4.0/unicex/btse/user_websocket.py +7 -0
- unicex-0.4.0/unicex/btse/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/bybit/__init__.py +15 -0
- unicex-0.4.0/unicex/bybit/adapter.py +127 -0
- unicex-0.4.0/unicex/bybit/client.py +1869 -0
- unicex-0.4.0/unicex/bybit/uni_client.py +200 -0
- unicex-0.4.0/unicex/bybit/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/bybit/user_websocket.py +7 -0
- unicex-0.4.0/unicex/bybit/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/enums.py +262 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex/extra.py +56 -17
- unicex-0.4.0/unicex/gateio/__init__.py +15 -0
- unicex-0.4.0/unicex/gateio/adapter.py +178 -0
- unicex-0.4.0/unicex/gateio/client.py +1667 -0
- unicex-0.4.0/unicex/gateio/uni_client.py +214 -0
- unicex-0.4.0/unicex/gateio/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/gateio/user_websocket.py +7 -0
- unicex-0.4.0/unicex/gateio/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/hyperliquid/__init__.py +15 -0
- unicex-0.4.0/unicex/hyperliquid/adapter.py +140 -0
- unicex-0.4.0/unicex/hyperliquid/client.py +232 -0
- unicex-0.4.0/unicex/hyperliquid/uni_client.py +171 -0
- unicex-0.4.0/unicex/hyperliquid/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/hyperliquid/user_websocket.py +7 -0
- unicex-0.4.0/unicex/hyperliquid/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/kcex/__init__.py +15 -0
- unicex-0.4.0/unicex/kcex/adapter.py +8 -0
- unicex-0.4.0/unicex/kcex/client.py +8 -0
- unicex-0.4.0/unicex/kcex/uni_client.py +151 -0
- unicex-0.4.0/unicex/kcex/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/kcex/user_websocket.py +7 -0
- unicex-0.4.0/unicex/kcex/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/kraken/__init__.py +15 -0
- unicex-0.4.0/unicex/kraken/adapter.py +8 -0
- unicex-0.4.0/unicex/kraken/client.py +165 -0
- unicex-0.4.0/unicex/kraken/uni_client.py +151 -0
- unicex-0.4.0/unicex/kraken/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/kraken/user_websocket.py +7 -0
- unicex-0.4.0/unicex/kraken/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/kucoin/__init__.py +15 -0
- unicex-0.4.0/unicex/kucoin/adapter.py +8 -0
- unicex-0.4.0/unicex/kucoin/client.py +120 -0
- unicex-0.4.0/unicex/kucoin/uni_client.py +151 -0
- unicex-0.4.0/unicex/kucoin/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/kucoin/user_websocket.py +7 -0
- unicex-0.4.0/unicex/kucoin/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/mapper.py +109 -0
- unicex-0.4.0/unicex/mexc/__init__.py +15 -0
- unicex-0.4.0/unicex/mexc/adapter.py +222 -0
- unicex-0.4.0/unicex/mexc/client.py +846 -0
- unicex-0.4.0/unicex/mexc/uni_client.py +205 -0
- unicex-0.4.0/unicex/mexc/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/mexc/user_websocket.py +7 -0
- unicex-0.4.0/unicex/mexc/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/okx/__init__.py +15 -0
- unicex-0.4.0/unicex/okx/adapter.py +122 -0
- unicex-0.4.0/unicex/okx/client.py +280 -0
- unicex-0.4.0/unicex/okx/uni_client.py +202 -0
- unicex-0.4.0/unicex/okx/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/okx/user_websocket.py +7 -0
- unicex-0.4.0/unicex/okx/websocket_manager.py +11 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex/types.py +24 -3
- {unicex-0.1.18 → unicex-0.4.0}/unicex/utils.py +82 -6
- unicex-0.4.0/unicex/weex/__init__.py +15 -0
- unicex-0.4.0/unicex/weex/adapter.py +8 -0
- unicex-0.4.0/unicex/weex/client.py +8 -0
- unicex-0.4.0/unicex/weex/uni_client.py +151 -0
- unicex-0.4.0/unicex/weex/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/weex/user_websocket.py +7 -0
- unicex-0.4.0/unicex/weex/websocket_manager.py +11 -0
- unicex-0.4.0/unicex/xt/__init__.py +15 -0
- unicex-0.4.0/unicex/xt/adapter.py +8 -0
- unicex-0.4.0/unicex/xt/client.py +8 -0
- unicex-0.4.0/unicex/xt/uni_client.py +151 -0
- unicex-0.4.0/unicex/xt/uni_websocket_manager.py +269 -0
- unicex-0.4.0/unicex/xt/user_websocket.py +7 -0
- unicex-0.4.0/unicex/xt/websocket_manager.py +11 -0
- unicex-0.4.0/unicex.egg-info/PKG-INFO +170 -0
- unicex-0.4.0/unicex.egg-info/SOURCES.txt +126 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex.egg-info/requires.txt +0 -2
- unicex-0.1.18/PKG-INFO +0 -114
- unicex-0.1.18/README.md +0 -66
- unicex-0.1.18/unicex/__init__.py +0 -40
- unicex-0.1.18/unicex/_abc/__init__.py +0 -8
- unicex-0.1.18/unicex/_abc/adapter.py +0 -231
- unicex-0.1.18/unicex/_abc/sync/__init__.py +0 -4
- unicex-0.1.18/unicex/_abc/sync/uni_client.py +0 -275
- unicex-0.1.18/unicex/_base/__init__.py +0 -6
- unicex-0.1.18/unicex/_base/sync/__init__.py +0 -7
- unicex-0.1.18/unicex/_base/sync/client.py +0 -186
- unicex-0.1.18/unicex/_base/sync/websocket.py +0 -239
- unicex-0.1.18/unicex/binance/__init__.py +0 -13
- unicex-0.1.18/unicex/binance/_mixins/__init__.py +0 -7
- unicex-0.1.18/unicex/binance/_mixins/client.py +0 -78
- unicex-0.1.18/unicex/binance/_mixins/user_websocket.py +0 -27
- unicex-0.1.18/unicex/binance/_mixins/websocket_manager.py +0 -45
- unicex-0.1.18/unicex/binance/asyncio/__init__.py +0 -9
- unicex-0.1.18/unicex/binance/sync/__init__.py +0 -9
- unicex-0.1.18/unicex/binance/sync/client.py +0 -1536
- unicex-0.1.18/unicex/binance/sync/uni_client.py +0 -176
- unicex-0.1.18/unicex/binance/sync/uni_websocket_manager.py +0 -166
- unicex-0.1.18/unicex/binance/sync/user_websocket.py +0 -165
- unicex-0.1.18/unicex/binance/sync/websocket_manager.py +0 -876
- unicex-0.1.18/unicex/bitget/__init__.py +0 -1
- unicex-0.1.18/unicex/bitget/_mixins/__init__.py +0 -7
- unicex-0.1.18/unicex/bitget/_mixins/client.py +0 -125
- unicex-0.1.18/unicex/bitget/_mixins/user_websocket.py +0 -0
- unicex-0.1.18/unicex/bitget/_mixins/websocket_manager.py +0 -47
- unicex-0.1.18/unicex/bitget/adapter.py +0 -252
- unicex-0.1.18/unicex/bitget/asyncio/__init__.py +0 -6
- unicex-0.1.18/unicex/bitget/asyncio/client.py +0 -762
- unicex-0.1.18/unicex/bitget/asyncio/uni_client.py +0 -159
- unicex-0.1.18/unicex/bitget/asyncio/websocket_manager.py +0 -57
- unicex-0.1.18/unicex/bitget/sync/__init__.py +0 -0
- unicex-0.1.18/unicex/enums.py +0 -138
- unicex-0.1.18/unicex/mapper.py +0 -110
- unicex-0.1.18/unicex.egg-info/PKG-INFO +0 -114
- unicex-0.1.18/unicex.egg-info/SOURCES.txt +0 -60
- {unicex-0.1.18 → unicex-0.4.0}/LICENSE +0 -0
- {unicex-0.1.18 → unicex-0.4.0}/setup.cfg +0 -0
- {unicex-0.1.18/unicex/_base/asyncio → unicex-0.4.0/unicex/_base}/__init__.py +0 -0
- {unicex-0.1.18/unicex/_base/asyncio → unicex-0.4.0/unicex/_base}/client.py +0 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex/exceptions.py +0 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex.egg-info/dependency_links.txt +0 -0
- {unicex-0.1.18 → unicex-0.4.0}/unicex.egg-info/top_level.txt +0 -0
unicex-0.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: unicex
|
|
3
|
+
Version: 0.4.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: loguru>=0.7.3
|
|
43
|
+
Requires-Dist: orjson>=3.11.3
|
|
44
|
+
Requires-Dist: websockets>=15.0.1
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
|
|
47
|
+
# Unified Crypto Exchange API
|
|
48
|
+
|
|
49
|
+
`unicex` — асинхронная библиотека для работы с криптовалютными биржами, реализующая унифицированный интерфейс поверх «сырых» REST и WebSocket API разных бирж.
|
|
50
|
+
|
|
51
|
+
## ✅ Статус реализации
|
|
52
|
+
|
|
53
|
+
## ✅ Статус реализации
|
|
54
|
+
|
|
55
|
+
| Exchange | Client | Client Auth | Client Generic | WS Manager | User WS |
|
|
56
|
+
|-------------|--------|-------------|----------------|------------|---------|
|
|
57
|
+
| Binance | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
58
|
+
| Bitget | ✅ | ✅ | ✅ | ✅ | |
|
|
59
|
+
| Bitrue | | ✅ | ✅ | | |
|
|
60
|
+
| Bitunix | | | | | |
|
|
61
|
+
| Btse | | ✅ | ✅ | | |
|
|
62
|
+
| Bybit | ✅ | ✅ | ✅ | | |
|
|
63
|
+
| Gateio | ✅ | ✅ | ✅ | | |
|
|
64
|
+
| Hyperliquid | | | | | |
|
|
65
|
+
| Kcex | | | | | |
|
|
66
|
+
| Kraken | | ✅ | ✅ | | |
|
|
67
|
+
| Kucoin | | ✅ | ✅ | | |
|
|
68
|
+
| Mexc | ✅ | ✅ | ✅ | | |
|
|
69
|
+
| Okx | | ✅ | ✅ | | |
|
|
70
|
+
| Weex | | | | | |
|
|
71
|
+
| Xt | | | | | |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### 📖 Описание колонок
|
|
76
|
+
|
|
77
|
+
- **Client** – Обертки над HTTP методами следующих разделов: market, order, position, account.
|
|
78
|
+
- **Client Auth** – Поддержка авторизации и приватных эндпоинтов.
|
|
79
|
+
- **Client Generic** – Универсальная функция для вызова не обернутых методов API.
|
|
80
|
+
- **WS Manager** – Обертки над вебсокетами биржи.
|
|
81
|
+
- **User WS** – Поддержка пользовательских вебсокетов.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## ✅ Статус реализации (Унифицированный интерфейс)
|
|
86
|
+
|
|
87
|
+
| Exchange | UniClient | UniWebsocketManager |
|
|
88
|
+
|-------------|-----------|----------------------|
|
|
89
|
+
| Binance | ✅ | ✅ |
|
|
90
|
+
| Bitget | ✅ | |
|
|
91
|
+
| Bitrue | | |
|
|
92
|
+
| Bitunix | | |
|
|
93
|
+
| Btse | | |
|
|
94
|
+
| Bybit | ✅ | |
|
|
95
|
+
| Gateio | ✅ | |
|
|
96
|
+
| Hyperliquid | | |
|
|
97
|
+
| Kcex | | |
|
|
98
|
+
| Kraken | | |
|
|
99
|
+
| Kucoin | | |
|
|
100
|
+
| Mexc | ✅ | |
|
|
101
|
+
| Okx | ✅ | |
|
|
102
|
+
| Weex | | |
|
|
103
|
+
| Xt | | |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 🚀 Быстрый старт
|
|
108
|
+
|
|
109
|
+
- Установка: `pip install unicex` или из исходников: `pip install -e .`
|
|
110
|
+
- Библиотека полностью асинхронная. Примеры импорта:
|
|
111
|
+
- Сырые клиенты: `from unicex.binance import Client`
|
|
112
|
+
- Унифицированные клиенты: `from unicex.binance import UniClient`
|
|
113
|
+
- Вебсокет менеджеры: `from unicex.binance import WebsocketManager, UniWebsocketManager`
|
|
114
|
+
|
|
115
|
+
Пример: получить последние цены через унифицированный клиент Binance
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
import asyncio
|
|
119
|
+
from unicex.binance import UniClient
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
async def main():
|
|
123
|
+
client = await UniClient.create()
|
|
124
|
+
prices = await client.last_price()
|
|
125
|
+
print(prices["BTCUSDT"])
|
|
126
|
+
await client.close()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
asyncio.run(main())
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Пример: подписаться на трейды через унифицированный WS‑менеджер Bitget
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
import asyncio
|
|
137
|
+
from unicex.bitget import UniWebsocketManager
|
|
138
|
+
from unicex import TradeDict
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
async def on_trade(msg: TradeDict):
|
|
142
|
+
print(msg)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def main():
|
|
146
|
+
uwm = UniWebsocketManager()
|
|
147
|
+
socket = uwm.trades(callback=on_trade, symbol="BTCUSDT")
|
|
148
|
+
await socket.start()
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
if __name__ == "__main__":
|
|
152
|
+
asyncio.run(main())
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 🧑💻 Блок для разработчика
|
|
158
|
+
|
|
159
|
+
### 📋 Todo
|
|
160
|
+
- Написать 1–2 примера
|
|
161
|
+
- На фьючерсах OKX ticker24hr и klines возвращают объем в контрактах
|
|
162
|
+
- Как реализовать типы в сырых клиентах? str | int | float?
|
|
163
|
+
- в klines и futures_klines нужно дать возможность передавать строки, чтобы они не маппились автоматически. Либо расширить список таймфреймов
|
|
164
|
+
+ В mexc клиенте неправильные ссылки на документацию на фьючах
|
|
165
|
+
+ Доделать BitgetClient и проверить типы
|
|
166
|
+
+ Пересмотреть вопрос: должен ли быть адаптер интерфейсом?
|
|
167
|
+
+ Добавить overload к методам с `None, None`
|
|
168
|
+
+ Определить порядок полей, возвращаемых адаптером
|
|
169
|
+
+ Не делать .get в адаптере
|
|
170
|
+
+ нужно ли как-то изменять тикер в юни клиенте и ападетере?
|
unicex-0.4.0/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Unified Crypto Exchange API
|
|
2
|
+
|
|
3
|
+
`unicex` — асинхронная библиотека для работы с криптовалютными биржами, реализующая унифицированный интерфейс поверх «сырых» REST и WebSocket API разных бирж.
|
|
4
|
+
|
|
5
|
+
## ✅ Статус реализации
|
|
6
|
+
|
|
7
|
+
## ✅ Статус реализации
|
|
8
|
+
|
|
9
|
+
| Exchange | Client | Client Auth | Client Generic | WS Manager | User WS |
|
|
10
|
+
|-------------|--------|-------------|----------------|------------|---------|
|
|
11
|
+
| Binance | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
12
|
+
| Bitget | ✅ | ✅ | ✅ | ✅ | |
|
|
13
|
+
| Bitrue | | ✅ | ✅ | | |
|
|
14
|
+
| Bitunix | | | | | |
|
|
15
|
+
| Btse | | ✅ | ✅ | | |
|
|
16
|
+
| Bybit | ✅ | ✅ | ✅ | | |
|
|
17
|
+
| Gateio | ✅ | ✅ | ✅ | | |
|
|
18
|
+
| Hyperliquid | | | | | |
|
|
19
|
+
| Kcex | | | | | |
|
|
20
|
+
| Kraken | | ✅ | ✅ | | |
|
|
21
|
+
| Kucoin | | ✅ | ✅ | | |
|
|
22
|
+
| Mexc | ✅ | ✅ | ✅ | | |
|
|
23
|
+
| Okx | | ✅ | ✅ | | |
|
|
24
|
+
| Weex | | | | | |
|
|
25
|
+
| Xt | | | | | |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### 📖 Описание колонок
|
|
30
|
+
|
|
31
|
+
- **Client** – Обертки над HTTP методами следующих разделов: market, order, position, account.
|
|
32
|
+
- **Client Auth** – Поддержка авторизации и приватных эндпоинтов.
|
|
33
|
+
- **Client Generic** – Универсальная функция для вызова не обернутых методов API.
|
|
34
|
+
- **WS Manager** – Обертки над вебсокетами биржи.
|
|
35
|
+
- **User WS** – Поддержка пользовательских вебсокетов.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## ✅ Статус реализации (Унифицированный интерфейс)
|
|
40
|
+
|
|
41
|
+
| Exchange | UniClient | UniWebsocketManager |
|
|
42
|
+
|-------------|-----------|----------------------|
|
|
43
|
+
| Binance | ✅ | ✅ |
|
|
44
|
+
| Bitget | ✅ | |
|
|
45
|
+
| Bitrue | | |
|
|
46
|
+
| Bitunix | | |
|
|
47
|
+
| Btse | | |
|
|
48
|
+
| Bybit | ✅ | |
|
|
49
|
+
| Gateio | ✅ | |
|
|
50
|
+
| Hyperliquid | | |
|
|
51
|
+
| Kcex | | |
|
|
52
|
+
| Kraken | | |
|
|
53
|
+
| Kucoin | | |
|
|
54
|
+
| Mexc | ✅ | |
|
|
55
|
+
| Okx | ✅ | |
|
|
56
|
+
| Weex | | |
|
|
57
|
+
| Xt | | |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 🚀 Быстрый старт
|
|
62
|
+
|
|
63
|
+
- Установка: `pip install unicex` или из исходников: `pip install -e .`
|
|
64
|
+
- Библиотека полностью асинхронная. Примеры импорта:
|
|
65
|
+
- Сырые клиенты: `from unicex.binance import Client`
|
|
66
|
+
- Унифицированные клиенты: `from unicex.binance import UniClient`
|
|
67
|
+
- Вебсокет менеджеры: `from unicex.binance import WebsocketManager, UniWebsocketManager`
|
|
68
|
+
|
|
69
|
+
Пример: получить последние цены через унифицированный клиент Binance
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
import asyncio
|
|
73
|
+
from unicex.binance import UniClient
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
async def main():
|
|
77
|
+
client = await UniClient.create()
|
|
78
|
+
prices = await client.last_price()
|
|
79
|
+
print(prices["BTCUSDT"])
|
|
80
|
+
await client.close()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == "__main__":
|
|
84
|
+
asyncio.run(main())
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Пример: подписаться на трейды через унифицированный WS‑менеджер Bitget
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
import asyncio
|
|
91
|
+
from unicex.bitget import UniWebsocketManager
|
|
92
|
+
from unicex import TradeDict
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
async def on_trade(msg: TradeDict):
|
|
96
|
+
print(msg)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
async def main():
|
|
100
|
+
uwm = UniWebsocketManager()
|
|
101
|
+
socket = uwm.trades(callback=on_trade, symbol="BTCUSDT")
|
|
102
|
+
await socket.start()
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
asyncio.run(main())
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 🧑💻 Блок для разработчика
|
|
112
|
+
|
|
113
|
+
### 📋 Todo
|
|
114
|
+
- Написать 1–2 примера
|
|
115
|
+
- На фьючерсах OKX ticker24hr и klines возвращают объем в контрактах
|
|
116
|
+
- Как реализовать типы в сырых клиентах? str | int | float?
|
|
117
|
+
- в klines и futures_klines нужно дать возможность передавать строки, чтобы они не маппились автоматически. Либо расширить список таймфреймов
|
|
118
|
+
+ В mexc клиенте неправильные ссылки на документацию на фьючах
|
|
119
|
+
+ Доделать BitgetClient и проверить типы
|
|
120
|
+
+ Пересмотреть вопрос: должен ли быть адаптер интерфейсом?
|
|
121
|
+
+ Добавить overload к методам с `None, None`
|
|
122
|
+
+ Определить порядок полей, возвращаемых адаптером
|
|
123
|
+
+ Не делать .get в адаптере
|
|
124
|
+
+ нужно ли как-то изменять тикер в юни клиенте и ападетере?
|
|
@@ -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.
|
|
7
|
+
version = "0.4.0"
|
|
8
8
|
|
|
9
9
|
description = "Unified Crypto Exchange API "
|
|
10
10
|
readme = "README.md"
|
|
@@ -17,8 +17,6 @@ dependencies = [
|
|
|
17
17
|
"aiohttp>=3.12.15",
|
|
18
18
|
"loguru>=0.7.3",
|
|
19
19
|
"orjson>=3.11.3",
|
|
20
|
-
"requests>=2.32.5",
|
|
21
|
-
"websocket-client>=1.8.0",
|
|
22
20
|
"websockets>=15.0.1",
|
|
23
21
|
]
|
|
24
22
|
|
|
@@ -31,7 +29,5 @@ Readthedocs = "https://unicex.readthedocs.io/ru/latest/"
|
|
|
31
29
|
dev = [
|
|
32
30
|
"build>=1.3.0",
|
|
33
31
|
"pre-commit>=4.3.0",
|
|
34
|
-
"sphinx>=8.2.3",
|
|
35
|
-
"sphinx-rtd-theme>=3.0.2",
|
|
36
32
|
"twine>=6.2.0",
|
|
37
33
|
]
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"""unicex - библиотека для работы с криптовалютными биржами, реализующая унифицированный интерфейс для работы с различными криптовалютными биржами."""
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
# Mappers
|
|
5
|
+
"get_uni_client",
|
|
6
|
+
"get_uni_websocket_manager",
|
|
7
|
+
# Enums
|
|
8
|
+
"MarketType",
|
|
9
|
+
"Exchange",
|
|
10
|
+
"Timeframe",
|
|
11
|
+
"Side",
|
|
12
|
+
# Types
|
|
13
|
+
"KlineDict",
|
|
14
|
+
"AggTradeDict",
|
|
15
|
+
"TradeDict",
|
|
16
|
+
"TickerDailyDict",
|
|
17
|
+
"RequestMethod",
|
|
18
|
+
"LoggerLike",
|
|
19
|
+
# Interfaces
|
|
20
|
+
"IUniClient",
|
|
21
|
+
"IUniWebsocketManager",
|
|
22
|
+
# Base clients and websockets
|
|
23
|
+
"Websocket",
|
|
24
|
+
"BaseClient",
|
|
25
|
+
# Binance
|
|
26
|
+
"BinanceClient",
|
|
27
|
+
"BinanceUniClient",
|
|
28
|
+
"BinanceWebsocketManager",
|
|
29
|
+
"BinanceUniWebsocketManager",
|
|
30
|
+
"BinanceUserWebsocket",
|
|
31
|
+
# Bitget
|
|
32
|
+
"BitgetClient",
|
|
33
|
+
"BitgetUniClient",
|
|
34
|
+
"BitgetUniWebsocketManager",
|
|
35
|
+
"BitgetWebsocketManager",
|
|
36
|
+
"BitgetUserWebsocket",
|
|
37
|
+
# Bitrue
|
|
38
|
+
"BitrueClient",
|
|
39
|
+
"BitrueUniClient",
|
|
40
|
+
"BitrueUniWebsocketManager",
|
|
41
|
+
"BitrueWebsocketManager",
|
|
42
|
+
"BitrueUserWebsocket",
|
|
43
|
+
# Mexc
|
|
44
|
+
"MexcClient",
|
|
45
|
+
"MexcUniClient",
|
|
46
|
+
"MexcUniWebsocketManager",
|
|
47
|
+
"MexcWebsocketManager",
|
|
48
|
+
"MexcUserWebsocket",
|
|
49
|
+
# Bybit
|
|
50
|
+
"BybitClient",
|
|
51
|
+
"BybitUniClient",
|
|
52
|
+
"BybitUniWebsocketManager",
|
|
53
|
+
"BybitWebsocketManager",
|
|
54
|
+
"BybitUserWebsocket",
|
|
55
|
+
# Okx
|
|
56
|
+
"OkxClient",
|
|
57
|
+
"OkxUniClient",
|
|
58
|
+
"OkxUniWebsocketManager",
|
|
59
|
+
"OkxWebsocketManager",
|
|
60
|
+
"OkxUserWebsocket",
|
|
61
|
+
# Hyperliquid
|
|
62
|
+
"HyperliquidClient",
|
|
63
|
+
"HyperliquidUniClient",
|
|
64
|
+
"HyperliquidUniWebsocketManager",
|
|
65
|
+
"HyperliquidWebsocketManager",
|
|
66
|
+
"HyperliquidUserWebsocket",
|
|
67
|
+
# Gateio
|
|
68
|
+
"GateioClient",
|
|
69
|
+
"GateioUniClient",
|
|
70
|
+
"GateioUniWebsocketManager",
|
|
71
|
+
"GateioWebsocketManager",
|
|
72
|
+
"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",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
# ruff: noqa
|
|
118
|
+
|
|
119
|
+
# abstract & base
|
|
120
|
+
from ._abc import IUniClient, IUniWebsocketManager
|
|
121
|
+
from ._base import BaseClient, Websocket
|
|
122
|
+
|
|
123
|
+
# enums, mappers, types
|
|
124
|
+
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
|
+
)
|
|
134
|
+
|
|
135
|
+
# exchanges
|
|
136
|
+
|
|
137
|
+
from .binance import (
|
|
138
|
+
Client as BinanceClient,
|
|
139
|
+
UniClient as BinanceUniClient,
|
|
140
|
+
UniWebsocketManager as BinanceUniWebsocketManager,
|
|
141
|
+
UserWebsocket as BinanceUserWebsocket,
|
|
142
|
+
WebsocketManager as BinanceWebsocketManager,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
from .bitget import (
|
|
146
|
+
Client as BitgetClient,
|
|
147
|
+
UniClient as BitgetUniClient,
|
|
148
|
+
UniWebsocketManager as BitgetUniWebsocketManager,
|
|
149
|
+
UserWebsocket as BitgetUserWebsocket,
|
|
150
|
+
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,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
from .bybit import (
|
|
178
|
+
Client as BybitClient,
|
|
179
|
+
UniClient as BybitUniClient,
|
|
180
|
+
UniWebsocketManager as BybitUniWebsocketManager,
|
|
181
|
+
UserWebsocket as BybitUserWebsocket,
|
|
182
|
+
WebsocketManager as BybitWebsocketManager,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
from .gateio import (
|
|
186
|
+
Client as GateioClient,
|
|
187
|
+
UniClient as GateioUniClient,
|
|
188
|
+
UniWebsocketManager as GateioUniWebsocketManager,
|
|
189
|
+
UserWebsocket as GateioUserWebsocket,
|
|
190
|
+
WebsocketManager as GateioWebsocketManager,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
from .hyperliquid import (
|
|
194
|
+
Client as HyperliquidClient,
|
|
195
|
+
UniClient as HyperliquidUniClient,
|
|
196
|
+
UniWebsocketManager as HyperliquidUniWebsocketManager,
|
|
197
|
+
UserWebsocket as HyperliquidUserWebsocket,
|
|
198
|
+
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,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
from .mexc import (
|
|
226
|
+
Client as MexcClient,
|
|
227
|
+
UniClient as MexcUniClient,
|
|
228
|
+
UniWebsocketManager as MexcUniWebsocketManager,
|
|
229
|
+
UserWebsocket as MexcUserWebsocket,
|
|
230
|
+
WebsocketManager as MexcWebsocketManager,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
from .okx import (
|
|
234
|
+
Client as OkxClient,
|
|
235
|
+
UniClient as OkxUniClient,
|
|
236
|
+
UniWebsocketManager as OkxUniWebsocketManager,
|
|
237
|
+
UserWebsocket as OkxUserWebsocket,
|
|
238
|
+
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
|
+
)
|