Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
TINKOFF_OPENAPI_URL=https://api-invest.tinkoff.ru/openapi
TINKOFF_OPENAPI_URL=https://invest-public-api.tbank.ru/rest/
TINKOFF_OPENAPI_TOKEN=
2 changes: 1 addition & 1 deletion .github/workflows/rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.1.0
ruby-version: 3.4.5
- name: Install dependencies
run: bundle install
- name: Run rubocop
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.env.local
.env.*.local
.DS_Store
4 changes: 2 additions & 2 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require:
plugins:
- rubocop-performance

AllCops:
Expand Down Expand Up @@ -31,7 +31,7 @@ Style/Documentation:
Enabled: false

Layout/LineLength:
Max: 80
Max: 100

Metrics/MethodLength:
Max: 15
Expand Down
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.1.0
3.4.5
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM ruby:3.1.0
FROM ruby:3.4.5

WORKDIR /opt/app
COPY Gemfile* ./
Expand Down
76 changes: 44 additions & 32 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,70 +1,82 @@
GEM
remote: https://rubygems.org/
specs:
ast (2.4.2)
ast (2.4.3)
awesome_print (1.9.2)
awesome_pry (0.0.1)
awesome_print
pry-rails
bigdecimal (3.2.3)
coderay (1.1.3)
dotenv (2.7.6)
faraday (0.17.4)
dotenv (3.1.8)
faraday (0.17.6)
multipart-post (>= 1.2, < 3)
faraday_middleware (0.14.0)
faraday (>= 0.7.4, < 1.0)
faraday_middleware-parse_oj (0.3.2)
faraday (~> 0.9)
faraday_middleware (>= 0.9.1, < 1.0)
oj (>= 2.0, < 4.0)
method_source (1.0.0)
multipart-post (2.1.1)
oj (3.13.10)
parallel (1.21.0)
parser (3.0.3.2)
json (2.13.2)
language_server-protocol (3.17.0.5)
lint_roller (1.1.0)
method_source (1.1.0)
multipart-post (2.4.1)
oj (3.16.11)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
ostruct (0.6.3)
parallel (1.27.0)
parser (3.3.9.0)
ast (~> 2.4.1)
racc
pastel (0.8.0)
tty-color (~> 0.5)
pry (0.14.1)
prism (1.4.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
rainbow (3.0.0)
regexp_parser (2.2.0)
rexml (3.2.5)
rubocop (1.24.0)
pry-rails (0.3.11)
pry (>= 0.13.0)
racc (1.8.1)
rainbow (3.1.1)
regexp_parser (2.11.2)
rubocop (1.80.2)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parser (>= 3.0.0.0)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.15.0, < 2.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.46.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.15.0)
parser (>= 3.0.1.1)
rubocop-performance (1.13.0)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
ruby-progressbar (1.11.0)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.46.0)
parser (>= 3.3.7.2)
prism (~> 1.4)
rubocop-performance (1.26.0)
lint_roller (~> 1.1)
rubocop (>= 1.75.0, < 2.0)
rubocop-ast (>= 1.44.0, < 2.0)
ruby-progressbar (1.13.0)
strings (0.2.1)
strings-ansi (~> 0.2)
unicode-display_width (>= 1.5, < 3.0)
unicode_utils (~> 1.4)
strings-ansi (0.2.0)
tty-color (0.6.0)
tty-screen (0.8.1)
tty-screen (0.8.2)
tty-table (0.12.0)
pastel (~> 0.8)
strings (~> 0.2.0)
tty-screen (~> 0.8)
unicode-display_width (2.1.0)
unicode-display_width (2.6.0)
unicode_utils (1.4.0)

PLATFORMS
arm64-darwin-21
x86_64-darwin-19
x86_64-linux
arm64-darwin-24
ruby

DEPENDENCIES
awesome_pry
Expand All @@ -77,4 +89,4 @@ DEPENDENCIES
tty-table

BUNDLED WITH
2.2.22
2.7.1
35 changes: 18 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

# TinkyClient — tiny client for Tinkoff OpenAPI

Предлагаю вашему вниманию небольшой консольный Ruby-клиент для доступа к брокерскому аккаунту Тинькофф Инвестиции.
На данный момент это очень ранняя пре-альфа-версия, реализовано только отображение портфолио.
Цель проекта — сделать удобный консольный клиент для контроля своих активов, дополняющий официальное мобильное приложение [Инвестиции](https://www.tinkoff.ru/invest/).
Предлагаю вашему вниманию небольшой консольный Ruby-клиент для доступа к брокерскому аккаунту Т-Инвестиции.
На данный момент реализовано только отображение портфолио.
Цель проекта — сделать удобный консольный клиент для контроля своих активов, дополняющий официальное мобильное приложение [Т-Инвестиции](https://tbank.ru/invest/).

![Portfolio](/examples/portfolio.png)

# Быстрый старт

Требования:
- установленный Ruby 2.7.1 и новее
- наличие [токена Tinkoff OpenAPI](https://tinkoffcreditsystems.github.io/invest-openapi/auth/)
- установленный Ruby 3.4.5 и новее
- наличие [токена Tinkoff OpenAPI](https://developer.tbank.ru/invest/intro/intro/token)

```sh
$ bundle
Expand All @@ -34,15 +34,17 @@ $ bin/portfolio
### Колонки таблицы

- `Type` — тип актива.
- `STOCK` — акции.
- `SHARE` — акции.
- `BOND` — облигации.
- `ETF` — инвестиционный фонд.
- `Name` — название актива.
- `Amount` — количество в штуках или сумма в валюте.
- `Avg. buy` — средняя цена покупки актива. Показатель берётся напрямую из OpenAPI. Например: если вы купили 2 акции за 10 и 20 рублей, то средняя цена покупки будет 15 рублей. От этой стоимости и текущей цены считается ожидаемый доход.
- `Current price` — текущая цена актива. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет цену по формуле: `((balance * avg_buy_price) + expected_yield) / balance`. Возможно небольшое отличие от тикеров на сервере брокера.
- `Yield` — ожидаемый доход в валюте. Показатель берётся напрямую из OpenAPI.
- `Yield %` — ожидаемый доход в процентах. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет процент по формуле: `expected_yield / (avg_buy_price * balance) * 100`.
- `Current price` — текущая цена актива. Отдаётся напрямую из API.
- `Buy sum` — начальная стоимость актива по средней цене на момент покупки. Не отдаётся напрямую из API, поэтому программа вычисляет сумму по формуле: `avg_buy_price * amount`.
- `Current sum` — текущая стоимость актива по текущей рыночной цене. Не отдаётся напрямую из API, поэтому программа вычисляет сумму по формуле: `current_price * amount`.
- `Yield` — ожидаемый доход в валюте. Показатель берётся напрямую из API.
- `Yield %` — ожидаемый доход в процентах. Не отдаётся напрямую из API, поэтому программа вычисляет процент по формуле: `expected_yield / (avg_buy_price * amount) * 100`.

## Валюта

Expand All @@ -67,8 +69,8 @@ $ bin/console
```sh
pry(Tinky)> portfolio
pry(Tinky)> wallet
pry(Tinky)> exchange_rates(positions)
pry(Tinky)> total_amount(positions)
pry(Tinky)> available_currencies
pry(Tinky)> puts summary_table(summary_data.values)
```

## Запуск в Docker
Expand All @@ -95,7 +97,7 @@ pry(Tinky)> total_amount(positions)
Если вы хотите вывести портфолио в отдельное окно, чтобы оно при этом автоматически обновлялось, попробуйте команду:

```sh
$ watch bin/portfolio
$ bin/portfolio --watch
```

В зависимости от системы, `watch` надо устанавливать отдельно. Однако, на macOS вывод работает некорректно. Я устанавливал через `brew install watch`. Оказалось, что она некорректно показывает символы валют и убирает цвет. Пользователи также сообщали, что табличная вёрстка ломается.
Expand All @@ -110,7 +112,7 @@ $ while sleep 2; do bin/portfolio > /tmp/portfolio; clear; cat /tmp/portfolio; d

1. Используя этот проект, никакие персональные данные НЕ ПЕРЕДАЮТСЯ никаким третьим лицам скрыто или явно.
2. Использование этого проекта не требует от пользователя никаких логинов, паролей, номеров телефона и других персональных данных.
3. Для доступа к вашем брокерскому счёту вы используете только ваш персональный токен из личного кабинета Тинькофф Инвестиций.
3. Для доступа к вашем брокерскому счёту вы используете только ваш персональный токен из личного кабинета Т-Инвестиций.
4. Этот токен вы генерируете самостоятельно.
5. Для нормальной работы этой программы вы самостоятельно записываете токен в текстовый файл, который сохраняется только на вашем устройстве.
6. Вы можете в любой момент отозвать (деактивировать) свой токен, если у вас возникнут подозрения в компрометации.
Expand All @@ -125,8 +127,7 @@ MIT License. Используйте как хотите и где хотите

# Ссылки

- https://www.tinkoff.ru/invest/
- https://www.tinkoff.ru/invest/web-terminal/
- https://github.com/TinkoffCreditSystems/invest-openapi/
- https://tinkoffcreditsystems.github.io/invest-openapi/
- https://tbank.ru/invest/
- https://developer.tbank.ru/invest/api/t-invest-api
- https://github.com/RussianInvestments/investAPI
- https://t.me/tinkoffinvestopenapi
7 changes: 1 addition & 6 deletions config/dotenv.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,2 @@
require 'dotenv'
Dotenv.load(
".env.#{ENV['APP_ENV']}.local",
'.env.local',
".env.#{ENV['APP_ENV']}",
'.env'
)
Dotenv.load('.env.local', '.env')
Binary file modified examples/wallet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading