ZetCode

Go Binance

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何使用 go-binance 包在 Go 中处理 Binance 交易所。

go-binance 是一个非官方的 Golang Binance API SDK。Binance 是一个流行的加密货币交易所。Binance 同时提供公共 API 和私有 API。对于私有 API,我们需要提供 API 密钥。

Golang Binance 交易对列表

交易对是一个交易品种。它由基础资产和计价资产组成。给定一个交易对 LTCBUSD,LTC 代表基础资产,BUSD 代表计价资产。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/adshao/go-binance/v2"
)

func main() {
    
    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )
 
    client := binance.NewClient(apiKey, secretKey)

    res, err := client.NewExchangeInfoService().Symbols().Do(context.Background())

    if err != nil {

        log.Fatal(err)
    }

    fmt.Println(len(res.Symbols))

    for _, e := range res.Symbols {

        fmt.Printf("%s %s %s %s\n", e.Symbol, e.Status, e.BaseAsset, e.QuoteAsset)
    }
}

在程序中,我们将列出 Binance 上所有可用的交易对。

var (
    apiKey    = os.Getenv("BINANCE_API_KEY")
    secretKey = os.Getenv("BINANCE_SECRET_KEY")
)

client := binance.NewClient(apiKey, secretKey)

我们初始化客户端。密钥存储在环境变量中。

res, err := client.NewExchangeInfoService().Symbols().Do(context.Background())

我们调用 NewExchangeInfoService 服务。

for _, e := range res.Symbols {

    fmt.Printf("%s %s %s %s\n", e.Symbol, e.Status, e.BaseAsset, e.QuoteAsset)
}

我们遍历列表并将它们打印到控制台。我们打印交易对名称、状态、基础资产和计价资产。

$ go run main.go
2206
ETHBTC TRADING ETH BTC
LTCBTC TRADING LTC BTC
BNBBTC TRADING BNB BTC
NEOBTC TRADING NEO BTC
...

Golang Binance 检查余额

在下一个示例中,我们将查看资产余额。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strconv"

    "github.com/adshao/go-binance/v2"
)

func main() {

    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )

    client := binance.NewClient(apiKey, secretKey)

    res, err := client.NewGetAccountService().Do(context.Background())

    if err != nil {

        log.Fatal(err)
    }

    for _, e := range res.Balances {

        free, _ := strconv.ParseFloat(e.Free, 32)
        locked, _ := strconv.ParseFloat(e.Locked, 32)

        if free > 0 || locked > 0 {

            fmt.Printf("%-5s %18f %10f\n", e.Asset, free, locked)
        }
    }
}

在程序中,我们检查所有大于 0 的资产余额。

res, err := client.NewGetAccountService().Do(context.Background())

我们调用 NewGetAccountService

for _, e := range res.Balances {

    free, _ := strconv.ParseFloat(e.Free, 32)
    locked, _ := strconv.ParseFloat(e.Locked, 32)

    if free > 0 || locked > 0 {

        fmt.Printf("%-5s %18f %10f\n", e.Asset, free, locked)
    }
}

我们在 for 循环中遍历余额。可用金额是自由可用的,而锁定金额则被锁定在现有订单中。

Golang Binance 列出价格

要列出当前价格,我们调用 NewListPricesService 服务。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strconv"

    "github.com/adshao/go-binance/v2"
)

func main() {
    
    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )
    client := binance.NewClient(apiKey, secretKey)

    res, err := client.NewListPricesService().
        Do(context.Background())

    if err != nil {

        log.Fatal(err)
    }

    for _, e := range res {

        price, _ := strconv.ParseFloat(e.Price, 32)
        fmt.Printf("%-14s %20f\n", e.Symbol, price)
    }
}

该示例列出了所有交易对的价格。

$ go run main.go
ETHBTC                     0.065500
LTCBTC                     0.003044
BNBBTC                     0.011405
NEOBTC                     0.000350
QTUMETH                    0.001455
EOSETH                     0.000541
SNTETH                     0.000014
BNTETH                     0.000250
...

在下一个示例中,我们将检查特定交易对的当前价格。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strconv"

    "github.com/adshao/go-binance/v2"
)

func main() {
    
    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )

    client := binance.NewClient(apiKey, secretKey)

    res, err := client.NewListPricesService().Symbol("LTCUSDT").
        Do(context.Background())

    if err != nil {
        log.Fatal(err)
    }

    for _, e := range res {

        price, _ := strconv.ParseFloat(e.Price, 32)
        fmt.Printf("%-14s %20f\n", e.Symbol, price)
    }
}

使用 Symbol 函数,我们检查 LTCUSDT 交易对的价格。


最后,我们检查几个选定交易对的价格。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strconv"

    "github.com/adshao/go-binance/v2"
)

func main() {
    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )
    client := binance.NewClient(apiKey, secretKey)

    res, err := client.NewListPricesService().Symbols([]string{"LTCBUSD", "LTCUSDT", "LTCBTC", "LTCETH"}).
        Do(context.Background())

    if err != nil {
        log.Fatal(err)
    }

    for _, e := range res {

        price, _ := strconv.ParseFloat(e.Price, 32)
        fmt.Printf("%-14s %20f\n", e.Symbol, price)
    }
}

要列出几个交易对的价格,我们使用 Symbols 函数。

$ go run main.go
LTCBTC                     0.003042
LTCETH                     0.046490
LTCUSDT                   86.349998
LTCBUSD                   86.370003

Golang Binance 列出订单

NewListOrdersService 用于列出已执行的订单。

main.go
package main

import (
    "context"
    "log"
    "os"
    "time"

    "github.com/adshao/go-binance/v2"
    "github.com/fatih/color"
    "github.com/rodaine/table"
)

func main() {

    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )

    client := binance.NewClient(apiKey, secretKey)

    orders, err := client.NewListOrdersService().Symbol("FTMBUSD").
        Do(context.Background())

    if err != nil {

        log.Fatal(err)
    }

    tbl := table.New("Date", "Symbol", "Price", "Qty", "Side", "Type", "Status")
    headerFmt := color.New(color.FgGreen, color.Underline).SprintfFunc()
    columnFmt := color.New(color.FgBlue).SprintfFunc()

    tbl.WithHeaderFormatter(headerFmt).WithFirstColumnFormatter(columnFmt)

    for _, o := range orders {

        t := time.UnixMilli(o.Time)
        tf := t.Format("Jan 2, 2006")

        tbl.AddRow(tf, o.Symbol, o.Price, o.ExecutedQuantity, string(o.Side),
            string(o.Type), string(o.Status))

    }

    tbl.Print()
}

该程序列出了 FTMBUSD 的订单。数据以整洁的表格显示。表格使用 rodaine/table 包创建。颜色使用 fatih/color 包创建。

orders, err := client.NewListOrdersService().Symbol("FTMBUSD").
    Do(context.Background())

我们为 FTMBUSD 交易对调用该服务。

tbl := table.New("Date", "Symbol", "Price", "Qty", "Side", "Type", "Status")
headerFmt := color.New(color.FgGreen, color.Underline).SprintfFunc()
columnFmt := color.New(color.FgBlue).SprintfFunc()

tbl.WithHeaderFormatter(headerFmt).WithFirstColumnFormatter(columnFmt)

我们设置表头列及其格式。

for _, o := range orders {

    t := time.UnixMilli(o.Time)
    tf := t.Format("Jan 2, 2006")

    tbl.AddRow(tf, o.Symbol, o.Price, o.ExecutedQuantity, string(o.Side),
        string(o.Type), string(o.Status))

}

我们遍历获取的订单并将它们添加到表中。

tbl.Print()

最后,表格被打印到控制台。

订单簿

订单簿是特定资产当前买入订单(bid)和卖出订单(ask)的列表。订单簿列出买入/卖出订单的价格以及买卖代币的数量。

买入价格显示为绿色数字,卖出价格显示为红色数字。

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/adshao/go-binance/v2"
    "github.com/jedib0t/go-pretty/v6/table"
    "github.com/jedib0t/go-pretty/v6/text"
)

func main() {

    var (
        apiKey    = os.Getenv("BINANCE_API_KEY")
        secretKey = os.Getenv("BINANCE_SECRET_KEY")
    )
    client := binance.NewClient(apiKey, secretKey)

    tickers, err := client.NewDepthService().Symbol("LTCBUSD").Limit(15).
        Do(context.Background())

    if err != nil {
        log.Fatal(err)
    }

    // Bids

    t := table.NewWriter()
    t.SetTitle("LTC")
    t.SetCaption("Bids")
    t.SetAutoIndex(true)
    t.SetStyle(table.StyleColoredGreenWhiteOnBlack)
    t.Style().Format.Header = text.FormatTitle
    t.SetColumnConfigs([]table.ColumnConfig{
        {Number: 1, Align: text.AlignRight},
        {Number: 2, Align: text.AlignRight}})

    t.AppendHeader(table.Row{"Price", "Quatity"})

    for _, bid := range tickers.Bids {

        t.AppendRow(table.Row{bid.Price, bid.Quantity})
    }

    fmt.Println(t.Render())

    fmt.Println()

    // Asks

    t2 := table.NewWriter()
    t2.SetTitle("LTC")
    t2.SetCaption("Asks")
    t2.SetAutoIndex(true)
    t2.SetStyle(table.StyleColoredRedWhiteOnBlack)
    t2.Style().Format.Header = text.FormatTitle
    t2.Style().Format.Row = text.Format(text.AlignRight)
    t2.SetColumnConfigs([]table.ColumnConfig{
        {Number: 1, Align: text.AlignRight},
        {Number: 2, Align: text.AlignRight}})

    t2.AppendHeader(table.Row{"Price", "Quatity"})

    for _, ask := range tickers.Asks {

        t2.AppendRow(table.Row{ask.Price, ask.Quantity})
    }

    fmt.Println(t2.Render())
}

该程序显示了 Binance 交易所 LTCBUSD 交易对的订单簿。买入显示在绿色表格中,卖出显示在红色表格中。我们使用 go-pretty 包创建表格。

tickers, err := client.NewDepthService().Symbol("LTCBUSD").Limit(15).
    Do(context.Background())

订单簿通过 NewDepthService 检索。我们将行数限制为 15。

// Bids

t := table.NewWriter()
t.SetTitle("LTC")
t.SetCaption("Bids")
t.SetAutoIndex(true)
t.SetStyle(table.StyleColoredGreenWhiteOnBlack)
t.Style().Format.Header = text.FormatTitle
t.SetColumnConfigs([]table.ColumnConfig{
    {Number: 1, Align: text.AlignRight},
    {Number: 2, Align: text.AlignRight}})

我们为买入/卖出订单设置表。

for _, bid := range tickers.Bids {

    t.AppendRow(table.Row{bid.Price, bid.Quantity})
}

fmt.Println(t.Render())

我们用数据填充表并将其渲染到控制台。买入通过 Bids 字段访问。

来源

Go binance - Github 页面

在本文中,我们已经在 Golang 中处理了 Binance 交易所。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程