Tinkoff / invest-openapi-go-sdk

Apache License 2.0
153 stars 30 forks source link

Snapshorts #31

Closed rez1dent3 closed 3 years ago

rez1dent3 commented 4 years ago

Доброе время суток.

Необходима возможнасть создания снепшотов боевого состояния профиля. Те, сделаю запрос с боевым токеном и сохраняю состояние профиля в объект (акции, облигации, ...). Далее объект разворачиваю уже в песочнице для тестов. Иногда необходимо работать с более реальными данными.

Спасибо за простое и удобное SDK.

necryin commented 4 years ago

Доброго дня Это можно сделать примерно вот так

client := sdk.NewRestClient("боевой токен")
accountID := "боевой accountID"
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

portfolio, err := client.Portfolio(ctx, accountID)
if err != nil {
 log.Fatalln(err)
}

sandboxClient := sdk.NewSandboxRestClient("токен песочницы")
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

sandBoxAccount, err := sandboxClient.Register(ctx, sdk.AccountTinkoff)
if err != nil {
 log.Fatalln(err)
}

ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

for _, currency := range portfolio.Currencies {
 err = sandboxClient.SetCurrencyBalance(ctx, sandBoxAccount.ID, currency.Currency, currency.Balance)
 if err != nil {
  log.Fatalln(err)
 }
}
for _, position := range portfolio.Positions {
 err = sandboxClient.SetPositionsBalance(ctx, sandBoxAccount.ID, position.FIGI, position.Balance)
 if err != nil {
  log.Fatalln(err)
 }
}

sandBoxPortfolio, err := sandboxClient.Portfolio(ctx, sandBoxAccount.ID)
if err != nil {
 log.Fatalln(err)
}
log.Printf("%+v\n", sandBoxPortfolio)
rez1dent3 commented 4 years ago

@necryin спасибо, но меня больше интересуют другие параметры: AveragePositionPrice, AveragePositionPriceNoNkd.

Если проставлять через SetPositionsBalance/SetCurrencyBalance параметров не будет.

{FIGI:BBG000BBGQF1 Ticker:AIR ISIN:US0003611052 InstrumentType:Stock Balance:5 Blocked:0 Lots:5 ExpectedYield:{Currency: Value:0} AveragePositionPrice:{Currency: Value:0} AveragePositionPriceNoNkd:{Currency: Value:0} Name:AAR Corp}

Пробовал через LimitOrder, тоже не вышло. Видимо бэкэнд отдает всегда нулевые параметры для sandbox.

    for _, position := range portfolio.Positions {
        if position.Lots == 0 { continue }
        money := position.AveragePositionPrice.Value * position.Balance
        _ = sandboxClient.SetCurrencyBalance(ctx, sandBoxAccount.ID, position.AveragePositionPrice.Currency, money)
        _, err = sandboxClient.LimitOrder(ctx, sandBoxAccount.ID, position.FIGI, position.Lots, sdk.BUY, position.AveragePositionPrice.Value)
        if err != nil {
            log.Fatalln(err)
        }
    }

Есть ли возможность снепшотить боевое состояние и восстанавливать в тестовом окружении?

necryin commented 4 years ago

@NikitaMelnikov реально сделать такое?

rez1dent3 commented 4 years ago

@necryin @NikitaMelnikov, как я понимаю, нет технической возможности?

NikitaMelnikov commented 4 years ago

Техническая возможность есть, но пока что в планы не добавляли