This repository has been archived by the owner on Mar 14, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathclient.go
113 lines (102 loc) · 4.35 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package finamclient
import (
"context"
"crypto/tls"
"github.com/DBoyara/FinamTradeGo/tradeapi"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
grpcMetadata "google.golang.org/grpc/metadata"
)
type IFinamClient interface {
// Справочник инструментов.
GetSecurities() (*tradeapi.GetSecuritiesResult, error)
// Возвращает дневные свечи.
GetDayCandles(in *tradeapi.GetDayCandlesRequest) (*tradeapi.GetDayCandlesResult, error)
// Возвращает внутридневные свечи.
GetIntradayCandles(in *tradeapi.GetIntradayCandlesRequest) (*tradeapi.GetIntradayCandlesResult, error)
// Подписка на биржевой стакан
SubscribeOrderBook(in *tradeapi.OrderBookSubscribeRequest)
// Удаление подписки на биржевой стакан
UnSubscribeOrderBook(in *tradeapi.OrderBookUnsubscribeRequest) *tradeapi.ResponseEvent
// Подписка на заявки и сделки
SubscribeOrderTrade(in *tradeapi.OrderTradeSubscribeRequest)
// Удаление подписки на заявки и сделки
UnSubscribeOrderTrade(in *tradeapi.OrderTradeUnsubscribeRequest) *tradeapi.ResponseEvent
// Создать новую заявку.
NewOrder(in *tradeapi.NewOrderRequest) (*tradeapi.NewOrderResult, error)
// Отменяет заявку.
CancelOrder(transactionId int32) (*tradeapi.CancelOrderResult, error)
// Возвращает список заявок.
GetOrders(includeMatched, includeCanceled, includeActive bool) (*tradeapi.GetOrdersResult, error)
// Возвращает список стоп-заявок.
GetStops(includeExecuted, includeCanceled, includeActive bool) (*tradeapi.GetStopsResult, error)
// Снимает стоп-заявку.
CancelStop(stopId int32) (*tradeapi.CancelStopResult, error)
// Выставляет стоп-заявку.
NewStop(in *tradeapi.NewStopRequest) (*tradeapi.NewStopResult, error)
// Посмотреть портфель
GetPortfolio(includeCurrencies, includeMoney, includePositions, includeMaxBuySell bool) (*tradeapi.GetPortfolioResult, error)
// Получение канала orderBooksChan
GetOrderBooksChan() chan *tradeapi.OrderBookEvent
// Получение канала orderTradeChan
GetOrderTradeChan() chan *tradeapi.TradeEvent
// Получение канала orderChan
GetOrderChan() chan *tradeapi.OrderEvent
// Получение канала ошибок
GetErrorChan() chan error
// Закрытие подключения
CloseConnection()
}
// FinamClient
type FinamClient struct {
token string
clientId string
ctx context.Context
connection *grpc.ClientConn
portfolio tradeapi.PortfoliosClient
orders tradeapi.OrdersClient
stops tradeapi.StopsClient
events tradeapi.EventsClient
securities tradeapi.SecuritiesClient
candles tradeapi.CandlesClient
orderBooksChan chan *tradeapi.OrderBookEvent
orderTradeChan chan *tradeapi.TradeEvent
orderChan chan *tradeapi.OrderEvent
errChan chan error
}
func NewFinamClient(clientId, token string, ctx context.Context) (IFinamClient, error) {
endpoint := "trade-api.finam.ru:443"
tlsConfig := tls.Config{MinVersion: tls.VersionTLS12}
conn, err := grpc.DialContext(ctx, endpoint, grpc.WithTransportCredentials(credentials.NewTLS(&tlsConfig)))
if err != nil {
return nil, err
}
ctx = grpcMetadata.AppendToOutgoingContext(ctx, "x-api-key", token)
client := &FinamClient{
token: token,
clientId: clientId,
ctx: ctx,
connection: conn,
portfolio: tradeapi.NewPortfoliosClient(conn),
orders: tradeapi.NewOrdersClient(conn),
stops: tradeapi.NewStopsClient(conn),
events: tradeapi.NewEventsClient(conn),
securities: tradeapi.NewSecuritiesClient(conn),
candles: tradeapi.NewCandlesClient(conn),
orderBooksChan: make(chan *tradeapi.OrderBookEvent),
orderTradeChan: make(chan *tradeapi.TradeEvent),
orderChan: make(chan *tradeapi.OrderEvent),
errChan: make(chan error),
}
return client, err
}
func (f *FinamClient) CloseConnection() {
f.connection.Close()
close(f.orderBooksChan)
close(f.orderTradeChan)
close(f.orderChan)
close(f.errChan)
}
func (f *FinamClient) CreateRequestContext() {
f.ctx = grpcMetadata.AppendToOutgoingContext(f.ctx, "x-api-key", f.token)
}