AI Trading Bot Integration with Tinkoff Invest API

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI Trading Bot Integration with Tinkoff Invest API
Medium
~2-3 business days
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

Интеграция 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 на российских рынках.