Интеграция AI-трейдинг-бота с Tinkoff Invest API
Tinkoff Invest API — одна из наиболее удобных платформ для algo trading на российском рынке: gRPC API с хорошей документацией, sandbox для тестирования, низкий барьер входа.
Возможности API
- Торговля акциями ММВБ, облигациями, фьючерсами (FORTS), ETF
- Тарифная зависимость: режим API доступен на тарифах Трейдер и выше
- Streaming данные через gRPC stream (стаканы, сделки, свечи)
- Sandbox окружение для тестирования без реальных денег
Python SDK интеграция
from tinkoff.invest import Client, CandleInterval, OrderDirection, OrderType
from tinkoff.invest.utils import quotation_to_decimal
from datetime import datetime, timedelta
import pandas as pd
TOKEN = "your_token_here"
with Client(TOKEN) as client:
# Получение исторических свечей
candles = client.market_data.get_candles(
figi="BBG004730N88", # SBER figi
from_=datetime.now() - timedelta(days=30),
to=datetime.now(),
interval=CandleInterval.CANDLE_INTERVAL_HOUR
)
df = pd.DataFrame([{
'time': c.time,
'open': float(quotation_to_decimal(c.open)),
'high': float(quotation_to_decimal(c.high)),
'low': float(quotation_to_decimal(c.low)),
'close': float(quotation_to_decimal(c.close)),
'volume': c.volume
} for c in candles.candles])
# ML предсказание
signal = your_ml_model.predict(df)
# Получение стакана
order_book = client.market_data.get_order_book(
figi="BBG004730N88", depth=20
)
# Размещение лимитного ордера
if signal == 'buy':
current_price = float(quotation_to_decimal(order_book.asks[0].price))
from tinkoff.invest import PostOrderRequest
from tinkoff.invest.schemas import MoneyValue
from tinkoff.invest import Quotation
order = client.orders.post_order(
figi="BBG004730N88",
quantity=10, # лотов
price=Quotation(units=int(current_price), nano=0),
direction=OrderDirection.ORDER_DIRECTION_BUY,
account_id="your_account_id",
order_type=OrderType.ORDER_TYPE_LIMIT,
order_id=f"bot_{datetime.now().timestamp()}"
)
print(f"Order placed: {order.order_id}")
Streaming данные в реальном времени
from tinkoff.invest import AsyncClient
from tinkoff.invest.async_services import AsyncMarketDataStreamService
import asyncio
async def run_strategy():
async with AsyncClient(TOKEN) as client:
async def request_iterator():
yield {
"subscribe_candles_request": {
"subscription_action": "SUBSCRIPTION_ACTION_SUBSCRIBE",
"instruments": [{"figi": "BBG004730N88", "interval": "CANDLE_INTERVAL_1_MIN"}]
}
}
while True:
await asyncio.sleep(1)
async for market_data in client.market_data_stream.market_data_stream(request_iterator()):
if market_data.candle:
candle = market_data.candle
close = float(quotation_to_decimal(candle.close))
# Real-time ML inference
signal = update_and_predict(close)
if signal:
await execute_signal(client, signal)
asyncio.run(run_strategy())
Песочница (Sandbox)
Обязательный этап перед live trading:
from tinkoff.invest import SandboxClient
with SandboxClient(TOKEN) as sandbox:
# Создание sandbox аккаунта
account = sandbox.sandbox.open_sandbox_account()
account_id = account.account_id
# Пополнение виртуальным рублём
sandbox.sandbox.sandbox_pay_in(
account_id=account_id,
amount={"currency": "RUB", "units": 1000000, "nano": 0}
)
# Все торговые операции — как в реальном API, но без денег
# Тестирование на историческом периоде через воспроизведение
Особенности и ограничения
Rate Limits
- Рыночные данные: 300 запросов/минута
- Торговые операции: 100 ордеров/минута
- Streaming: до 50 инструментов на один поток
Лотность Российские акции торгуются лотами (SBER — 10 акций = 1 лот). Учитывать при позиционировании.
FIGI vs. Ticker
API использует FIGI (Financial Instrument Global Identifier). Маппинг: client.instruments.find_instrument(query="SBER") → FIGI.
Срок интеграции: 1–2 недели для базовой интеграции + sandbox тестирование. Tinkoff API — оптимальный выбор для старта algo trading на российских рынках.







