tinkoff-invest-api

Node.js SDK for Tinkoff Invest API

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
tinkoff-invest-api
825.0.0a month ago5 months agoMinified + gzip package size for tinkoff-invest-api in KB

Readme

tinkoff-invest-api
Node.js SDK для работы с Tinkoff Invest API.

Подключение Unary-запросы Стрим Универсальный счет Кеширование свечей Хелперы

Установка

npm i tinkoff-invest-api

Использование

Подключение

import { TinkoffInvestApi } from 'tinkoff-invest-api';

// создать клиента с заданным токеном доступа
const api = new TinkoffInvestApi({ token: '<your-token>' });
Как получить токен доступа описано тут.

Unary-запросы

// получить список счетов
const { accounts } = await api.users.getAccounts({});

// получить портфель по id счета
const portfolio = await api.operations.getPortfolio({ accountId: accounts[0].id });

// получить 1-минутные свечи за последние 5 мин для акций Тинкофф Групп
const { candles } = await api.marketdata.getCandles({
  figi: 'BBG00QPYJ5H0',
  interval: CandleInterval.CANDLE_INTERVAL_1_MIN,
  ...api.helpers.fromTo('-5m'), // <- удобный хелпер для получения { from, to }
});

Стрим

Для работы со стримом сделана обертка api.stream:
// подписка на свечи
const unsubscribe = await api.stream.market.candles({
  instruments: [
    { figi: 'BBG00QPYJ5H0', interval: SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE }
  ],
  waitingClose: false,
}, candle => console.log(candle));

// обработка дополнительных событий
api.stream.market.on('error', error => console.log('stream error', error));
api.stream.market.on('close', error => console.log('stream closed, reason:', error));

// отписаться
await unsubscribe();

// закрыть соединение
await api.stream.market.cancel();
Примечание: со стримом можно работать и напрямую через api.marketdataStream. Но там AsyncIterable, которые менее удобны (имхо)

По умолчанию стрим автоматически переподключается при потере соединения (#4). Чтобы это отключить, установите api.stream.market.options.autoReconnect = false.
Стримы доступны по следующим сущностям:
  • .candles(request, handler)
  • .trades(request, handler)
  • .orderBook(request, handler)
  • .lastPrice(request, handler)
  • .info(request, handler)

Универсальный счет

Для бесшовной работы со счетами в бою и песочнице сделан универсальный интерфейс TinkoffAccount.
import { TinkoffAccount, RealAccount, SandboxAccount } from 'tinkoff-invest-api';
import { OrderDirection, OrderType } from 'tinkoff-invest-api/dist/generated/orders.js';

// создать экземпляр счета: боевого или в песочнице
const account: TinkoffAccount = process.env.USE_REAL_ACCOUNT
    ? new RealAccount(api, '<real-account-id>')
    : new SandboxAccount(api, '<sandbox-account-id>');

// получить портфель
const protfolio = await account.getPortfolio();

// получить список заявок
const { orders } = await account.getOrders();

// создать лимит-заявку на покупку 1 лота по цене 100
const order = await account.postOrder({
  figi: 'BBG00QPYJ5H0',
  quantity: 1,
  price: api.helpers.toQuotation(100),
  direction: OrderDirection.ORDER_DIRECTION_BUY,
  orderType: OrderType.ORDER_TYPE_LIMIT,
  orderId: '<random-id>',
});

Все методы универсального счета можно посмотреть тут.

Кеширование свечей

Кеширование свечей позволяет сократить кол-во запросов к API, а также более удобно получать необходимые свечи за любой период времени. Для загрузки свечей с учетом кеша используется класс CandlesLoader:
import { TinkoffInvestApi, CandlesLoader } from 'tinkoff-invest-api';

const api = new TinkoffInvestApi({ token: '<your-token>' });

// создать инстанс загрузчика свечей
const candlesLoader = new CandlesLoader(api, { cacheDir: '.cache' });

// загрузить минимум 100 последних свечей (в понедельник будут использованы данные пятницы, итп)
const { candles } = await candlesLoader.getCandles({
  figi: 'BBG004730N88',
  interval: CandleInterval.CANDLE_INTERVAL_15_MIN,
  minCount: 100, // <- этот параметр позволяет задать кол-во свечей в результате
});

Для кеширования CandlesLoader создает следующую структуру файлов со свечами:
.cache
  candles
    <figi>
      1_min
        2022-05-01.json
        2022-05-02.json
      5_min
        2022-05-01.json
        2022-05-02.json
      15_min
        2022-05-01.json
        2022-05-02.json
      hour
        2022-05-01.json
        2022-05-02.json
      day
        2020.json
        2021.json
        2022.json

Хелперы

Для более удобной работы есть несколько хелперов:
import { Helpers } from 'tinkoff-invest-api';

/**
 * Переводит число в Quotation { units, nano }
 */
Helpers.toQuotation(value: number): Quotation;

/**
 * Переводит число в MoneyValue { units, nano, currency }
 */
Helpers.toMoneyValue(value: number, currency: string): MoneyValue;

/**
 * Переводит MoneyValue в строку
 */
Helpers.toMoneyString(value: MoneyValue | undefined): string;

/**
 * Переводит Quotation или MoneyValue в число
 */
Helpers.toNumber(value: Quotation | MoneyValue): number;

/**
 * Возвращает интервал времени в формате { from, to } по заданному смещению и базовой дате.
 * Для смещения можно использовать кол-во миллисекунд или строку в формате из https://github.com/vercel/ms.
 * Пример: получить { from, to } за последние 5 минут -> fromTo('-5m')
 */
Helpers.fromTo(offset: string | number, base?: Date): { from: Date; to: Date; };

/**
 * Переводит значения констант в человеко-читаемые строки.
 * Например: CandleInterval.CANDLE_INTERVAL_1_MIN -> '1_MIN'
 */
Helpers.toHuman<T extends Enums>(value: T, values: getEnumType<T>): string;

Отладка

Для отладки используется модуль debug. Чтобы вывести отладочную информацию, нужно указать переменную окружения DEBUG:
DEBUG=tinkoff-invest-api:* node robot.js

Лицензия

MIT @ Vitaliy Potapov