Skip to main content

dcex - DEX & CEX trading library

Important: No default broker tags are set. You may manually specify a broker tag within function arguments if needed.

Forked from krex, a simplified version of the ccxt Python library.

Originally created and maintained by the same contributor, this fork continues active development, building upon the original foundation with enhanced design, unified DEX + CEX support, and fixes for previously unresolved issues.

A high-performance and lightweight Python and Rust library for interacting with cryptocurrency exchanges. dcex offers Python clients backed by a Rust core, plus direct Rust APIs for low-level HTTP, WebSocket, signing, and exchange integrations.

Scope note: dcex focuses on market data, account queries, trading/order APIs, and market/user-data streams. External withdrawal creation endpoints are not currently wrapped, and options support is limited to exchange-specific APIs rather than the unified Product Table Manager.

Python Rust License PyPI Crates.io

Installation

Python:

pip install dcex

or use uv to manage the project:

uv add dcex

Rust:

cargo add dcex

Direct Rust usage is also documented in crates/dcex/README.md.

Quick Start

Python Synchronous Usage

import dcex

client = dcex.binance()

klines = client.get_klines(product_symbol="BTC-USDT-SWAP", interval="1m")
print(klines)

Python Asynchronous Usage

import os
import asyncio
import dcex.async_support as dcex
from dotenv import load_dotenv

load_dotenv()

BINANCE_API_KEY = os.getenv("BINANCE_API_KEY")
BINANCE_API_SECRET = os.getenv("BINANCE_API_SECRET")

async def main():
    client = await dcex.binance(
        api_key=BINANCE_API_KEY,
        api_secret=BINANCE_API_SECRET
    )

    try:
        result = await client.get_income_history()
        print(result)

    finally:
        await client.close()

if __name__ == "__main__":
    asyncio.run(main())

Python WebSocket Usage

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())


if __name__ == "__main__":
    asyncio.run(main())

Rust Usage

use std::time::Duration;

use dcex::exchanges::binance::BinanceClient;

#[tokio::main]
async fn main() -> dcex::Result<()> {
    let api_key = std::env::var("BINANCE_API_KEY").expect("Set BINANCE_API_KEY");
    let api_secret = std::env::var("BINANCE_API_SECRET").expect("Set BINANCE_API_SECRET");
    let client = BinanceClient::new(Some(api_key), Some(api_secret), Duration::from_secs(10))?;
    let response = client.get_income_history().await?;
    println!("{}", response.data);
    Ok(())
}

Rust HTTP methods that do not require endpoint parameters can be called without passing None or an empty parameter list. Optional query/body parameters are added with builder setters such as .limit(100) or .param("key", value).

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
BitMart Yes Yes Yes Yes
BitMEX Yes Yes Yes Yes
BingX Yes Yes Yes Yes
KuCoin Yes Yes Yes Yes
Hyperliquid Yes Yes Yes Yes
Lighter Yes Yes Yes Yes
Backpack Yes Yes Yes Yes
Aster Yes Yes Yes Yes
Extended Yes Yes Yes Yes

WS private support currently covers authenticated or address-scoped user-data streams. Order placement and cancellation remain on HTTP clients.

Key Features

  • Product Table Manager for unifying trading instruments across exchanges
  • HTTP clients with consistent sync and async interfaces where available
  • Native Rust core for exchange HTTP, WebSocket, signing, serialization, and response validation
  • Public and private WebSocket stream clients across the supported exchanges
  • Direct Rust crate (dcex) for applications that do not need the Python layer
  • Opt-in live test suites for public, private, stateful, and generated-report endpoints

What is Product Table Manager (PTM)?

PTM is a utility that standardizes and unifies trading instrument metadata across different exchanges, making cross-exchange strategy development easier.

It is a table that contains the following columns:

Column Description
exchange The exchange name
product_symbol The symbol we use to identify the product, it will be the same in different exchanges. For example, BTC-USDT-SWAP is the same product in Binance and Bybit, which named BTCUSDT in Binance and BTC-USDT-SWAP in OKX.
exchange_symbol The symbol that the exchange actually uses
product_type The normalized product type used by dcex, e.g. spot, swap, futures
exchange_type The exchange-specific product type, e.g. spot, linear, inverse, perpetual, delivery
base_currency The base currency, e.g. BTC
quote_currency The quote currency, e.g. USDT
price_precision The price precision, e.g. 0.000001
size_precision The size precision, e.g. 0.000001
min_size The minimum size, e.g. 0.000001
min_notional The minimum notional, e.g. 0.000001
size_per_contract The size per contract. Sometimes 1 contract is not the same as 1 unit in exchanges like OKX.

Options are not currently included in the unified PTM output. Some exchange-specific clients expose option-related parameters or market endpoints, but options are not normalized across exchanges.

How to use Product Table Manager?

In most cases, dcex handles product-symbol mapping internally. If you have a specific use case, you can use ptm to get the information you need.

from dcex.utils.common import Common
from dcex.product_table.manager import ProductTableManager

ptm = ProductTableManager.get_instance(Common.BINANCE)

product_symbol = ptm.get_product_symbol(
    exchange=Common.BINANCE,
    exchange_symbol="BTCUSDT",
    product_type="swap",
)

print(product_symbol)

rows = ptm.rows()
ptm.write_csv("binance_product_table.csv")

Contributing

Contributions are welcome through GitHub issues and pull requests. Run the default test suite before opening a pull request.

Testing

The default test suite is offline and does not require exchange API keys or network access:

uv run pytest

Live, private, stateful, and generated-report tests use the pytest markers configured in pyproject.toml. These tests are opt-in because they can require network access, exchange credentials, or account state.

Benchmarking

Local CPU-bound benchmarks isolate Lighter signing and hashing hot paths. The recorded sample below compares an older native-Python baseline with current published Rust-backed artifacts and keeps package versions fixed so the comparison is repeatable on the same machine. The benchmark auto-calibrates per-operation inner loops and aggregates multiple process runs to reduce timer, GC, and scheduler noise.

Recorded sample (uv run python scripts/benchmark_core_local.py --iterations 50 --warmup 5 --target-batch-ms 100 --process-runs 3 --python-baseline-version 0.21.2 --pyo3-version 0.26.3 --rust-crate-version 0.4.4, 2026-07-03):

Baseline: PyPI dcex==0.21.2 native Python implementation = 1.00x. Rust-backed Python: PyPI dcex==0.26.3; Rust native: crates.io dcex==0.4.4.

Operation Rust-backed Python Rust native
Cryptographic hash 92.45x 113.10x
Schnorr signature 607.72x 596.91x
Transaction payload signing 491.29x 514.83x
Layer Command Output
Local CPU-bound release artifacts uv run python scripts/benchmark_core_local.py --iterations 50 --warmup 5 --target-batch-ms 100 --process-runs 3 --python-baseline-version 0.21.2 --pyo3-version 0.26.3 --rust-crate-version 0.4.4 Speedup table
Optional local CPU-bound CSV output uv run python scripts/benchmark_core_local.py --csv benchmark_core.csv Ignored local CSV file

The Python benchmark scripts install PyPI packages into temporary target directories with uv pip install --target, then compile the Rust benchmark harness against the requested crates.io package version. They do not mutate the current environment. Use --python-baseline-version, --pyo3-version, and --rust-crate-version when you need to compare against other published artifacts.

Release Publishing

The release workflow detects Conventional Commit changes on main and plans Python and Rust releases independently. A bumped Python release builds wheels and publishes the Python package to PyPI. If no Python version bump is detected, PyPI is not updated.

The Rust crate has an independent version in crates/dcex/Cargo.toml and is published from rust-v* tags. For example, rust-vX.Y.Z publishes crate version X.Y.Z to crates.io and creates a separate GitHub Release. The crates/dcex-python package is an internal PyO3 build crate and is not published to crates.io; the Python package version is managed only in pyproject.toml.

License

This project is licensed under the MIT License.

Support

Disclaimer

Cryptocurrency trading involves significant risk. This library is provided as-is without any warranty. Users are responsible for their own trading decisions and risk management.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dcex-0.28.0.tar.gz (509.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dcex-0.28.0-cp312-cp312-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.12Windows x86-64

dcex-0.28.0-cp312-cp312-manylinux_2_34_x86_64.whl (10.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

dcex-0.28.0-cp312-cp312-macosx_11_0_arm64.whl (10.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file dcex-0.28.0.tar.gz.

File metadata

  • Download URL: dcex-0.28.0.tar.gz
  • Upload date:
  • Size: 509.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for dcex-0.28.0.tar.gz
Algorithm Hash digest
SHA256 495e114f911c516ff014627dee604517511a5cfc239ec9dd190ed7037c4ae4f9
MD5 0993e17da407fefad9c6191ee2815f12
BLAKE2b-256 c6e07faa6530d6aabb6a134ee97851e14bf9197cf8b7ea4b1dfeec3073f3c1b4

See more details on using hashes here.

File details

Details for the file dcex-0.28.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: dcex-0.28.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 11.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for dcex-0.28.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7422ebf932d15cac4813e37cd51341c02efdc3c8fe89ab4747217033135b360a
MD5 55fd14524b89a89268c3f6e7c7c9637b
BLAKE2b-256 6dff525f288225e9156271654f18e9e44eb43e685c46208b9c516217cf3b297c

See more details on using hashes here.

File details

Details for the file dcex-0.28.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

  • Download URL: dcex-0.28.0-cp312-cp312-manylinux_2_34_x86_64.whl
  • Upload date:
  • Size: 10.8 MB
  • Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for dcex-0.28.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7be467452f62358483599bd0fa61c9e9b25ef9b667d62401b61c7f1cc5b18783
MD5 43df62662e99fcae1092cfef7f9daf06
BLAKE2b-256 89a3635c936a1c45d1a3cef56830c17f31e31782a4980e1d90b80b5dbb861960

See more details on using hashes here.

File details

Details for the file dcex-0.28.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: dcex-0.28.0-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 10.1 MB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for dcex-0.28.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d6535eebaeb00039b4f2da50e559f0e3b710e2494d957a203989538c9cac5319
MD5 1f0c9bb22d43be67344e6d7a7edf3454
BLAKE2b-256 092788682a72c5927efd799dd9d6637458a72c5a76148391e0bdb483b95e3506

See more details on using hashes here.

Release history Release notifications | RSS feed

0.31.0

4 files

0.30.0

4 files

0.29.1

4 files

0.29.0

4 files

0.28.5

4 files

0.28.4

4 files

0.28.3

4 files

0.28.2

4 files

0.28.1

4 files

This release

0.28.0 This release

4 files

0.27.0

4 files

0.26.3

4 files

0.26.2

4 files

0.26.1

4 files

0.26.0

4 files

0.25.0

4 files

0.24.2

4 files

0.24.1

4 files

0.24.0

4 files

0.23.0

4 files

0.22.0

4 files

0.21.2

2 files

0.21.1

2 files

0.21.0

2 files

0.20.3

2 files

0.20.2

2 files

0.20.1

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.1

2 files

0.10.0

2 files

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.4

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page