Skip to content

Неофициальный Go SDK для работы Finam Trade API

License

Notifications You must be signed in to change notification settings

Ruvad39/go-finam-grpc

Repository files navigation

Неофициальный Go SDK для Finam Trade API

gRPC-клиент создан на базе proto файлов

⚠️ Важное предупреждение
Это неофициальная библиотека для работы с Finam Trade API.
Возможны ошибки как в реализации SDK, так и в самом Trade API.
Используйте этот код на свой страх и риск.
Разработчик не несет ответственности за потери.

Установка

go get github.com/Ruvad39/go-finam-grpc

Примеры

Пример создание клиента. Получение данных по токену

ctx := context.Background()
token, _ := "FINAM_TOKEN"
client, err := finam.NewClient(ctx, token)
if err != nil {
    slog.Error("NewClient", "err", err.Error())
return
}
defer client.Close()

// Получение информации о токене сессии
res, err := client.GetTokenDetails(ctx)
if err != nil {
    slog.Error("main", "AuthService.TokenDetails", err.Error())
}
slog.Info("main", "res", res)

Получить информацию по торговому счету

// создаем клиент для доступа к AccountService
accountService := client.NewAccountServiceClient()

// запрос по заданному счету
res, err := accountServicet.GetAccount(ctx,  "FINAM_ACCOUNT_ID")
if err != nil {
    slog.Error("AccountsService.GetAccount", "GetAccount", err.Error())
    return
}
slog.Info("AccountsService.GetAccount",
    "AccountId", res.AccountId,
    "Type", res.Type,
    "Status", res.Status,
    "Equity", fmt.Sprintf("%.2f", finam.DecimalToFloat64(res.Equity)),
    "UnrealizedProfit", fmt.Sprintf("%.2f", finam.DecimalToFloat64(res.UnrealizedProfit)),
    "Cash", res.Cash,
)

// список позиций
for row, pos := range res.Positions {
    slog.Info("AccountsService.GetAccount.Positions",
        "row", row,
        "Symbol", pos.Symbol,
        "Quantity", finam.DecimalToFloat64(pos.Quantity),
        "AveragePrice", finam.DecimalToFloat64(pos.AveragePrice),
        "CurrentPrice", finam.DecimalToFloat64(pos.CurrentPrice),
    )
}	

Подробные примеры смотрите тут

Методы реализованные на текущие момент

// AssetServiceClient 
// вернем текущее время сервера (в TzMoscow)
GetTime(ctx context.Context) (time.Time, error)
// Получение списка доступных бирж, названия и mic коды
GetExchanges(ctx context.Context) (*pb.ExchangesResponse, error)
// Получение списка доступных инструментов, их описание
GetAssets(ctx context.Context) (*pb.AssetsResponse, error)
// Получение информации по конкретному инструменту
GetAsset(ctx context.Context, accountId, symbol string) (*pb.GetAssetResponse, error)
// Получение торговых параметров по инструменту
GetAssetParams(ctx context.Context, accountId, symbol string) (*pb.GetAssetParamsResponse, error)
// Получение расписания торгов для инструмента
GetSchedule(ctx context.Context, symbol string) (*pb.ScheduleResponse, error)
// TODO OptionsChain

// AccountServiceClient 
// Получение информации по конкретному счету
GetAccount(ctx context.Context, accountId string) (*pb.GetAccountResponse, error)
// Получение истории по сделкам заданного счета
GetTrades(ctx context.Context, accountId string, start, end time.Time, limit int32) (*pb.TradesResponse, error)
// Получение списка транзакций по счету
GetTransactions(ctx context.Context, accountId string, start, end time.Time, limit int32) (*pb.TransactionsResponse, error)

// MarketDataServiceClient 
// Получение исторических данных по инструменту (агрегированные свечи)
GetBars(ctx context.Context, symbol string, tf pb.TimeFrame, start, end time.Time)
// Получение исторических данных по инструменту (агрегированные свечи)
// разбиваем период на интервалы (от глубины рынка) и делаем несколько запросов к брокеру
GetGetHistoryBars(ctx context.Context, symbol string, tf pb.TimeFrame, start, end time.Time, limit int)
// Получение последней котировки по инструменту
GetLastQuote(ctx context.Context, symbol string) (*pb.QuoteResponse, error)
// получение списка последних сделок по инструменту
GetLatestTrades(ctx context.Context, symbol string) (*pb.BarsResponse, error)
// Получение текущего стакана по инструменту
GetOrderBook(ctx context.Context, symbol string) (*pb.OrderBookResponse, error)

// OrderServiceClient
// Получение списка заявок по заданному счету
GetOrders(ctx context.Context, accountId string) (*pb.OrdersResponse, error)
// Получение информации о конкретном ордере
GetOrder(ctx context.Context, accountId, orderId string) (*pb.OrderState, error)
// Отмена биржевой заявки
CancelOrder(ctx context.Context, accountId, orderId string) (*pb.OrderState, error)
// Выставление биржевой заявки
PlaceOrder(ctx context.Context, order *pb.Order) (*pb.OrderState, error)

// Вспомогательные методы для создания ордера
// создать ордер на покупку по рынку
NewBuyOrder(accountId, symbol string, quantity int) *pb.Order {
// создать ордер на продажу по рынку
NewSellOrder(accountId, symbol string, quantity int) *pb.Order {
// создать ордер на покупку по лимитной цене
NewBuyLimitOrder(accountId, symbol string, quantity int, price float64) *pb.Order
// создать ордер на продажу по лимитной цене
NewSellLimitOrder(accountId, symbol string, quantity int, price float64) *pb.Order

// Потоки данных (stream)
// Подписка на ордера по заданному счету
NewOrderStream(parent context.Context, accountId string, callbackOrder func(*orders_service.OrderState))
// Подписка на ордера на по заданному счету (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewOrderStreamWithCallback(parent context.Context, accountId string, callbackOrder func(*orders_service.OrderState))
// Подписка на сделки по заданному счету
NewTradeStream(parent context.Context, accountId string, callback func(*v1.AccountTrade))
// Подписка на сделки по заданному счету (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewTradeStreamWithCallback(parent context.Context, accountId string, callback func(*v1.AccountTrade))
// Подписка на стакан по заданному инструменту
NewOrderBookStream(parent context.Context, symbol string, callback func(book []*pb.StreamOrderBook))
// создание стрима на агрегированные свечи с возрвтом канала (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewBarStreamWithChannel(parent context.Context, symbol string, timeframe marketdata_service.TimeFrame) (*BarStream, chan *Bar)
// создание стрима на агрегированные свечи с указанием callback функции (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewBarStreamWithCallback(parent context.Context, symbol string, timeframe marketdata_service.TimeFrame, callback func(bar *Bar))
// создание стрима котировок с возвратом канала (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewQuoteStreamWithChannel(parent context.Context, symbols []string)
// создание стрима котировок с указанием callback функции (стрим НЕ запускается по умолчанию => Нужно выполнить метод  Start())
NewQuoteStreamWithCallback(parent context.Context, symbols []string, callback func(q *marketdata_service.Quote))

About

Неофициальный Go SDK для работы Finam Trade API

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages