Интеграция AI-трейдинг-бота с Interactive Brokers API
Interactive Brokers — один из лидирующих брокеров для алготрейдинга: широкий охват активов (акции, опционы, futures, Forex, крипто), низкие комиссии, надёжный API. Интеграция требует понимания нескольких API-слоёв.
API варианты
TWS API (Trader Workstation)
Классический интерфейс через TWS клиент:
- Требует запущенного TWS или IB Gateway
- Протокол: бинарный через TCP сокет
- Python client:
ib_insync(async, recommended) или официальныйibapi - Latency: ~1–5ms для ордеров
Client Portal API
REST API через IBKR Client Portal Gateway:
- Современный REST/WebSocket интерфейс
- Не требует TWS, но нужен gateway процесс
- Аутентификация: SSO через браузер (неудобно для автоматизации)
FIX API
Для профессиональных клиентов: стандартный финансовый протокол. Lowest latency, наиболее контролируемый.
Python интеграция с ib_insync
from ib_insync import *
import asyncio
ib = IB()
await ib.connectAsync('127.0.0.1', 7497, clientId=1)
# Определение инструмента
contract = Stock('AAPL', 'SMART', 'USD')
await ib.qualifyContractsAsync(contract)
# Получение рыночных данных
bars = await ib.reqHistoricalDataAsync(
contract,
endDateTime='',
durationStr='1 Y',
barSizeSetting='1 day',
whatToShow='TRADES',
useRTH=True
)
df = util.df(bars)
# Real-time streaming
def on_bar_update(bars, has_new_bar):
if has_new_bar:
latest = bars[-1]
run_ml_strategy(latest) # Запуск ML модели
bars = ib.reqRealTimeBars(contract, 5, 'TRADES', False)
bars.updateEvent += on_bar_update
# Размещение ордера
order = LimitOrder('BUY', 100, 185.50)
order.orderType = 'LMT'
order.tif = 'DAY'
order.outsideRth = False
trade = ib.placeOrder(contract, order)
await asyncio.sleep(1)
print(f"Order status: {trade.orderStatus.status}")
Управление ордерами и позициями
Типы ордеров IBKR
- Market, Limit, Stop, Stop-Limit — стандартные
- TWAP, VWAP — алгоритмические ордера IBKR
- Adaptive Orders — IBKR собственный алгоритм минимизации impact
- Bracket Orders: входной + take profit + stop loss одним запросом
Portfolio Management
# Получение текущих позиций
positions = ib.positions()
portfolio = ib.portfolio() # Позиции с market value
# Real-time P&L
pnl = ib.pnl()
pnl_single = ib.pnlSingle(account='DU12345', conId=contract.conId)
# Account summary
account_values = ib.accountValues()
buying_power = next(v for v in account_values if v.tag == 'BuyingPower')
Pre-trade Risk Controls
IBKR имеет собственные risk checks, но рекомендуется программный контроль:
def pre_trade_check(symbol, side, quantity, price):
"""Pre-trade risk validation"""
# Check buying power
bp = get_buying_power()
order_value = quantity * price
if order_value > bp * 0.2: # Не более 20% капитала на одну сделку
raise RiskException("Order too large for available buying power")
# Check existing position
existing = get_position(symbol)
if side == 'SELL' and existing < quantity:
raise RiskException("Insufficient position to sell")
# Daily loss limit
daily_pnl = get_daily_pnl()
if daily_pnl < -MAX_DAILY_LOSS:
raise RiskException("Daily loss limit reached")
return True
Регуляторные ограничения через IBKR
- PDT (Pattern Day Trader): автоматическое отслеживание, <$25k → ограничения
- Short selling: availability check обязателен перед short order
- Options: разные уровни доступа (Level 1–4) требуют заявки
- Margin requirements: автоматическая проверка IBKR
Мониторинг и алерты
# Error handling
def on_error(reqId, errorCode, errorString, contract):
if errorCode in [201, 203]: # Order rejected
alert(f"Order rejected: {errorString}")
elif errorCode == 162: # Data issue
log.warning(f"Market data issue: {errorString}")
ib.errorEvent += on_error
# Disconnection handling
def on_disconnected():
log.error("IB disconnected - attempting reconnect")
asyncio.create_task(reconnect())
ib.disconnectedEvent += on_disconnected
Срок интеграции: 2–4 недели для базовой интеграции, ещё 2–4 недели для production-ready error handling, risk controls, monitoring.







