Coder Social home page Coder Social logo

invest-openapi's Introduction

Тинькофф Инвестиции OpenAPI



Внимание, доступна новая версия Tinkoff Invest API

Поддержка текущей версии будет прекращена в 2022 году, рекомендуем переходить на новую версию.


Основные изменения в новой версии:

  • Поддержка всех нововведений, которых не было в текущей openAPI: мультисчетов, фьючерсов, стоп-ордеров и т.д.;
  • Поддержка токена для конкретного счета и режима “только для чтения”;
  • Полноценная “песочница” для тестирования стратегий, которая теперь знает о текущих рыночных котировках;
  • Существенно обогащенный список методов и формат возвращаемых данных;
  • Гибкая система разграничения лимитов на запросы;
  • Новый производительный протокол gRPC, совмещающий как единичные запросы, так и стримы;
  • Добавлены стримы с исполнением сделок клиента;

Документация по новой API и контракты доступны по ссылке https://github.com/Tinkoff/investAPI



Об openapi v1 [deprecated]

OpenAPI — HTTP-интерфейс для взаимодействия с торговой платформой Тинькофф Инвестиции.

OpenAPI позволяет вам выставлять лимитные заявки, просматривать информацию по своему портфелю и получать market-data через streaming.

Документация для разработчиков

Зачем нужен этот репозиторий?

В Issues вы можете задать вопрос или найти ответ, если вопрос уже был задан другими пользователями.

В Releases мы будем добавлять информацию о релизах.

В директории src/ хранится документация в формате Markdown. Описание REST-протокола можно отредактировать в src/docs/swagger-ui/swagger.yaml.

Если вы встретили неточность или хотели бы что-то дополнить, то мы будем рады принять от вас pull request.

Работа в Тинькофф Инвестициях

Вы разработчик и есть интерес к финтеху и инвестициям? Приходите работать к нам: https://www.tinkoff.ru/career/vacancies/invest/

Официальные SDK

Java

C#

Go

NodeJS

Неофициальные SDK

Python @daxartio

Python @Awethon

Python @Fatal1ty

Python @asakharov

PHP @jamesRUS52

PHP @dzhdmitry

Dart @greymag

Неофициальные утилиты

Tiny client for Tinkoff OpenAPI (Ruby)

Streaming Data Saver (Go)

Полезные ссылки

Telegram-канал

invest-openapi's People

Contributors

a0s avatar alexandervolkovtcs avatar amirmuratov avatar asakharov avatar farukshin avatar foxweb avatar greymag avatar lightning95 avatar necryin avatar nikitamelnikov avatar sematgt avatar serejhaaa avatar sunr1ze avatar ziggreen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

invest-openapi's Issues

REST: Вопрос по portfolio / positions

Должны ли при работе с sandbox токеном при запросе портфеля /portfolio
прилетать поля

"expectedYield,
averagePositionPrice,
averagePositionPriceNoNkd"

по каждому инструменту? Т.к они пустые (вернее их нет в ответах от REST).

все что прилетает:
{"figi":"BBG004730RP0","ticker":"GAZP","isin":"RU0007661625","instrumentType":"Stock","balance":20,"blocked":0,"lots":2},

Swagger указывает, что вроде как должны.
https://tinkoffcreditsystems.github.io/invest-openapi/swagger-ui/#/portfolio/get_portfolio

Нужен метод для обзора рынка

Так чтобы одни методом получить:

  1. Все доступные тикеры
  2. Объем торгов за день по каждому
  3. Последние bid и ask

Сейчас чтобы получить bid/ask приходится по каждому тикеру запрашивать стакан, что медленно и создаёт вам ненужную нагрузку

Как создать короткую позицию в sandbox?

Это вообще возможно? Задал достаточный на 10 лотов баланс. Позций по акциям нет. При попытке выполнить продажу 1 лота (/orders/limit-order) отвечает "NOT_ENOUGH_BALANCE".

Добавить в поля в instrument_info

Для ММВБ важные поля это уровень по акциям (1,2,3 листинг, Д листинг). А также тип акции (обыкновенная, привилегированная, депозитарная расписка).

Часто закупка привилегированных акций несет лишний геморой с голосованиями и в целом изменения цены не такие частые идут.
При попадании в Д список акции надо сливать по Рыночному Ордеру. Ой! А его опять у вас же нет )

Получение ставок риска

хорошо бы иметь какую-то возможность получить актуальные ставки риска
временное решение – парсить html, но тогда нужно делать велосипед, чтобы узнать, что на этой странице что-то поменялось

Не работает пример генерации клиента

Пример из src/docs/rest.md:

docker run --rm -v ${PWD}:/local swaggerapi/swagger-codegen-cli-v3:3.0.10 generate \
    -i https://api-invest.tinkoff.ru/openapi/docs/swagger-ui/swagger.yaml \
    -l go \
    -o /local/out/go

Падает с:

docker run --rm -v ${PWD}:/local swaggerapi/swagger-codegen-cli-v3:3.0.10 generate \
    -i https://api-invest.tinkoff.ru/openapi/docs/swagger-ui/swagger.yaml \
    -l go \
    -o /local/out/go
Exception in thread "main" java.lang.RuntimeException: Can't load config class with name go Available: aspnetcore
csharp
csharp-dotnet2
dynamic-html
html
html2
java
jaxrs-cxf-client
jaxrs-cxf
inflector
jaxrs-cxf-cdi
jaxrs-spec
jaxrs-jersey
jaxrs-di
jaxrs-resteasy-eap
jaxrs-resteasy
spring
nodejs-server
openapi
openapi-yaml
kotlin-client
kotlin-server
php
python
python-flask
scala
scala-akka-http-server
swift3
swift4
typescript-angular

	at io.swagger.codegen.v3.CodegenConfigLoader.forName(CodegenConfigLoader.java:31)
	at io.swagger.codegen.v3.cli.SwaggerCodegen.main(SwaggerCodegen.java:96)
Caused by: java.lang.ClassNotFoundException: go
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at io.swagger.codegen.v3.CodegenConfigLoader.forName(CodegenConfigLoader.java:29)
	... 1 more

Необходима возможность выпуска токенов с разграниченными правами

Если есть возможность, добавьте пожалуйста выпуск токенов с ограничением в правах.
Например токен имеющий доступ на чтение к операциям и портфелю, но не имеющий возможности создания заявок. Это было бы полезно для интеграции со сторонними сервисами, такими как приложения для учета портфельных инвестиций.

отмена частично исполненой заявки

Eсли отменить частично исполненную заявку в /operations в поле quantity будет первоначальное количество, а не фактически исполненное. Фактически исполненное можно высчитать только через trades.

Будет ли создан SDK для Go?

Если нет, я могу завтра прислать частично готовый вариант, который поэтапно буду развивать, но за текущую неделю смогу довести до ума и покрыть тестами.

Проблемы со временем

Неуверен, что все верно понимаю

Но в верном ли формате возвращается время?

При запросе /market/candles мне возвращается время в таком виде

"2019-10-29T07:00Z"

Отсутствие имён активов в результатах GET /portfolio

Сейчас в результатах GET /portfolio отсутствуют имена активов. Чтобы их получить, приходится делать дополнительные запросы в API (например в GET /market/search/by-figi). Если добавлять имена активов в результат /portfolio, то это упростит клиентский код и снизит нагрузку на ваш backend.

Типы ордеров

Здравствуйте. Вопрос по типам ордеров. В rest-api вижу только создание лимитного ордера. Есть ли возможность создания рыночных ордеров, stop loss, take profit итд?

Канал для обсуждения/анонсов

Мне кажется, что было бы хорошо завести какой-то канал оповещений о новостях API. Релизы на GH это здорово, но например про появление python-api (пусть и не официального) я узнал случайно.

Может быть стоит добавить Твиттер/телеграмм/slack? Да что угодно.

История по тикеру

Доброго времени суток.
Подскажите пожалуйста, есть ли возможность получать историю изменения цены по бумаге на определенном интервале? Будет ли такая возможность добавлена?

API market/search отдает 500-ки на POST

Ручки

  1. https://api-invest.tinkoff.ru/openapi/market/search/by-ticker
  2. https://api-invest.tinkoff.ru/openapi/market/search/by-figi

отдают статус 500 на POST запросы.

Пример:

$ http -v https://api-invest.tinkoff.ru/openapi/market/search/by-ticker ticker=SBERP "Authorization:Bearer mytoken"
POST /openapi/market/search/by-ticker HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Authorization: Bearer mytoken
Connection: keep-alive
Content-Length: 19
Content-Type: application/json
Host: api-invest.tinkoff.ru
User-Agent: HTTPie/1.0.3

{
    "ticker": "SBERP"
}

HTTP/1.1 500 Internal Server Error
Cache-Control: no-store, no-cache, must-revalidate
Date: Sun, 06 Oct 2019 17:02:40 GMT
Server: nginx
Transfer-Encoding: chunked

Неверная цена бумаги в портфеле

С периодичностью возвращается не цена бумаги в портфеле, а цена бумаги на бирже

averagePositionPrice->value

Ошибка повторяется 2 дня 24 и 25 октября утром. Поэтому позиции на продажу выставляются дешевле чем были куплены. Приходится цены писать в файл и считывать с утра из-за этой ошибки

Для сервисных операций предоставлять ID

Хотелось бы уникальный ID для сервисной операции брокера. Сейчас даёт -1
Например,

{
  operationType: 'PayIn',
  date: '2018-06-25T19:23:12+03:00',
  isMarginCall: false,
  quantity: 0,
  payment: 4.91,
  currency: 'USD',
  status: 'Done',
  id: '-1'
}

Не видны поздневечерние свечи через историю на бирже СПБ, хотя стриминговая прилетает

Например, мой лог даёт
BBG006G2JVL2 Свеча из истории 2019-11-08T22:39:00Z Свеча из стрима 2019-11-08T23:18:00Z Интервал 1min

Видно, что торги по инструменту закрылись в 23:18 по Зулу.
А последняя свеча в 22:39 с истории.
То есть не все прилетают.

Ограничение по API Call

В этом тикете видно, что текущие лимиты не учитывают необходимость получать данные по каждому инструменту отдельно. Прошу добавить отслеживание лимитов в рамках запросов по каждому инструменту.

Например:
Общий список 120 APICall/Min
Каждый инструмент отдельно 120 APICall/Min

Добавить поддержку социальных функций и новостей

Сейчас отсутствует какая-либо функциональность, связанная с социальными профилями платформы, пульсом, фида, новостями, комментариями, историей сделок. Пока что можно выкрутиться только закрытым API, по которому вся информация закрыта.

В некоторых случаях некорректно возвращается список свечей

Запрашиваем список свечей с месячным интервалом с 2019-07-02 по 2019-11-02:
https://api-invest.tinkoff.ru/openapi/sandbox/market/candles?figi=BBG001D8R5D0&from=2019-07-02T13%3A23%3A49.709091%2B03%3A00&to=T13%3A23%3A49.708990%2B03%3A00&interval=month

Возвращается 3 свечи:
2019-08-01
2019-09-01
2019-10-01

Меняем from на 2019-10-02, получаем недостающую четвертую свечу:
https://api-invest.tinkoff.ru/openapi/sandbox/market/candles?figi=BBG001D8R5D0&from=2019-10-02T13%3A23%3A49.709091%2B03%3A00&to=2019-11-02T13%3A23%3A49.708990%2B03%3A00&interval=month

Проявляется не на всех инструментах, но на figi=BBG001D8R5D0 повторяется стабильно

Rejected при создании ордера на продажу через API

Сегодня с утра при попытке создания ордера на продажу (RBCM, в частности) через API получаю в ответе
"status":"Rejected",
"rejectReason":"Unknown"

Параметры в запросе передаю валидные, вчера точно такой же ордер создавался без проблем. Вручную через терминал ордер выставляется нормально.

Отличия ответа

В rest и stream json объектах отличаются json тегами

В rest везде camelCase
в stream везде snake_case

Это создает безумное колличество неудобств, при написании кастомных SDK

Добавьте ленту сделок в API

Для автоматического анализа не достаточно только стакана. Дополнительно интересует лента сделок инструмента на бирже.
Добавьте в API поток событий сделок с полями - бид/аск, объем, причина. Этот функционал реализован в квике https://www.opentrainer.ru/articles/nastroyka-tablitsy-vseh-sdelok-v-quik-7/

WebSocket frontend

Здравствуйте!

Очень расстраивает отсутствие возможности законнектиться к websocket-api с фронтенда. JS WebSocket в браузерах не поддерживает передачу заголовков, в отличии от NodeJS, а соответственно, нет возможности передать токен. В обход проблемы пришлось поднимать бэкенд ради простого проксирования websocket-трафика. С REST Api проблем нет (CORS позволяет получить доступ). Было бы супер, если появится возможность альтернативной авторизации через браузерный вебсокет:)

История котировок

Очень требуется метод получения истории котировок по определенному инструменту, за определенный промежуток времени, с определенным интервалом (1min, 5min, часовики и тд). Так как подписка на изменение котировки (candle:subscribe) дает только информацию по текущей цене, но нет данных для графика и технического анализа. Очень не хочется для этой цели использовать сторонние api помимо вашего:)

Предложение по платформе для бектестинга

Привет!

В этом треде хотелось бы услышать мнение сообщества о платформе для бектестинга:

  • Какие фичи вы бы хотели видеть?
  • Нужно ли реализовывать платформу для всех инструментов или достаточно будет определенного набора?

Поддержка ИИС

Очень не хватает поддержки ИИС'а. Например у меня в сервисе брокерский счёт не используется, только ИИС.

Получение информации по маржнальной торговле

Здравствуйте!
Предполагается ли возможность получения информации о маржинальной торговле по инструменту? Доступно ли с плечом, какие лимиты, доступно ли в шорт?

P.s. хотя бы напишите тикеры, какие доступны в шорт:))

Один и тот же энум отличается в rest API и в Stream

В rest возвращается поле tradeStatus

в stream возвращается trade_status

И тоже самое касается и содержания этих энумов

Возможно это как-то синхронизировать? А то приходим к ситуации, когда порождаем тонну "дублирующися" объектов

candle:subscribe несколько тиков в интервал

Пробую использовать OpenApi (https://tinkoffcreditsystems.github.io/invest-openapi/marketdata/) candle:subscribe для получения данных по тикам. Проблема в том, что на любом интервале (1-3 минуты) тики приходят несколько раз в минуту, а не раз в интервал. Использую тестовый ключ. Прилагаю логи.
streaming-client.log

Orderbook streaming stuck (PHP SDK)

Добрый день!

Пытаюсь использоваться SDK для PHP

там есть функция подписки на получение стрима стакана

$client->subscribeGettingOrderBook($sber->getFigi(), 2);
$client->startGetting('action', 1000, null);

Все работает и данные по WebSocket получаю ОК, но все длится примерно секунд 10, за это время по Сберу, например, прилетает 20-28 ответов от вашего API. После чего периодичность получения данных ответов резко снижается (один ответ в 15 сек) и каждый новый ответ дублирует данные предыдущего (последнего).

например:
сначала ответы идут очень быстро (1-3 в сек)

Order. BBG004730N88 | 50 Buy: 238.73 | 125 Sell: 238.66
Order. BBG004730N88 | 125 Buy: 238.74 | 146 Sell: 238.66
Order. BBG004730N88 | 51 Buy: 238.74 | 146 Sell: 238.66
Order. BBG004730N88 | 1 Buy: 238.74 | 126 Sell: 238.68
Order. BBG004730N88 | 1 Buy: 238.74 | 126 Sell: 238.69

а через ~10 сек. происходит «залипание» и ответы начинают сыпаться однотипные раз в 15 сек.

Order. BBG004730N88 | 375 Buy: 238.85 | 225 Sell: 238.77
Order. BBG004730N88 | 375 Buy: 238.85 | 225 Sell: 238.77
Order. BBG004730N88 | 375 Buy: 238.85 | 225 Sell: 238.77
Order. BBG004730N88 | 375 Buy: 238.85 | 225 Sell: 238.77

и так до бесконечности.

Использую режим sandbox.

Проверьте, пожалуйста. Это некое ограничение в API, баг, так и должно быть, или надо копать в сторону PHP SDK?

Спасибо:)

Вопрос о работе Stream

Я верно понимаю, что stream должен работать по типу:

1)Подписался на обновление, к примеру, candle
2)Мне непрерывно должно идти поток

Верно? Так как на данный момент ощущение, что идет "имитация" rest, когда устанавливаем соединение и через него один запрос с одним ответом идет

Или так и должно быть?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.