Skip to content

Commit 4e55a5d

Browse files
authored
Merge pull request #12 from Tinkoff/dev
add waiting close flag
2 parents c8798d3 + d29b246 commit 4e55a5d

8 files changed

Lines changed: 54 additions & 22 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func main() {
119119
// результат подписки на инструменты это канал с определенным типом информации, при повторном вызове функции
120120
// подписки(например на свечи), возвращаемый канал можно игнорировать, так как при первом вызове он уже был получен
121121
firstInstrumetsGroup := []string{"BBG004730N88", "BBG00475KKY8", "BBG004RVFCY3"}
122-
candleChan, err := firstMDStream.SubscribeCandle(firstInstrumetsGroup, pb.SubscriptionInterval_SUBSCRIPTION_INTERVAL_ONE_MINUTE)
122+
candleChan, err := firstMDStream.SubscribeCandle(firstInstrumetsGroup, pb.SubscriptionInterval_SUBSCRIPTION_INTERVAL_ONE_MINUTE, true)
123123
if err != nil {
124124
logger.Errorf(err.Error())
125125
}

examples/md_stream.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func main() {
6262
// результат подписки на инструменты это канал с определенным типом информации, при повторном вызове функции
6363
// подписки(например на свечи), возвращаемый канал можно игнорировать, так как при первом вызове он уже был получен
6464
firstInstrumetsGroup := []string{"BBG004730N88", "BBG00475KKY8", "BBG004RVFCY3"}
65-
candleChan, err := firstMDStream.SubscribeCandle(firstInstrumetsGroup, pb.SubscriptionInterval_SUBSCRIPTION_INTERVAL_ONE_MINUTE)
65+
candleChan, err := firstMDStream.SubscribeCandle(firstInstrumetsGroup, pb.SubscriptionInterval_SUBSCRIPTION_INTERVAL_ONE_MINUTE, true)
6666
if err != nil {
6767
logger.Errorf(err.Error())
6868
}

investgo/client.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,23 @@ func NewClient(ctx context.Context, conf Config, l Logger) (*Client, error) {
7272
return nil, err
7373
}
7474

75-
return &Client{
75+
client := &Client{
7676
conn: conn,
7777
Config: conf,
7878
Logger: l,
7979
ctx: ctx,
80-
}, nil
80+
}
81+
82+
if conf.AccountId == "" {
83+
s := client.NewSandboxServiceClient()
84+
resp, err := s.OpenSandboxAccount()
85+
if err != nil {
86+
return nil, err
87+
}
88+
client.Config.AccountId = resp.GetAccountId()
89+
}
90+
91+
return client, nil
8192
}
8293

8394
func setDefaultConfig(conf *Config) {

investgo/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Config struct {
1717
// AppName - Название вашего приложения, по умолчанию = tinkoff-api-go-sdk
1818
AppName string `yaml:"AppName"`
1919
// AccountId - Если уже есть аккаунт для апи можно указать напрямую,
20-
// для песочницы создастся и запишется автоматически
20+
// по умолчанию откроется новый счет в песочнице
2121
AccountId string `yaml:"AccountId"`
2222
// DisableResourceExhaustedRetry - Если true, то сдк не пытается ретраить, после получения ошибки об исчерпывании
2323
// лимита запросов, если false, то сдк ждет нужное время и пытается выполнить запрос снова. По умолчанию = false

investgo/instruments.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,24 @@ func (is *InstrumentsServiceClient) InstrumentByPositionUid(id string) (*Instrum
371371
return is.instrumentBy(id, pb.InstrumentIdType_INSTRUMENT_ID_TYPE_POSITION_UID, "")
372372
}
373373

374+
// LotByUid - Метод получения лотности инструмента по его Uid
375+
func (is *InstrumentsServiceClient) LotByUid(uid string) (int64, error) {
376+
resp, err := is.InstrumentByUid(uid)
377+
if err != nil {
378+
return 0, err
379+
}
380+
return int64(resp.GetInstrument().GetLot()), nil
381+
}
382+
383+
// LotByFigi - Метод получения лотности инструмента по его FIGI
384+
func (is *InstrumentsServiceClient) LotByFigi(figi string) (int64, error) {
385+
resp, err := is.InstrumentByFigi(figi)
386+
if err != nil {
387+
return 0, err
388+
}
389+
return int64(resp.GetInstrument().GetLot()), nil
390+
}
391+
374392
func (is *InstrumentsServiceClient) instrumentBy(id string, idType pb.InstrumentIdType, classCode string) (*InstrumentResponse, error) {
375393
var header, trailer metadata.MD
376394
resp, err := is.pbClient.GetInstrumentBy(is.ctx, &pb.InstrumentRequest{

investgo/md_stream.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,34 @@ type MarketDataStream struct {
2929
subs subscriptions
3030
}
3131

32+
type candleSub struct {
33+
interval pb.SubscriptionInterval
34+
waitingClose bool
35+
}
36+
3237
type subscriptions struct {
33-
candles map[string]pb.SubscriptionInterval
38+
candles map[string]candleSub
3439
orderBooks map[string]int32
3540
trades map[string]struct{}
3641
tradingStatuses map[string]struct{}
3742
lastPrices map[string]struct{}
3843
}
3944

4045
// SubscribeCandle - Метод подписки на свечи с заданным интервалом
41-
func (mds *MarketDataStream) SubscribeCandle(ids []string, interval pb.SubscriptionInterval) (<-chan *pb.Candle, error) {
42-
err := mds.sendCandlesReq(ids, interval, pb.SubscriptionAction_SUBSCRIPTION_ACTION_SUBSCRIBE)
46+
func (mds *MarketDataStream) SubscribeCandle(ids []string, interval pb.SubscriptionInterval, waitingClose bool) (<-chan *pb.Candle, error) {
47+
err := mds.sendCandlesReq(ids, interval, pb.SubscriptionAction_SUBSCRIPTION_ACTION_SUBSCRIBE, waitingClose)
4348
if err != nil {
4449
return nil, err
4550
}
4651
for _, id := range ids {
47-
mds.subs.candles[id] = interval
52+
mds.subs.candles[id] = candleSub{interval: interval, waitingClose: waitingClose}
4853
}
4954
return mds.candle, nil
5055
}
5156

5257
// UnSubscribeCandle - Метод отписки от свечей
53-
func (mds *MarketDataStream) UnSubscribeCandle(ids []string, interval pb.SubscriptionInterval) error {
54-
err := mds.sendCandlesReq(ids, interval, pb.SubscriptionAction_SUBSCRIPTION_ACTION_UNSUBSCRIBE)
58+
func (mds *MarketDataStream) UnSubscribeCandle(ids []string, interval pb.SubscriptionInterval, waitingClose bool) error {
59+
err := mds.sendCandlesReq(ids, interval, pb.SubscriptionAction_SUBSCRIPTION_ACTION_UNSUBSCRIBE, waitingClose)
5560
if err != nil {
5661
return err
5762
}
@@ -61,7 +66,7 @@ func (mds *MarketDataStream) UnSubscribeCandle(ids []string, interval pb.Subscri
6166
return nil
6267
}
6368

64-
func (mds *MarketDataStream) sendCandlesReq(ids []string, interval pb.SubscriptionInterval, act pb.SubscriptionAction) error {
69+
func (mds *MarketDataStream) sendCandlesReq(ids []string, interval pb.SubscriptionInterval, act pb.SubscriptionAction, waitingClose bool) error {
6570
instruments := make([]*pb.CandleInstrument, 0, len(ids))
6671
for _, id := range ids {
6772
instruments = append(instruments, &pb.CandleInstrument{
@@ -70,14 +75,12 @@ func (mds *MarketDataStream) sendCandlesReq(ids []string, interval pb.Subscripti
7075
})
7176
}
7277

73-
WCFlag := interval == pb.SubscriptionInterval_SUBSCRIPTION_INTERVAL_ONE_MINUTE
74-
7578
return mds.stream.Send(&pb.MarketDataRequest{
7679
Payload: &pb.MarketDataRequest_SubscribeCandlesRequest{
7780
SubscribeCandlesRequest: &pb.SubscribeCandlesRequest{
7881
SubscriptionAction: act,
7982
Instruments: instruments,
80-
WaitingClose: WCFlag,
83+
WaitingClose: waitingClose,
8184
}}})
8285
}
8386

@@ -307,14 +310,14 @@ func (mds *MarketDataStream) Stop() {
307310
func (mds *MarketDataStream) UnSubscribeAll() error {
308311
ids := make([]string, 0)
309312
if len(mds.subs.candles) > 0 {
310-
intervals := make(map[pb.SubscriptionInterval][]string, 0)
313+
candleSubs := make(map[candleSub][]string, 0)
311314

312-
for id, interval := range mds.subs.candles {
313-
intervals[interval] = append(intervals[interval], id)
315+
for id, c := range mds.subs.candles {
316+
candleSubs[c] = append(candleSubs[c], id)
314317
delete(mds.subs.candles, id)
315318
}
316-
for interval, ids := range intervals {
317-
err := mds.UnSubscribeCandle(ids, interval)
319+
for c, ids := range candleSubs {
320+
err := mds.UnSubscribeCandle(ids, c.interval, c.waitingClose)
318321
if err != nil {
319322
return err
320323
}

investgo/md_stream_client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (c *MarketDataStreamClient) MarketDataStream() (*MarketDataStream, error) {
2929
lastPrice: make(chan *pb.LastPrice, 1),
3030
tradingStatus: make(chan *pb.TradingStatus, 1),
3131
subs: subscriptions{
32-
candles: make(map[string]pb.SubscriptionInterval, 0),
32+
candles: make(map[string]candleSub, 0),
3333
orderBooks: make(map[string]int32, 0),
3434
trades: make(map[string]struct{}, 0),
3535
tradingStatuses: make(map[string]struct{}, 0),

retry/retry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func UnaryClientInterceptorRE(optFuncs ...CallOption) grpc.UnaryClientIntercepto
114114
switch {
115115
case status.Code(lastErr) == codes.ResourceExhausted:
116116
duration, err := durationFromTrailer(trailer)
117-
log.Printf("dur = %v\n", duration.String())
117+
log.Printf("Resource Exhausted, sleep for %v...\n", duration.String())
118118
if err != nil {
119119
return err
120120
}

0 commit comments

Comments
 (0)