Пример торгового робота для Tinkoff Invest API (Node.js)
Пример торгового робота на Node.js с использованием Tinkoff Invest Api v2.
git clone https://github.com/vitalets/tinkoff-robot.git
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-х сигналов на покупку / продажу:
Сейчас используется простейший вариант - если сработал хотя бы один сигнал, применяем его.
После срабатывания сигнала проверяется достаточно ли средств для этого действия. Если средств достаточно, выставляется лимит-заявка. При повторном сигнале заявка перевыставляется с более актуальной ценой. Также алгоритм сейчас действует аккуратно: больше инструмент уже куплен, то дополнительно он не докупается.
Проверка робота на исторических данных сделана с помощью tinkoff-local-broker.
scripts/run-bakctest.ts
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-функции на Яндекс.Облако, запускаемой по расписанию:
tinkoff-robot-sa
и выдайте ему роль serverless.functions.invoker
npm run deploy
0/5 7-16 ? * 2-6 *
- запуск каждые 5 минут с 10 до 19 (msk) по будням. В качестве функции укажите триггеру tinkoff-robot
В последующем для деплоя новой версии достаточно вызвать:
npm run deploy
Apache 2.0