Skip to main content

A Lightweight Python Package for Low-Latency and Cross-Exchange Trading.

Project description

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 library for interacting with cryptocurrency exchanges. dcex offers full synchronous and asynchronous support across major exchanges, designed for speed, modularity, and ease of use.

Python License PyPI

📦 Installation

pip install dcex

or use uv to manage the project:

uv add dcex

🚀 Quick Start

Synchronous Usage

import dcex

client = dcex.binance()

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

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

📚 Supported Exchanges

Exchange Sync Support Async Support
Binance
Bybit
OKX
BitMart
BitMEX
Gate.io
Hyperliquid
BingX Developing Developing
KuCoin Developing Developing

🔍 Key Features

  • 📘 Product Table Manager for unifying trading instruments in different exchanges
  • 🔁 Sync & Async API clients with identical interfaces
  • ⚡ Optimized for low-latency, high-frequency trading

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 will actually used
product_type The type we will use, e.g. spot, inverse, swap, futures
exchange_type The type the exchange will actually used, e.g. linear, INVERSE, perp... different exchanges have different types, pretty annoying...
base_symbol The base symbol, e.g. BTC
quote_symbol The quote symbol, 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.

How to use Product Table Manager?

In most cases, we have handled the case, but if you have any specific use cases, you can use the ptm to get the information you want.

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)

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

Testing

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

uv run pytest

Public live exchange tests are opt-in. They use network access but do not require API keys:

uv run pytest -m "live and not private"

Private live tests require the relevant exchange API key environment variables. Use not stateful and not generated for the normal per-exchange key rotation workflow:

uv run pytest tests/sync_support/binance tests/async_support/binance -m "live and private and not stateful and not generated"

Stateful tests can change exchange or account settings, such as leverage or position mode. Run them only when that is intentional:

uv run pytest tests/sync_support/okx tests/async_support/okx -m "live and private and stateful"

Generated-report tests request server-side report generation or downloadable files, such as OKX monthly statements. Run them separately because they can consume low-frequency report quotas:

uv run pytest tests/sync_support/okx tests/async_support/okx -m "live and private and generated"

Examples

Examples are under examples/sync and examples/async. They are concise read-only usage examples:

  • *_public.py examples do not require API keys.
  • *_private_readonly.py examples require credentials but avoid order placement, cancellations, withdrawals, transfers, leverage changes, and account-mode changes.
  • Endpoint validation belongs in tests, not in examples.

📄 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.

Project details


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.10.0.tar.gz (171.4 kB view details)

Uploaded Source

Built Distribution

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

dcex-0.10.0-py3-none-any.whl (243.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: dcex-0.10.0.tar.gz
  • Upload date:
  • Size: 171.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","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.10.0.tar.gz
Algorithm Hash digest
SHA256 a6741e56a7cabaf5198727f3bc85257208215e437d7df9174535835fa95c42a7
MD5 e0fa43bd2cd464c957a666a86d6904ba
BLAKE2b-256 a21e3446d0337cd6818b6ccd73f1219496368f454a09636c51ac7267d9e95384

See more details on using hashes here.

File details

Details for the file dcex-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: dcex-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 243.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","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.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 204c3bbe72a28e938bf2dc786f56bbe1680343161723526f19e27e6d8764e4c3
MD5 f88e41c07a45861522db741f6cc37595
BLAKE2b-256 533a4bb035deed9e060dcd3a5c10c28a667aab3c621f77ea33c8a40cbf877edd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page