Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: integrate kucoin api #349

Merged
merged 14 commits into from
Dec 11, 2021
Prev Previous commit
Next Next commit
kucoin: add query accounts api
  • Loading branch information
c9s committed Dec 11, 2021
commit 5045e995e9f7996de9e02c30009b086dda076e19
70 changes: 70 additions & 0 deletions examples/kucoin-accounts/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package main

import (
"context"
"os"
"strings"

"github.com/c9s/bbgo/pkg/exchange/kucoin/kucoinapi"
"github.com/joho/godotenv"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

func init() {
rootCmd.PersistentFlags().String("kucoin-api-key", "", "okex api key")
rootCmd.PersistentFlags().String("kucoin-api-secret", "", "okex api secret")
rootCmd.PersistentFlags().String("kucoin-api-passphrase", "", "okex api secret")
}

var rootCmd = &cobra.Command{
Use: "kucoin-accounts",
Short: "kucoin accounts",

// SilenceUsage is an option to silence usage when an error occurs.
SilenceUsage: true,

RunE: func(cmd *cobra.Command, args []string) error {
accounts, err := client.AccountService.QueryAccounts()
if err != nil {
return err
}

log.Infof("accounts: %+v", accounts)
return nil
},
}

var client *kucoinapi.RestClient = nil

func main() {
if _, err := os.Stat(".env.local"); err == nil {
if err := godotenv.Load(".env.local"); err != nil {
log.Fatal(err)
}
}

viper.AutomaticEnv()
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))

if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil {
log.WithError(err).Error("bind pflags error")
}

client = kucoinapi.NewClient()

key, secret, passphrase := viper.GetString("kucoin-api-key"),
viper.GetString("kucoin-api-secret"),
viper.GetString("kucoin-api-passphrase")

if len(key) == 0 || len(secret) == 0 || len(passphrase) == 0 {
log.Fatal("empty key, secret or passphrase")
}

client.Auth(key, secret, passphrase)

if err := rootCmd.ExecuteContext(context.Background()); err != nil {
log.WithError(err).Error("cmd error")
}
}
34 changes: 34 additions & 0 deletions pkg/exchange/kucoin/kucoinapi/account.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kucoinapi

import "github.com/c9s/bbgo/pkg/fixedpoint"

type AccountService struct {
client *RestClient
Expand Down Expand Up @@ -33,5 +34,38 @@ func (s *AccountService) QuerySubAccounts() ([]SubAccount, error) {
return nil, err
}

return apiResponse.Data, nil
}

type Account struct {
ID string `json:"id"`
Currency string `json:"currency"`
Type string `json:"type"`
Balance fixedpoint.Value `json:"balance"`
Available fixedpoint.Value `json:"available"`
Holds fixedpoint.Value `json:"holds"`
}

func (s *AccountService) QueryAccounts() ([]Account, error) {
req, err := s.client.newAuthenticatedRequest("GET", "/api/v1/accounts", nil, nil)
if err != nil {
return nil, err
}

response, err := s.client.sendRequest(req)
if err != nil {
return nil, err
}

var apiResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []Account `json:"data"`
}

if err := response.DecodeJSON(&apiResponse); err != nil {
return nil, err
}

return apiResponse.Data, nil
}
34 changes: 0 additions & 34 deletions pkg/exchange/kucoin/kucoinapi/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,40 +216,6 @@ type BalanceDetail struct {
UnrealizedProfitAndLoss fixedpoint.Value `json:"upl"`
}

type Account struct {
TotalEquityInUSD fixedpoint.Value `json:"totalEq"`
UpdateTime string `json:"uTime"`
Details []BalanceDetail `json:"details"`
}

func (c *RestClient) AccountBalances() (*Account, error) {
req, err := c.newAuthenticatedRequest("GET", "/api/v5/account/balance", nil, nil)
if err != nil {
return nil, err
}

response, err := c.sendRequest(req)
if err != nil {
return nil, err
}

var balanceResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []Account `json:"data"`
}

if err := response.DecodeJSON(&balanceResponse); err != nil {
return nil, err
}

if len(balanceResponse.Data) == 0 {
return nil, errors.New("empty account data")
}

return &balanceResponse.Data[0], nil
}

type AssetBalance struct {
Currency string `json:"ccy"`
Balance fixedpoint.Value `json:"bal"`
Expand Down