Skip to content

Commit

Permalink
New investapi
Browse files Browse the repository at this point in the history
  • Loading branch information
evsamsonov committed Aug 20, 2024
1 parent 6fa817c commit 0eca1b4
Show file tree
Hide file tree
Showing 14 changed files with 694 additions and 380 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ jobs:
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.54.2
version: v1.59.1
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ lint: ## Run golang lint using docker
-v ${GOPATH}/pkg/mod:/go/pkg/mod \
-v ${PWD}:/app \
-w /app \
golangci/golangci-lint:v1.54.2 \
golangci/golangci-lint:v1.59.1 \
golangci-lint run -v --modules-download-mode=readonly

test: ## Run tests
Expand All @@ -26,3 +26,6 @@ doc: ## Run doc server using docker
-w /go/src/github.com/evsamsonov/tinkoff-broker \
golang:latest \
bash -c "go install golang.org/x/tools/cmd/godoc@latest && /go/bin/godoc -http=:6060"

generate: ## Run go generate
go generate ./...
31 changes: 23 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ for creating automated trading robots.

## How to use

Create a new `Tinkoff` object using constructor `New`. Pass [full-access token](https://tinkoff.github.io/investAPI/token/),
user account identifier, [FIGI](https://tinkoff.github.io/investAPI/faq_identification/) of a trading instrument.
Create a new `Tinkoff` object using constructor `New`. Pass Tinkoff Client and user account identifier.

```go
package main
Expand All @@ -26,29 +25,45 @@ import (
"context"
"log"

tnkbroker "github.com/evsamsonov/tinkoff-broker"
"github.com/evsamsonov/trengin/v2"
"github.com/russianinvestments/invest-api-go-sdk/investgo"
"go.uber.org/zap"

tnkbroker "github.com/evsamsonov/tinkoff-broker"
)

func main() {
ctx := context.Background()

tinkoffConfig := investgo.Config{
EndPoint: "invest-public-api.tinkoff.ru:443",
Token: "[tinkoff-token]",
AccountId: "[account-id]",
}
tinkoffClient, err := investgo.NewClient(ctx, tinkoffConfig, zap.NewNop().Sugar())
if err != nil {
log.Fatal("Failed to create tinkoff client", zap.Error(err))
}

// todo fix me
tinkoffBroker, err := tnkbroker.New(
"tinkoff-token",
tinkoffClient,
"123",
"BBG004730N88",
// options...
)
if err != nil {
log.Fatal("Failed to create tinkoff broker")
}

tradingEngine := trengin.New(&Strategy{}, tinkoffBroker)
if err = tradingEngine.Run(context.Background()); err != nil {
log.Fatal("Trading engine crashed")
}
}

type Strategy struct{}
func (s *Strategy) Run(ctx context.Context, actions Actions) error { panic("implement me") }
func (s *Strategy) Run(ctx context.Context, actions trengin.Actions) error { panic("implement me") }

```

See more details in [trengin documentation](http://github.com/evsamsonov/trengin).
Expand All @@ -60,7 +75,6 @@ You can configure `Tinkoff` to use `Option`
| Methods | Returns Option which |
|-----------------------------------|----------------------------------------------------------------------------------|
| `WithLogger` | Sets logger. The default logger is no-op Logger. |
| `WithAppName` | Sets [x-app-name](https://tinkoff.github.io/investAPI/grpc/#appname). |
| `WithProtectiveSpread` | Sets protective spread in percent for executing orders. The default value is 1%. |
| `WithTradeStreamRetryTimeout` | Defines retry timeout on trade stream error. |
| `WithTradeStreamPingWaitDuration` | Defines duration how long we wait for ping before reconnection. |
Expand Down Expand Up @@ -97,4 +111,5 @@ doc Run doc server using docker
lint Run golang lint using docker
pre-push Run golang lint and test
test Run tests
generate Run go generate
```
44 changes: 44 additions & 0 deletions clients.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package tnkbroker

import (
"github.com/russianinvestments/invest-api-go-sdk/investgo"
pb "github.com/russianinvestments/invest-api-go-sdk/proto"
)

// nolint: lll
//
//go:generate docker run --rm -v ${PWD}:/app -w /app vektra/mockery --name ordersServiceClient --inpackage --case snake
type ordersServiceClient interface {
PostOrder(req *investgo.PostOrderRequest) (*investgo.PostOrderResponse, error)
GetOrderState(accountID, orderID string, priceType pb.PriceType) (*investgo.GetOrderStateResponse, error)
}

// nolint: lll
//
//go:generate docker run --rm -v ${PWD}:/app -w /app vektra/mockery --name stopOrdersServiceClient --inpackage --case snake
type stopOrdersServiceClient interface {
PostStopOrder(req *investgo.PostStopOrderRequest) (*investgo.PostStopOrderResponse, error)
CancelStopOrder(accountID, stopOrderID string) (*investgo.CancelStopOrderResponse, error)
GetStopOrders(accountID string) (*investgo.GetStopOrdersResponse, error)
}

// nolint: lll
//
//go:generate docker run --rm -v ${PWD}:/app -w /app vektra/mockery --name ordersStreamClient --inpackage --case snake
type ordersStreamClient interface {
TradesStream(accounts []string) (*investgo.TradesStream, error)
}

// nolint: lll
//
//go:generate docker run --rm -v ${PWD}:/app -w /app vektra/mockery --name marketDataServiceClient --inpackage --case snake
type marketDataServiceClient interface {
GetLastPrices(instrumentIds []string) (*investgo.GetLastPricesResponse, error)
}

// nolint: lll
//
//go:generate docker run --rm -v ${PWD}:/app -w /app vektra/mockery --name instrumentsServiceClient --inpackage --case snake
type instrumentsServiceClient interface {
InstrumentByFigi(id string) (*investgo.InstrumentResponse, error)
}
25 changes: 20 additions & 5 deletions cmd/tinkoff-checkup/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ import (
"os"
"syscall"

tnkbroker "github.com/evsamsonov/tinkoff-broker"
"github.com/evsamsonov/trengin/v2"
"github.com/russianinvestments/invest-api-go-sdk/investgo"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
"golang.org/x/term"

tnkbroker "github.com/evsamsonov/tinkoff-broker"
)

func main() {
Expand Down Expand Up @@ -140,18 +142,31 @@ func NewTinkoffCheckuper(verbose bool) (*TinkoffCheckuper, error) {
}

func (t *TinkoffCheckuper) CheckUp(params CheckUpArgs) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

g, ctx := errgroup.WithContext(ctx)

tinkoffConfig := investgo.Config{
EndPoint: "invest-public-api.tinkoff.ru:443",
Token: params.tinkoffToken,
AppName: "evsamsonov.gdealer",
AccountId: params.accountID,
}
tinkoffClient, err := investgo.NewClient(ctx, tinkoffConfig, t.logger.Sugar())
if err != nil {
return fmt.Errorf("create tinkoff client: %w", err)
}

tinkoffBroker, err := tnkbroker.New(
params.tinkoffToken,
tinkoffClient,
params.accountID,
tnkbroker.WithLogger(t.logger),
)
if err != nil {
return fmt.Errorf("create tinkoff broker: %w", err)
}

ctx, cancel := context.WithCancel(context.Background())
g, ctx := errgroup.WithContext(ctx)

g.Go(func() error {
defer cancel()
if err := tinkoffBroker.Run(ctx); err != nil {
Expand Down
31 changes: 0 additions & 31 deletions mock.go

This file was deleted.

24 changes: 0 additions & 24 deletions mock_instrument_service_client.go

This file was deleted.

57 changes: 57 additions & 0 deletions mock_instruments_service_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 34 additions & 1 deletion mock_market_data_service_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 0eca1b4

Please sign in to comment.