Интеграция с CCXT (унифицированный API бирж)
CCXT (CryptoCurrency eXchange Trading Library) — библиотека с поддержкой 100+ бирж через единый интерфейс. Доступна для Python, JavaScript/TypeScript и PHP. Это де-факто стандарт для быстрой интеграции с несколькими биржами без написания кастомных коннекторов.
Установка
pip install ccxt # Python
npm install ccxt # JavaScript
Базовое использование (Python)
import ccxt
import asyncio
# Создание клиента
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True, # Автоматическое соблюдение rate limits
'options': {
'defaultType': 'future', # 'spot' или 'future'
},
})
# Или async версия
exchange_async = ccxt.pro.binance({ # ccxt.pro для WebSocket
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
Рыночные данные
# Загрузка OHLCV
ohlcv = exchange.fetch_ohlcv('BTC/USDT', timeframe='1h', limit=500)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
# Order book
orderbook = exchange.fetch_order_book('BTC/USDT', limit=20)
best_bid = orderbook['bids'][0][0]
best_ask = orderbook['asks'][0][0]
spread = best_ask - best_bid
# Ticker
ticker = exchange.fetch_ticker('BTC/USDT')
print(f"Last: {ticker['last']}, 24h Volume: {ticker['quoteVolume']:.0f} USDT")
Торговые операции
# Проверка баланса
balance = exchange.fetch_balance()
usdt_free = balance['USDT']['free']
btc_total = balance['BTC']['total']
# Market order
order = exchange.create_order(
symbol='BTC/USDT',
type='market',
side='buy',
amount=0.001, # BTC
)
# Limit order с дополнительными параметрами
limit_order = exchange.create_order(
symbol='BTC/USDT',
type='limit',
side='buy',
amount=0.001,
price=43000.0,
params={
'timeInForce': 'GTC', # Good Till Cancelled
'postOnly': True, # только maker order
'clientOrderId': 'my-order-001',
}
)
# Отмена ордера
exchange.cancel_order(order['id'], 'BTC/USDT')
# История ордеров
my_orders = exchange.fetch_orders('BTC/USDT', limit=50)
open_orders = exchange.fetch_open_orders('BTC/USDT')
trades = exchange.fetch_my_trades('BTC/USDT', limit=100)
CCXT Pro: WebSocket
import asyncio
import ccxt.pro as ccxtpro
async def watch_market_data():
exchange = ccxtpro.binance({'enableRateLimit': True})
# Подписка на order book updates
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(f"Best bid: {orderbook['bids'][0][0]}, Best ask: {orderbook['asks'][0][0]}")
async def watch_my_orders():
exchange = ccxtpro.binance({
'apiKey': 'YOUR_KEY',
'secret': 'YOUR_SECRET',
})
while True:
orders = await exchange.watch_orders('BTC/USDT')
for order in orders:
print(f"Order update: {order['id']} - {order['status']}")
# Запуск нескольких потоков
async def main():
await asyncio.gather(
watch_market_data(),
watch_my_orders(),
)
asyncio.run(main())
Обработка ошибок
from ccxt.base.errors import (
NetworkError, ExchangeError, InsufficientFunds,
InvalidOrder, OrderNotFound, RateLimitExceeded
)
async def safe_place_order(exchange, symbol, side, amount, price=None):
for attempt in range(3):
try:
return await exchange.create_order(
symbol=symbol,
type='limit' if price else 'market',
side=side,
amount=amount,
price=price,
)
except InsufficientFunds as e:
raise # Не повторяем
except RateLimitExceeded:
await asyncio.sleep(exchange.rateLimit / 1000 * 2)
except NetworkError as e:
if attempt == 2:
raise
await asyncio.sleep(2 ** attempt)
except ExchangeError as e:
logger.error(f"Exchange error: {e}")
raise
Унификация символов
CCXT использует единый формат символов BASE/QUOTE (например BTC/USDT), но при необходимости предоставляет биржеспецифичный символ:
market = exchange.market('BTC/USDT')
exchange_symbol = market['id'] # 'BTCUSDT' на Binance, 'BTC/USDT' на Kraken
Ограничения CCXT
- Не всегда актуален при изменениях API биржи (задержка обновлений)
- Overhead по сравнению с прямой интеграцией
- Не поддерживает все специфические функции каждой биржи
- CCXT Pro (WebSocket) требует отдельной лицензии для коммерческого использования
Для прототипирования и небольших проектов CCXT — отличный выбор. Для high-frequency trading или систем с критичным latency лучше писать кастомные коннекторы.







