Інтеграція бота з API Binance
Binance — найбільша криптобіржа за обсягом торгів. API добре задокументовано, стабільне та пропонує широкі можливості: spot, margin, futures та options. Для більшості торговельних ботів Binance — перший вибір завдяки ліквідності та зрілості API.
Типи Binance API
- Spot API: Базова торгівля, баланси та історія
- Margin API: Маржинальна торгівля
- Futures API (FAPI): USD-M perpetual futures
- Coin-M Futures (DAPI): COIN-M futures
- WebSocket Streams: Дані ринку в реальному часі
Підключення через CCXT
import ccxt.async_support as ccxt
# Spot
spot = ccxt.binance({
'apiKey': API_KEY,
'secret': SECRET,
'options': {'defaultType': 'spot'},
'enableRateLimit': True,
})
# Futures (USDT-M Perpetual)
futures = ccxt.binance({
'apiKey': API_KEY,
'secret': SECRET,
'options': {'defaultType': 'future'},
})
async def get_ticker(symbol: str):
return await spot.fetch_ticker(symbol)
async def place_futures_order(symbol: str, side: str, quantity: float, leverage: int = 10):
# Встановлюємо плече
await futures.set_leverage(leverage, symbol)
return await futures.create_order(symbol, 'market', side, quantity)
WebSocket для даних в реальному часі
import websockets, json, asyncio
async def subscribe_streams():
streams = [
'btcusdt@bookTicker', # найкращі bid/ask
'btcusdt@aggTrade', # агреговані угоди
'btcusdt@kline_1m', # свічки 1m
]
url = f"wss://stream.binance.com:9443/stream?streams={'/'.join(streams)}"
async with websockets.connect(url) as ws:
async for message in ws:
data = json.loads(message)
stream = data['stream']
payload = data['data']
if '@bookTicker' in stream:
process_book_ticker(payload)
elif '@aggTrade' in stream:
process_trade(payload)
elif '@kline' in stream:
process_kline(payload['k'])
User Data Stream (приватний WebSocket)
Для оновлення ордерів та балансів у реальному часі без polling:
async def start_user_data_stream():
# 1. Отримуємо listen key
listen_key = await get_listen_key() # REST: POST /api/v3/userDataStream
# 2. Підписуємось
url = f"wss://stream.binance.com:9443/ws/{listen_key}"
async with websockets.connect(url) as ws:
# 3. Keepalive кожні 30 хвилин
asyncio.create_task(keepalive_listen_key(listen_key))
async for message in ws:
event = json.loads(message)
if event['e'] == 'executionReport':
# Оновлення ордера
order_id = event['i']
status = event['X'] # NEW, PARTIALLY_FILLED, FILLED, CANCELED
filled_qty = event['z']
last_price = event['L']
process_order_update(order_id, status, filled_qty, last_price)
elif event['e'] == 'outboundAccountPosition':
# Оновлення балансу
for asset in event['B']:
process_balance_update(asset['a'], asset['f'], asset['l'])
Обмеження швидкості
Binance має два типи обмежень:
- Request Weight Limit: 6000 weight/хвилину. Різні endpoints мають різну вагу (GET /ticker/price = 1, GET /depth?limit=5000 = 250)
- Order Rate Limit: 10 ордерів/сек, 100,000 ордерів/24 години
# Перевіряємо заголовки rate limit у кожній відповіді
async def check_rate_limits(response_headers: dict):
used_weight = int(response_headers.get('X-MBX-USED-WEIGHT-1M', 0))
order_count = int(response_headers.get('X-MBX-ORDER-COUNT-10S', 0))
if used_weight > 5000: # > 83% обмеження — сповільнюємось
await asyncio.sleep(1)
if order_count > 8: # > 80% обмеження — пауза
await asyncio.sleep(0.5)
Інтеграція торговельного бота з API Binance (spot або futures) з потоком даних WebSocket та user data stream: 1–2 тижні. Binance sandbox (https://testnet.binance.vision/) доступна для тестування без реальних грошей.







