https://github.com/vitalets/tinkoff-robot
Пример торгового робота для Tinkoff Invest API (Node.js)
https://github.com/vitalets/tinkoff-robot
Last synced: 5 months ago
JSON representation
Пример торгового робота для Tinkoff Invest API (Node.js)
- Host: GitHub
- URL: https://github.com/vitalets/tinkoff-robot
- Owner: vitalets
- Created: 2022-05-23T19:03:55.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-05-25T14:14:28.000Z (over 3 years ago)
- Last Synced: 2025-04-19T12:14:09.270Z (6 months ago)
- Language: TypeScript
- Size: 244 KB
- Stars: 22
- Watchers: 2
- Forks: 14
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# tinkoff-robot
Пример торгового робота на Node.js с использованием [Tinkoff Invest Api v2](https://tinkoff.github.io/investAPI/).* использует комбинацию нескольких сигналов
* работает одновременно с несколькими figi
* учитывает комиссию брокера
* не требует баз данных## Содержание
- [Подготовка](#%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0)
- [Настройка окружения](#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)
- [Конфигурация робота](#%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%B0)
- [Описание стратегии](#%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B8)
- [Запуск на исторических данных](#%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BD%D0%B0-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
- [Запуск на рыночных данных](#%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BD%D0%B0-%D1%80%D1%8B%D0%BD%D0%BE%D1%87%D0%BD%D1%8B%D1%85-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
- [Визуализация](#%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)
- [Деплой](#%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9)
- [Связанные проекты](#%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B)
- [Лицензия](#%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F)## Подготовка
1. Склонируйте репозиторий
```
git clone https://github.com/vitalets/tinkoff-robot.git
```
2. Установите зависимости
```
cd tinkoff-robot && npm ci
```## Настройка окружения
Создайте в корне файл `.env` и положите в него [токен](https://tinkoff.github.io/investAPI/token/) и номера счетов:
```
# Тинькоф 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](src/config.ts), все поля с комментариями.
Роботу можно одновременно задать несколько figi с разными параметрами стратегии.## Описание стратегии
Cтратегия использует комбинацию 3-х сигналов на покупку / продажу:* отклонение текущей цены (takeProfit / stopLoss)
* пересечение скользящих средних (SMA)
* индекс относительной силы (RSI)Сейчас используется простейший вариант - если сработал хотя бы один сигнал, применяем его.
После срабатывания сигнала проверяется достаточно ли средств для этого действия.
Если средств достаточно, выставляется лимит-заявка.
При повторном сигнале заявка перевыставляется с более актуальной ценой.
Также алгоритм сейчас действует аккуратно: больше инструмент уже куплен, то дополнительно он не докупается.## Запуск на исторических данных
Проверка робота на исторических данных сделана с помощью [tinkoff-local-broker](https://github.com/vitalets/tinkoff-local-broker).1. [Запустите](https://github.com/vitalets/tinkoff-local-broker#запуск-сервера) локальный брокер в отдельном окне терминала
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
```Пример графика:
## Деплой
Деплой робота в виде serverless-функции на [Яндекс.Облако](https://cloud.yandex.ru/), запускаемой по расписанию:1. Установите и настройте [yc-cli](https://cloud.yandex.ru/docs/cli/quickstart)
2. Создайте [сервисный аккаунт](https://cloud.yandex.ru/docs/iam/operations/sa/create) `tinkoff-robot-sa` и выдайте ему роль `serverless.functions.invoker`
3. Запустите деплой функции:
```bash
npm run deploy
```
4. Создайте [триггер типа таймер](https://cloud.yandex.ru/docs/functions/concepts/trigger/timer) с cron-выражением `0/5 7-16 ? * 2-6 *` - запуск **каждые 5 минут с 10 до 19 (msk) по будням**. В качестве функции укажите триггеру `tinkoff-robot`
5. Проверьте в логах функции, что вызовы происходятВ последующем для деплоя новой версии достаточно вызвать:
```
npm run deploy
```## Связанные проекты
* [tinkoff-invest-api](https://github.com/vitalets/tinkoff-invest-api) - Node.js SDK для работы с Tinkoff Invest API
* [tinkoff-local-broker](https://github.com/vitalets/tinkoff-local-broker) - Локальный сервер для тестирования торговых роботов
* [debut-js/Indicators](https://github.com/debut-js/Indicators) - Расчет индикаторов## Лицензия
Apache 2.0