dcex - DEX & CEX trading library
English | 繁體中文
dcex is a Rust-backed exchange library with synchronous and asynchronous Python clients and a standalone Rust crate. It covers market data, account queries, order APIs, and public and private WebSocket streams.
Broker codes: dcex does not set or attach a broker code or broker tag by default. You can specify one explicitly when the exchange API supports it.
Forked from krex, a simplified version of the ccxt Python library.
Installation
Python:
pip install dcex
# or, in a uv-managed project:
uv add dcex
Rust:
cargo add dcex
Key features
- Synchronous and asynchronous Python HTTP clients, plus public and private WebSocket clients.
- HTTP, WebSocket, and signing APIs for direct use from Rust.
- A Product Table Manager (PTM) that normalizes exchange symbols and trading specifications.
- Support for multiple CEX and DEX platforms; available endpoints vary by exchange.
Documented withdrawal, market-maker and partner endpoints are in scope; current coverage and specification gaps are recorded in the endpoint ledger. API withdrawals have no second confirmation; they execute on submit. Trading API keys should not have withdrawal permission. PTM includes listed options from Binance, Bybit, and OKX; option trading remains exchange-specific.
Supported exchanges
| Exchange | HTTP Sync | HTTP Async | WS Public | WS Private |
|---|---|---|---|---|
| Binance | Yes | Yes | Yes | Yes |
| Bybit | Yes | Yes | Yes | Yes |
| OKX | Yes | Yes | Yes | Yes |
| Bitget | Yes | Yes | Yes | Yes |
| Kraken | Yes | Yes | Yes | Yes |
| MEXC | Yes | Yes | Yes | Yes |
| BingX | Yes | Yes | Yes | Yes |
| KuCoin | Yes | Yes | Yes | Yes |
| Hyperliquid | Yes | Yes | Yes | Yes |
| Lighter (Mainnet + Robinhood) | Yes | Yes | Yes | Yes |
| Backpack | Yes | Yes | Yes | Yes |
| Aster | Yes | Yes | Yes | Yes |
| Extended | Yes | Yes | Yes | Yes |
| Ondo | Yes | Yes | Yes | Yes |
| Arcus | Yes | Yes | Yes | Yes |
Bitget began migrating accounts to UTA on 2026-09-15. Classic-account private endpoints that Bitget rejects for UTA accounts (error 40085) have been removed; public market-data, tax and institutional-loan endpoints that still work remain. Use a UTA account for trading. See the official UTA upgrade guide and account settings.
Private WebSocket support includes authenticated or address-scoped user-data streams. Trading WebSocket APIs are available for Binance, Bybit, Bitget, OKX, KuCoin and Kraken Spot; Hyperliquid and Lighter accept signed actions, and Arcus provides signed request construction. Lighter Mainnet and Robinhood use separate credential profiles; select the network per client (Mainnet is the default); see .env.example and the Lighter examples. Ondo spot currently supports only public market data (depth, trades, symbol_info, history and WS spot channels); Ondo has not published its spot trading API, so private operations such as placing or cancelling orders with a -SPOT symbol fail locally without sending a request.
Endpoint coverage, limitations and verification.
Python quick start
Synchronous HTTP:
import dcex
client = dcex.binance()
print(client.get_klines(product_symbol="BTC-USDT-SWAP", interval="1m"))
Asynchronous HTTP:
import asyncio
import dcex.async_support as dcex
async def main():
client = await dcex.binance()
try:
print(await client.get_klines(product_symbol="BTC-USDT-SWAP", interval="1m"))
finally:
await client.close()
asyncio.run(main())
Additional profiles cover Binance Alpha, Aster Prediction, KuCoin Classic/Pro and Kraken Spot V1. Bitget SBE returns raw binary frames for caller-side decoding.
Public WebSocket:
import asyncio
from dcex.ws import binance
async def main():
async with binance.public() as ws:
await ws.subscribe_agg_trades("BTC-USDT-SPOT")
print(await ws.recv())
asyncio.run(main())
Product Table Manager
PTM maps normalized product_symbol values, such as BTC-USDT-SWAP, to exchange-native exchange_symbol values and exposes trading metadata. Clients use this mapping where applicable.
| Product | product_symbol |
Example |
|---|---|---|
| Spot | BASE-QUOTE-SPOT |
BTC-USDT-SPOT |
| Perpetual | BASE-QUOTE-SWAP |
BTC-USDT-SWAP |
| Dated futures | BASE-QUOTE-YYMMDD-FUTURES (UTC delivery date) |
BTC-USD-261225-FUTURES |
| Fields | Meaning |
|---|---|
exchange, product_symbol, exchange_symbol |
Exchange and normalized/native symbols |
product_type, exchange_type |
Normalized and exchange-specific market types |
base_currency, quote_currency |
Product currencies |
price_precision, size_precision |
Price and size increments |
min_size, min_notional |
Minimum size and notional |
size_per_contract |
Contract multiplier |
Binance and BingX coin-margined contracts sit in their own exchange namespaces, binance_coinm and bingx_coinm (for example BTC-USD-SWAP), so they never collide with USDT-margined products; their coin-margined methods resolve symbols there.
from dcex.product_table.manager import ProductTableManager
table = ProductTableManager.get_instance("binance")
print(table.get_exchange_symbol("binance", "BTC-USDT-SWAP"))
print(table.get_product_symbol("binance", "BTCUSDT", product_type="swap"))
print(table.rows()[0])
Hyperliquid loads its first perp DEX, spot and every builder-deployed (HIP-3) perp DEX by default. Pass perp_dexs to load only the builder DEXs you trade; names come from get_perp_dexs, unknown names are rejected, and asset ids stay the same as with the full table:
from dcex.hyperliquid import Client
client = Client(perp_dexs=["xyz"])
table = ProductTableManager.get_instance("hyperliquid", perp_dexs=["xyz"])
Lighter nonces
Every Lighter transaction method accepts nonce. Without it, dcex asks the exchange for the next nonce, which costs one request per transaction. Trading systems usually keep the nonce themselves:
- Read the starting value once per API key with
get_next_nonce(api_key_index=...). - Increment it locally and pass
nonce=with each transaction, holding a lock if several tasks share the key. - After a failed transaction or a nonce error, read
get_next_nonceagain; a rejected transaction may not consume its nonce. - Give each process its own
api_key_indexso their nonces never collide.
More examples and development
Runnable examples are in Python sync, Python async and WebSocket, and Rust. They focus on public data or read-only account queries. Private HTTP examples require credentials; private stream examples require credentials or a user address.
uv run python examples/sync/binance_public.py
uv run python examples/async/binance_ws_public.py
cargo run -p dcex --example binance_ws_public
For direct Rust usage, see the crate README. The default test suite runs offline with uv run pytest; live suites are opt-in. See the contributing guide for development and testing details.
This project uses the MIT License; see the third-party notices for additional licenses.
Metadata
Release files for dcex 0.41.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dcex-0.41.0.tar.gz | 1.9 MB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dcex-0.41.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| dcex-0.41.0-cp312-cp312-manylinux_2_34_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.34+ x86-64 | Details |
| dcex-0.41.0-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
Total release size: 47.4 MB
Release files / dcex-0.41.0.tar.gz
| Download URL | dcex-0.41.0.tar.gz |
|---|---|
| Size | 1.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eafe29d1887d526528739075e31e4069ad6b5e2ba7fedfd71afe7cc695aa2a68
|
|
BLAKE2b-256 checksum How to use checksums |
11a343a214ebb4cb1bcc3003c3443e6c602e1b2e7b7261f1d1d5b6c99f4bd638
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / dcex-0.41.0-cp312-cp312-win_amd64.whl
| Download URL | dcex-0.41.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 16.2 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8cc269d96681008d9ddc29412b9c8f671ff4c448321eb774d4346c3b22ec9663
|
|
BLAKE2b-256 checksum How to use checksums |
4e785655df01be7bab94d9d1423e55fd516cd64aa4f7a14ebbaa57750d7ee802
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / dcex-0.41.0-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | dcex-0.41.0-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 15.1 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
776daae4dc83667b4aa4c5185c0d43c17262517eadcb3ede74810195e5254d17
|
|
BLAKE2b-256 checksum How to use checksums |
40596c1588bff6126095fda9a041a95e65e223cecd9826a730649583110ba2cf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / dcex-0.41.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | dcex-0.41.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 14.2 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
30d6fa4563df489e03d8ce72eec02574323fd9333e51fde95b729f9380204ec8
|
|
BLAKE2b-256 checksum How to use checksums |
34df7f595591e3c6dd5565b0ef784a081c266beea3a9029f1b6743af1b395bb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|