Loading...
Loading...
CCXT cryptocurrency exchange library for Python developers. Covers both REST API (standard) and WebSocket API (real-time). Helps install CCXT, connect to exchanges, fetch market data, place orders, stream live tickers/orderbooks, handle authentication, and manage errors in Python. Use when working with crypto exchanges in Python projects, trading bots, data analysis, or portfolio management. Supports both sync and async (asyncio) usage.
npx skill4agent add ccxt/ccxt ccxt-pythonpip install ccxtpip install ccxtpip install orjson # Faster JSON parsing
pip install coincurve # Faster ECDSA signing (45ms → 0.05ms)import ccxt
exchange = ccxt.binance()
exchange.load_markets()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker)import asyncio
import ccxt.async_support as ccxt
async def main():
exchange = ccxt.binance()
await exchange.load_markets()
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker)
await exchange.close() # Important!
asyncio.run(main())import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(ticker) # Live updates!
await exchange.close()
asyncio.run(main())| Import | For REST | For WebSocket |
|---|---|---|
| Sync | | (WebSocket requires async) |
| Async | | |
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | | |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
import ccxt
# Public API (no authentication)
exchange = ccxt.binance({
'enableRateLimit': True # Recommended!
})
# Private API (with authentication)
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True
})import ccxt.async_support as ccxt
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True
})
# Always close when done
await exchange.close()import ccxt.pro as ccxtpro
# Public WebSocket
exchange = ccxtpro.binance()
# Private WebSocket (with authentication)
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
# Always close when done
await exchange.close()# Load all available trading pairs
exchange.load_markets()
# Access market information
btc_market = exchange.market('BTC/USDT')
print(btc_market['limits']['amount']['min']) # Minimum order amount# Single ticker
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last']) # Last price
print(ticker['bid']) # Best bid
print(ticker['ask']) # Best ask
print(ticker['volume']) # 24h volume
# Multiple tickers (if supported)
tickers = exchange.fetch_tickers(['BTC/USDT', 'ETH/USDT'])# Full orderbook
orderbook = exchange.fetch_order_book('BTC/USDT')
print(orderbook['bids'][0]) # [price, amount]
print(orderbook['asks'][0]) # [price, amount]
# Limited depth
orderbook = exchange.fetch_order_book('BTC/USDT', 5) # Top 5 levels# Buy limit order
order = exchange.create_limit_buy_order('BTC/USDT', 0.01, 50000)
print(order['id'])
# Sell limit order
order = exchange.create_limit_sell_order('BTC/USDT', 0.01, 60000)
# Generic limit order
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000)# Buy market order
order = exchange.create_market_buy_order('BTC/USDT', 0.01)
# Sell market order
order = exchange.create_market_sell_order('BTC/USDT', 0.01)
# Generic market order
order = exchange.create_order('BTC/USDT', 'market', 'sell', 0.01)balance = exchange.fetch_balance()
print(balance['BTC']['free']) # Available balance
print(balance['BTC']['used']) # Balance in orders
print(balance['BTC']['total']) # Total balance# Open orders
open_orders = exchange.fetch_open_orders('BTC/USDT')
# Closed orders
closed_orders = exchange.fetch_closed_orders('BTC/USDT')
# All orders (open + closed)
all_orders = exchange.fetch_orders('BTC/USDT')
# Single order by ID
order = exchange.fetch_order(order_id, 'BTC/USDT')# Recent public trades
trades = exchange.fetch_trades('BTC/USDT', limit=10)
# Your trades (requires authentication)
my_trades = exchange.fetch_my_trades('BTC/USDT')# Cancel single order
exchange.cancel_order(order_id, 'BTC/USDT')
# Cancel all orders for a symbol
exchange.cancel_all_orders('BTC/USDT')import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(ticker['last'], ticker['timestamp'])
await exchange.close()
asyncio.run(main())async def main():
exchange = ccxtpro.binance()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print('Best bid:', orderbook['bids'][0])
print('Best ask:', orderbook['asks'][0])
await exchange.close()
asyncio.run(main())async def main():
exchange = ccxtpro.binance()
while True:
trades = await exchange.watch_trades('BTC/USDT')
for trade in trades:
print(trade['price'], trade['amount'], trade['side'])
await exchange.close()
asyncio.run(main())async def main():
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
while True:
orders = await exchange.watch_orders('BTC/USDT')
for order in orders:
print(order['id'], order['status'], order['filled'])
await exchange.close()
asyncio.run(main())async def main():
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
while True:
balance = await exchange.watch_balance()
print('BTC:', balance['BTC'])
print('USDT:', balance['USDT'])
await exchange.close()
asyncio.run(main())async def main():
exchange = ccxtpro.binance()
symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT']
while True:
# Watch all symbols concurrently
tickers = await exchange.watch_tickers(symbols)
for symbol, ticker in tickers.items():
print(symbol, ticker['last'])
await exchange.close()
asyncio.run(main())fetchTicker(symbol)fetchTickers([symbols])fetchBidsAsks([symbols])fetchLastPrices([symbols])fetchMarkPrices([symbols])fetchOrderBook(symbol, limit)fetchOrderBooks([symbols])fetchL2OrderBook(symbol)fetchL3OrderBook(symbol)fetchTrades(symbol, since, limit)fetchMyTrades(symbol, since, limit)fetchOrderTrades(orderId, symbol)fetchOHLCV(symbol, timeframe, since, limit)fetchIndexOHLCV(symbol, timeframe)fetchMarkOHLCV(symbol, timeframe)fetchPremiumIndexOHLCV(symbol, timeframe)fetchBalance()fetchAccounts()fetchLedger(code, since, limit)fetchLedgerEntry(id, code)fetchTransactions(code, since, limit)fetchDeposits(code, since, limit)fetchWithdrawals(code, since, limit)fetchDepositsWithdrawals(code, since, limit)createOrder(symbol, type, side, amount, price, params)createLimitOrder(symbol, side, amount, price)createMarketOrder(symbol, side, amount)createLimitBuyOrder(symbol, amount, price)createLimitSellOrder(symbol, amount, price)createMarketBuyOrder(symbol, amount)createMarketSellOrder(symbol, amount)createMarketBuyOrderWithCost(symbol, cost)createStopLimitOrder(symbol, side, amount, price, stopPrice)createStopMarketOrder(symbol, side, amount, stopPrice)createStopLossOrder(symbol, side, amount, stopPrice)createTakeProfitOrder(symbol, side, amount, takeProfitPrice)createTrailingAmountOrder(symbol, side, amount, trailingAmount)createTrailingPercentOrder(symbol, side, amount, trailingPercent)createTriggerOrder(symbol, side, amount, triggerPrice)createPostOnlyOrder(symbol, side, amount, price)createReduceOnlyOrder(symbol, side, amount, price)createOrders([orders])createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)fetchOrder(orderId, symbol)fetchOrders(symbol, since, limit)fetchOpenOrders(symbol, since, limit)fetchClosedOrders(symbol, since, limit)fetchCanceledOrders(symbol, since, limit)fetchOpenOrder(orderId, symbol)fetchOrdersByStatus(status, symbol)cancelOrder(orderId, symbol)cancelOrders([orderIds], symbol)cancelAllOrders(symbol)editOrder(orderId, symbol, type, side, amount, price)fetchBorrowRate(code)fetchBorrowRates([codes])fetchBorrowRateHistory(code, since, limit)fetchCrossBorrowRate(code)fetchIsolatedBorrowRate(symbol, code)borrowMargin(code, amount, symbol)repayMargin(code, amount, symbol)fetchLeverage(symbol)setLeverage(leverage, symbol)fetchLeverageTiers(symbols)fetchMarketLeverageTiers(symbol)setMarginMode(marginMode, symbol)fetchMarginMode(symbol)fetchPosition(symbol)fetchPositions([symbols])fetchPositionsForSymbol(symbol)fetchPositionHistory(symbol, since, limit)fetchPositionsHistory(symbols, since, limit)fetchPositionMode(symbol)setPositionMode(hedged, symbol)closePosition(symbol, side)closeAllPositions()fetchFundingRate(symbol)fetchFundingRates([symbols])fetchFundingRateHistory(symbol, since, limit)fetchFundingHistory(symbol, since, limit)fetchFundingInterval(symbol)fetchSettlementHistory(symbol, since, limit)fetchMySettlementHistory(symbol, since, limit)fetchOpenInterest(symbol)fetchOpenInterests([symbols])fetchOpenInterestHistory(symbol, timeframe, since, limit)fetchLiquidations(symbol, since, limit)fetchMyLiquidations(symbol, since, limit)fetchOption(symbol)fetchOptionChain(code)fetchGreeks(symbol)fetchVolatilityHistory(code, since, limit)fetchUnderlyingAssets()fetchTradingFee(symbol)fetchTradingFees([symbols])fetchTradingLimits([symbols])fetchTransactionFee(code)fetchTransactionFees([codes])fetchDepositWithdrawFee(code)fetchDepositWithdrawFees([codes])fetchDepositAddress(code, params)fetchDepositAddresses([codes])fetchDepositAddressesByNetwork(code)createDepositAddress(code, params)fetchDeposit(id, code)fetchWithdrawal(id, code)fetchWithdrawAddresses(code)fetchWithdrawalWhitelist(code)withdraw(code, amount, address, tag, params)deposit(code, amount, params)transfer(code, amount, fromAccount, toAccount)fetchTransfer(id, code)fetchTransfers(code, since, limit)fetchConvertCurrencies()fetchConvertQuote(fromCode, toCode, amount)createConvertTrade(fromCode, toCode, amount)fetchConvertTrade(id)fetchConvertTradeHistory(code, since, limit)fetchMarkets()fetchCurrencies()fetchTime()fetchStatus()fetchBorrowInterest(code, symbol, since, limit)fetchLongShortRatio(symbol, timeframe, since, limit)fetchLongShortRatioHistory(symbol, timeframe, since, limit)watch*watchTicker(symbol)watchTickers([symbols])watchOrderBook(symbol)watchOrderBookForSymbols([symbols])watchTrades(symbol)watchOHLCV(symbol, timeframe)watchBidsAsks([symbols])watchBalance()watchOrders(symbol)watchMyTrades(symbol)watchPositions([symbols])watchPositionsForSymbol(symbol)create*cancel*edit*fetchMy*fetchBalancefetchLedgerfetchAccountswithdrawtransferdepositwatchBalancewatchOrderswatchMyTradeswatchPositions// Check if method is supported
if (exchange.has['fetchOHLCV']) {
const candles = await exchange.fetchOHLCV('BTC/USDT', '1h')
}
// Check multiple capabilities
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOHLCV: true,
// fetchMyTrades: true,
// fetchPositions: false,
// ...
// }fetch*watch*create*cancel*edit*set**Ws// HTTP Proxy
exchange.httpProxy = 'http://your-proxy-host:port'
// HTTPS Proxy
exchange.httpsProxy = 'https://your-proxy-host:port'
// SOCKS Proxy
exchange.socksProxy = 'socks://your-proxy-host:port'
// Proxy with authentication
exchange.httpProxy = 'http://user:pass@proxy-host:port'exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxyexchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}*WscreateOrderWscreateLimitOrderWscreateMarketOrderWscreateLimitBuyOrderWscreateLimitSellOrderWscreateMarketBuyOrderWscreateMarketSellOrderWscreateStopLimitOrderWscreateStopMarketOrderWscreateStopLossOrderWscreateTakeProfitOrderWscreateTrailingAmountOrderWscreateTrailingPercentOrderWscreatePostOnlyOrderWscreateReduceOnlyOrderWseditOrderWscancelOrderWscancelOrdersWscancelAllOrdersWsfetchOrderWsfetchOrdersWsfetchOpenOrdersWsfetchClosedOrdersWsfetchMyTradesWsfetchBalanceWsfetchPositionWsfetchPositionsWsfetchPositionsForSymbolWsfetchTradingFeesWs*Wsconst order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)if (exchange.has['createOrderWs']) {
// Exchange supports WebSocket order creation
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} else {
// Fall back to REST
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
}import os
# During instantiation (recommended)
exchange = ccxt.binance({
'apiKey': os.environ.get('BINANCE_API_KEY'),
'secret': os.environ.get('BINANCE_SECRET'),
'enableRateLimit': True
})
# After instantiation
exchange.apiKey = os.environ.get('BINANCE_API_KEY')
exchange.secret = os.environ.get('BINANCE_SECRET')try:
balance = exchange.fetch_balance()
print('Authentication successful!')
except ccxt.AuthenticationError:
print('Invalid API credentials')BaseError
├─ NetworkError (recoverable - retry)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (non-recoverable - don't retry)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupportedimport ccxt
try:
ticker = exchange.fetch_ticker('BTC/USDT')
except ccxt.NetworkError as e:
print('Network error - retry:', str(e))
except ccxt.ExchangeError as e:
print('Exchange error - do not retry:', str(e))
except Exception as e:
print('Unknown error:', str(e))try:
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000)
except ccxt.InsufficientFunds:
print('Not enough balance')
except ccxt.InvalidOrder:
print('Invalid order parameters')
except ccxt.RateLimitExceeded:
print('Rate limit hit - wait before retrying')
exchange.sleep(1000) # Wait 1 second
except ccxt.AuthenticationError:
print('Check your API credentials')def fetch_with_retry(max_retries=3):
for i in range(max_retries):
try:
return exchange.fetch_ticker('BTC/USDT')
except ccxt.NetworkError:
if i < max_retries - 1:
print(f'Retry {i + 1}/{max_retries}')
exchange.sleep(1000 * (i + 1)) # Exponential backoff
else:
raiseimport ccxt
exchange = ccxt.binance({'enableRateLimit': True})
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'])import asyncio
import ccxt.async_support as ccxt
async def main():
exchange = ccxt.binance({'enableRateLimit': True})
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker['last'])
await exchange.close()
asyncio.run(main())async def fetch_all():
exchanges = [
ccxt.binance({'enableRateLimit': True}),
ccxt.coinbase({'enableRateLimit': True}),
ccxt.kraken({'enableRateLimit': True})
]
# Fetch concurrently
tasks = [ex.fetch_ticker('BTC/USDT') for ex in exchanges]
tickers = await asyncio.gather(*tasks, return_exceptions=True)
for ex, ticker in zip(exchanges, tickers):
if isinstance(ticker, Exception):
print(f'{ex.id}: ERROR - {ticker}')
else:
print(f'{ex.id}: ${ticker["last"]}')
await ex.close()
asyncio.run(fetch_all())exchange = ccxt.binance({
'enableRateLimit': True # Automatically throttles requests
})exchange.fetch_ticker('BTC/USDT')
exchange.sleep(1000) # Wait 1 second (milliseconds)
exchange.fetch_ticker('ETH/USDT')print(exchange.rateLimit) # Milliseconds between requestsawait# Wrong - returns coroutine, not data
async def wrong():
ticker = exchange.fetch_ticker('BTC/USDT') # Missing await!
print(ticker['last']) # ERROR
# Correct
async def correct():
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker['last']) # Works!# Wrong - WebSocket requires async
import ccxt.pro as ccxtpro
exchange = ccxtpro.binance()
ticker = exchange.watch_ticker('BTC/USDT') # ERROR: Need await!
# Correct
import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
ticker = await exchange.watch_ticker('BTC/USDT')
await exchange.close()
asyncio.run(main())# Wrong - resource leak
async def wrong():
exchange = ccxt.binance()
await exchange.fetch_ticker('BTC/USDT')
# Forgot to close!
# Correct
async def correct():
exchange = ccxt.binance()
try:
await exchange.fetch_ticker('BTC/USDT')
finally:
await exchange.close()# Wrong - blocks event loop
async def wrong():
exchange = ccxt.binance() # Sync import!
ticker = exchange.fetch_ticker('BTC/USDT') # Blocking!
# Correct
import ccxt.async_support as ccxt
async def correct():
exchange = ccxt.binance()
ticker = await exchange.fetch_ticker('BTC/USDT')
await exchange.close()# Wrong - wastes rate limits
while True:
ticker = exchange.fetch_ticker('BTC/USDT') # REST
print(ticker['last'])
exchange.sleep(1000)
# Correct - use WebSocket
import ccxt.pro as ccxtpro
async def correct():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT') # WebSocket
print(ticker['last'])
await exchange.close()pip install ccxt'enableRateLimit': Truebalance['BTC']['free']pip install --upgrade certifipip install orjsonpip install coincurve# Enable verbose logging
exchange.verbose = True
# Check exchange capabilities
print(exchange.has)
# {
# 'fetchTicker': True,
# 'fetchOrderBook': True,
# 'createOrder': True,
# ...
# }
# Check market information
print(exchange.markets['BTC/USDT'])
# Check last request/response
print(exchange.last_http_response)
print(exchange.last_json_response)