Skip to content

Commit

Permalink
Merge pull request #8 from Tinkoff/dev
Browse files Browse the repository at this point in the history
update readme
  • Loading branch information
jstalex authored May 31, 2023
2 parents adf3d51 + 833210d commit 28507c7
Show file tree
Hide file tree
Showing 25 changed files with 719 additions and 17,763 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ config.env
config.yaml
desert.go
main
/vendor/
/vendor/
*.db
54 changes: 46 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,52 @@ SDK предназначен для упрощения работы с API Ти

Для непосредственного взаимодействия с INVEST API нужно создать клиента.
Примеры использования SDK находятся в директории examples:
* md_stream.go, orders_stream.go, operations_stream.go - примеры работы со стримами
* instruments.go - примеры работы с сервисом инструментов
* marketdata.go - примеры работы с сервисом котировок
* operations.go - примеры работы с сервисом операций
* orders.go - примеры работы с сервисом торговых поручений
* stop_orders - примеры работы с сервисом стоп-заявок
* users.go - примеры работы с сервисом счетов
* sandbox.go - пример работы с песочницей
* `md_stream.go`, orders_stream.go, operations_stream.go - примеры работы со стримами
* `instruments.go` - примеры работы с сервисом инструментов
* `marketdata.go` - примеры работы с сервисом котировок
* `operations.go` - примеры работы с сервисом операций
* `orders.go` - примеры работы с сервисом торговых поручений
* `stop_orders` - примеры работы с сервисом стоп-заявок
* `users.go` - примеры работы с сервисом счетов
* `sandbox.go` - пример работы с песочницей
* `order_book_download/order_book.go` - пример сохранения стаканов из стрима маркетдаты в sqlite или json

#### Конфигурация SDK
```go
type Config struct {
// EndPoint - Для работы с реальным контуром и контуром песочницы нужны разные эндпоинты.
// По умолчанию = sandbox-invest-public-api.tinkoff.ru:443
// https://tinkoff.github.io/investAPI/url_difference/
EndPoint string `yaml:"EndPoint"`
// Token - Ваш токен для Tinkoff InvestAPI
Token string `yaml:"APIToken"`
// AppName - Название вашего приложения, по умолчанию = tinkoff-api-go-sdk
AppName string `yaml:"AppName"`
// AccountId - Если уже есть аккаунт для апи можно указать напрямую,
// для песочницы создастся и запишется автоматически
AccountId string `yaml:"AccountId"`
// DisableResourceExhaustedRetry - Если true, то сдк не пытается ретраить, после получения ошибки об исчерпывании
// лимита запросов, если false, то сдк ждет нужное время и пытается выполнить запрос снова. По умолчанию = false
DisableResourceExhaustedRetry bool `yaml:"DisableResourceExhaustedRetry"`
// DisableAllRetry - Отключение всех ретраев
DisableAllRetry bool `yaml:"DisableAllRetry"`
// MaxRetries - Максимальное количество попыток переподключения, по умолчанию = 3
// (если указать значение 0 это не отключит ретраи, для отключения нужно прописать DisableAllRetry = true)
MaxRetries uint `yaml:"MaxRetries"`
}
```
Для проверки достаточно указать токен и запустить пример `sandbox.go`

### Дополнительные возможности
* **Загрузка исторических данных.** В рамках сервиса `Marketdata`, метод `GetHistoricCandles` возвращает список
свечей в интервале (from - to), метод `GetAllHistoricCandles` возвращает все доступные свечи.
* **Получение метеданных.** В теле ответа Unary - методов присутствует `grpc.Header`, при момощи методов
`investgo.MessageFromHeader` и `investgo.RemainingLimitFromHeader` вы можете получить сообщение ошибки,
и текущий остаток запросов соответсвенно. Подробнее про заголовки [тут](https://tinkoff.github.io/investAPI/grpc/)
* **Переподключение.** По умолчанию включен ретраер, который при получении ошибок от grpc пытается выполнить запрос повторно,
а в случае со стримами переподклчается и переподписывает стрим на всю подписки. Отдельно можно
отключить ретраер для ошибки `ResourceExhausted`, по умолчанию он включен и в случае превышения лимитов Unary - запросов,
ретраер ждет нужное время и продолжает выполнение, *при этом никакого сообщения об ошибке для клиента нет*.

#### Пример использования MarketDataStreamService
```go
Expand Down
1 change: 1 addition & 0 deletions example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ APIToken: <your_token>
EndPoint: sandbox-invest-public-api.tinkoff.ru:443
AppName: invest-api-go-sdk
DisableResourceExhaustedRetry: false
DisableAllRetry: false
MaxRetries: 3
37 changes: 15 additions & 22 deletions examples/instruments.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,43 +7,44 @@ import (
pb "github.com/tinkoff/invest-api-go-sdk/proto"
"go.uber.org/zap"
"log"
"os/signal"
"syscall"
"time"
)

func main() {
// Загружаем конфигурацию для сдк
// загружаем конфигурацию для сдк из .yaml файла
config, err := investgo.LoadConfig("config.yaml")
if err != nil {
log.Fatalf("config loading error %v", err.Error())
}
// контекст будет передан в сдк и будет использоваться для завершения работы
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

// Для примера передадим в качестве логгера uber zap
prod, err := zap.NewProduction()
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL)
defer cancel()
// сдк использует для внутреннего логирования investgo.Logger
// для примера передадим uber.zap
prod := zap.NewExample()
defer func() {
err := prod.Sync()
if err != nil {
log.Printf("Prod.Sync %v", err.Error())
}
}()

if err != nil {
log.Fatalf("logger creating error %e", err)
log.Fatalf("logger creating error %v", err)
}
logger := prod.Sugar()

// Создаем клиента для апи инвестиций, он поддерживает grpc соединение
// создаем клиента для investAPI, он позволяет создавать нужные сервисы и уже
// через них вызывать нужные методы
client, err := investgo.NewClient(ctx, config, logger)
if err != nil {
logger.Fatalf("Client creating error %v", err.Error())
logger.Fatalf("client creating error %v", err.Error())
}
defer func() {
logger.Infof("Closing client connection")
logger.Infof("closing client connection")
err := client.Stop()
if err != nil {
logger.Error("client shutdown error %v", err.Error())
logger.Errorf("client shutdown error %v", err.Error())
}
}()

Expand Down Expand Up @@ -130,15 +131,7 @@ func main() {
}
}

optionByTickerResp, err := instrumentsService.OptionByTicker("TT440CE3B", "SPBOPT")
if err != nil {
logger.Errorf(err.Error())
} else {
option := optionByTickerResp.GetInstrument()
fmt.Printf("option name = %v, asset size = %v\n", option.GetName(), option.GetBasicAssetSize().ToFloat())
}

dividentsResp, err := instrumentsService.GetDividents("BBG004730N88", time.Now(), time.Now().Add(1000*time.Hour))
dividentsResp, err := instrumentsService.GetDividents("BBG004730N88", time.Now().Add(-1000*time.Hour), time.Now())
if err != nil {
logger.Errorf(err.Error())
fmt.Printf("header msg = %v\n", dividentsResp.GetHeader().Get("message"))
Expand Down
Loading

0 comments on commit 28507c7

Please sign in to comment.