tinkoff-robot

Пример торгового робота для Tinkoff Invest API (Node.js)

Stars
19

tinkoff-robot

Пример торгового робота на Node.js с использованием Tinkoff Invest Api v2.

  • использует комбинацию нескольких сигналов
  • работает одновременно с несколькими figi
  • учитывает комиссию брокера
  • не требует баз данных

Содержание

Подготовка

  1. Склонируйте репозиторий
    git clone https://github.com/vitalets/tinkoff-robot.git
    
  2. Установите зависимости
    cd tinkoff-robot && npm ci
    

Настройка окружения

Создайте в корне файл .env и положите в него токен и номера счетов:

# Тинькоф API токен
TINKOFF_API_TOKEN=...
# ID боевого счете
REAL_ACCOUNT_ID=...
# ID счета в песочнице
SANDBOX_ACCOUNT_ID=...

Для создания счета в песочнице запустите: npx ts-node-esm scripts/create-account.ts

Для просмотра информации по всем счетам запустите: npm run accounts

Конфигурация робота

Конфиг находится в файле src/config.ts, все поля с комментариями. Роботу можно одновременно задать несколько figi с разными параметрами стратегии.

Описание стратегии

Cтратегия использует комбинацию 3-х сигналов на покупку / продажу:

  • отклонение текущей цены (takeProfit / stopLoss)
  • пересечение скользящих средних (SMA)
  • индекс относительной силы (RSI)

Сейчас используется простейший вариант - если сработал хотя бы один сигнал, применяем его.

После срабатывания сигнала проверяется достаточно ли средств для этого действия. Если средств достаточно, выставляется лимит-заявка. При повторном сигнале заявка перевыставляется с более актуальной ценой. Также алгоритм сейчас действует аккуратно: больше инструмент уже куплен, то дополнительно он не докупается.

Запуск на исторических данных

Проверка робота на исторических данных сделана с помощью tinkoff-local-broker.

  1. Запустите локальный брокер в отдельном окне терминала
  2. Установите нужный диапазон дат в файле scripts/run-bakctest.ts
  3. Запустите
    npm run backtest
    
[robot]: Запуск робота (песочница)
[portfolio]: Позиции загружены: 1
[portfolio]:      BBG004731354 1 x 401.05
[orders]: Заявки загружены: 0
[instrument_BBG004731354]: Загружаю 31 свечей для ROSN ...
[instrument_BBG004731354]: Свечи загружены: 525, текущая цена: 409
[strategy_BBG004731354]: Сигналы: profit=wait, rsi=wait, sma=wait (29.04.2022, 18:49:00)
Операции:
     29.04.2022, 15:54:00 Покупка ЦБ BBG004731354 (1) -404.3 rub
     29.04.2022, 16:04:00 Продажа ЦБ BBG004731354 (1) 403.95 rub
     29.04.2022, 16:35:00 Покупка ЦБ BBG004731354 (1) -404.05 rub
     29.04.2022, 17:11:00 Продажа ЦБ BBG004731354 (1) 406.1 rub
     29.04.2022, 18:11:00 Покупка ЦБ BBG004731354 (1) -408.9 rub
Прибыль: -0.010868%

Запуск на рыночных данных

Запуск робота на рыночных данных возможен в разных вариантах: по расписанию, либо в виде постоянного процесса. На длинных таймфреймах (>1мин) лучше запускать по расписанию.

Запуск робота в песочнице:

npm run market

Запуск робота на реальном счете:

npm run market:real

Также доступны еще два флага:

  • --dry-run - в этом случае производятся все действия кроме создания заявок (даже на боевом счете)
  • --cron - разовый запуск, а не процесс

Пример: разовый запуск робота на реальном счете без создания заявок:

npm run market:real -- --dry-run --cron

Визуализация

Для визуализации работы стратегии после прогона на исторических данных формируется график сигналов. Открыть график можно командой:

npm run chart

Пример графика: image

Деплой

Деплой робота в виде serverless-функции на Яндекс.Облако, запускаемой по расписанию:

  1. Установите и настройте yc-cli
  2. Создайте сервисный аккаунт tinkoff-robot-sa и выдайте ему роль serverless.functions.invoker
  3. Запустите деплой функции:
    npm run deploy
    
  4. Создайте триггер типа таймер с cron-выражением 0/5 7-16 ? * 2-6 * - запуск каждые 5 минут с 10 до 19 (msk) по будням. В качестве функции укажите триггеру tinkoff-robot
  5. Проверьте в логах функции, что вызовы происходят

В последующем для деплоя новой версии достаточно вызвать:

npm run deploy

Связанные проекты

Лицензия

Apache 2.0