MCPcopy
hub / github.com/ccxt/go-binance

github.com/ccxt/go-binance @v2.8.12 sqlite

repository ↗ · DeepWiki ↗ · release v2.8.12 ↗
6,653 symbols 22,124 edges 611 files 3,594 documented · 54%
README

go-binance

A Golang SDK for binance API.

Telegram Chat Build Status GoDoc Go Report Card codecov

All the REST APIs listed in binance API document are implemented, as well as the websocket APIs.

For best compatibility, please use Go >= 1.8.

Make sure you have read binance API document before continuing.

Community

Join our growing community on Telegram to get help, or just chat!

https://t.me/gobinancegroup

API List

Name Description Status
rest-api.md Details on the Rest API (/api) Implemented
web-socket-streams.md Details on available streams and payloads Implemented
user-data-stream.md Details on the dedicated account stream Implemented
margin-api.md Details on the Margin API (/sapi) Implemented
futures-api.md Details on the Futures API (/fapi) Implemented
delivery-api.md Details on the Coin-M Futures API (/dapi) Implemented
options-api.md Details on the Options API(/eapi) Implemented
portfolio-margin-api.md Details on the Portfolio Margin API(/papi) Implemented

If you find an unimplemented interface, please submit an issue. It's great if you can open a PR to fix it.

Installation

go get github.com/adshao/go-binance/v2

For v1 API, it has been moved to v1 branch, please use:

go get github.com/adshao/go-binance/v1

Importing

import (
    // for spot and other interfaces contained in https://binance-docs.github.io/apidocs/spot/en/#change-log
    "github.com/adshao/go-binance/v2"

    "github.com/adshao/go-binance/v2/futures" // optional package
    "github.com/adshao/go-binance/v2/delivery" // optional package
    "github.com/adshao/go-binance/v2/options" // optional package
)

Documentation

GoDoc

REST API

Setup

Init client for API services. Get APIKey/SecretKey from your binance account.

var (
    apiKey = "your api key"
    secretKey = "your secret key"
)
client := binance.NewClient(apiKey, secretKey)
futuresClient := binance.NewFuturesClient(apiKey, secretKey)    // USDT-M Futures
deliveryClient := binance.NewDeliveryClient(apiKey, secretKey)  // Coin-M Futures

A service instance stands for a REST API endpoint and is initialized by client.NewXXXService function.

Simply call API in chain style. Call Do() in the end to send HTTP request.

Following are some simple examples, please refer to godoc for full references.

If you have any questions, please refer to the specific version of the code for specific reference definitions or usage methods

Proxy Client
proxyUrl := "http://127.0.0.1:7890" // Please replace it with your exact proxy URL.
client := binance.NewProxiedClient(apiKey, apiSecret, proxyUrl)

Create Order

order, err := client.NewCreateOrderService().Symbol("BNBETH").
        Side(binance.SideTypeBuy).Type(binance.OrderTypeLimit).
        TimeInForce(binance.TimeInForceTypeGTC).Quantity("5").
        Price("0.0030000").Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(order)

// Use Test() instead of Do() for testing.

Get Order

order, err := client.NewGetOrderService().Symbol("BNBETH").
    OrderID(4432844).Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(order)

Cancel Order

_, err := client.NewCancelOrderService().Symbol("BNBETH").
    OrderID(4432844).Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}

List Open Orders

openOrders, err := client.NewListOpenOrdersService().Symbol("BNBETH").
    Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
for _, o := range openOrders {
    fmt.Println(o)
}

List Orders

orders, err := client.NewListOrdersService().Symbol("BNBETH").
    Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
for _, o := range orders {
    fmt.Println(o)
}

List Ticker Prices

prices, err := client.NewListPricesService().Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
for _, p := range prices {
    fmt.Println(p)
}

Show Depth

res, err := client.NewDepthService().Symbol("LTCBTC").
    Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(res)

List Klines

klines, err := client.NewKlinesService().Symbol("LTCBTC").
    Interval("15m").Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
for _, k := range klines {
    fmt.Println(k)
}

List Aggregate Trades

trades, err := client.NewAggTradesService().
    Symbol("LTCBTC").StartTime(1508673256594).EndTime(1508673256595).
    Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
for _, t := range trades {
    fmt.Println(t)
}

Get Account

res, err := client.NewGetAccountService().Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(res)

Start User Stream

res, err := client.NewStartUserStreamService().Do(context.Background())
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(res)

Websocket

You don't need Client in websocket API. Just call binance.WsXxxServe(args, handler, errHandler).

For delivery API you can use delivery.WsXxxServe(args, handler, errHandler).

If you want to use a proxy, you can set HTTPS_PROXY or HTTP_PROXY in the environment variable, or you can call SetWsProxyUrl in the target packages within your code. Then you can call other websocket functions. For example:

binance.SetWsProxyUrl("http://127.0.0.1:7890")
binance.WsDepthServe("LTCBTC", wsDepthHandler, errHandler)

Depth

wsDepthHandler := func(event *binance.WsDepthEvent) {
    fmt.Println(event)
}
errHandler := func(err error) {
    fmt.Println(err)
}
doneC, stopC, err := binance.WsDepthServe("LTCBTC", wsDepthHandler, errHandler)
if err != nil {
    fmt.Println(err)
    return
}
// use stopC to exit
go func() {
    time.Sleep(5 * time.Second)
    stopC <- struct{}{}
}()
// remove this if you do not want to be blocked here
<-doneC

Kline

wsKlineHandler := func(event *binance.WsKlineEvent) {
    fmt.Println(event)
}
errHandler := func(err error) {
    fmt.Println(err)
}
doneC, _, err := binance.WsKlineServe("LTCBTC", "1m", wsKlineHandler, errHandler)
if err != nil {
    fmt.Println(err)
    return
}
<-doneC

Aggregate

wsAggTradeHandler := func(event *binance.WsAggTradeEvent) {
    fmt.Println(event)
}
errHandler := func(err error) {
    fmt.Println(err)
}
doneC, _, err := binance.WsAggTradeServe("LTCBTC", wsAggTradeHandler, errHandler)
if err != nil {
    fmt.Println(err)
    return
}
<-doneC

User Data

⚠️ Deprecated: The listen key method (WsUserDataServe) is deprecated. Use WsUserDataServeSignature instead.

Recommended Method (Websocket API):

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "github.com/adshao/go-binance/v2"
)

// Handler for user data events
userDataHandler := func(event *binance.WsUserDataEvent) {
    fmt.Printf("Event: %s, Time: %d\n", event.Event, event.Time)

    switch event.Event {
    case binance.UserDataEventTypeOutboundAccountPosition:
        fmt.Printf("Account Update: %+v\n", event.AccountUpdate)
    case binance.UserDataEventTypeBalanceUpdate:
        fmt.Printf("Balance Update: %+v\n", event.BalanceUpdate)
    case binance.UserDataEventTypeExecutionReport:
        fmt.Printf("Order Update: %+v\n", event.OrderUpdate)
    case binance.UserDataEventTypeListStatus:
        fmt.Printf("OCO Update: %+v\n", event.OCOUpdate)
    }
}

errHandler := func(err error) {
    fmt.Println(err)
}

// Connect using signature-based authentication (recommended)
doneC, stopC, err := binance.WsUserDataServeSignature(
    apiKey,           // Your API key
    secretKey,        // Your secret key
    keyType,          // "HMAC", "RSA", or "ED25519" (empty string for HMAC)
    timeOffset,       // Time offset in milliseconds (usually 0)
    userDataHandler,  // Event handler
    errHandler,       // Error handler
)
if err != nil {
    fmt.Println(err)
    return
}
<-doneC

Setting Server Time

Your system time may be incorrect and you may use following function to set the time offset based off Binance Server Time:

// use the client future for Futures
client.NewSetServerTimeService().Do(context.Background())

Or you can also overwrite the TimeOffset yourself:

client.TimeOffset = 123

Testnet

You can use the testnet by enabling the corresponding flag.

Note that you can't use your regular API and Secret keys for the testnet. You have to create an account on the testnet websites : https://testnet.binancefuture.com/ for futures and delivery or https://testnet.binance.vision/ for the Spot Test Network.

Spot

Use the binance.UseTestnet flag before calling the client creation and the websockets methods.

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

binance.UseTestnet = true
client := binance.NewClient(apiKey, secretKey)

Futures (usd(s)-m futures)

Use the futures.UseTestnet flag before calling the client creation and the websockets methods

import (
    "github.com/adshao/go-binance/v2/futures"
)

futures.UseTestnet = true
BinanceClient = futures.NewClient(ApiKey, SecretKey)

Delivery (coin-m futures)

Use the delivery.UseTestnet flag before calling the client creation and the websockets methods

import (
    "github.com/adshao/go-binance/v2/delivery"
)

delivery.UseTestnet = true
BinanceClient = delivery.NewClient(ApiKey, SecretKey)

Websocket client

Order place
Async write/read
func main() {
    orderPlaceService, _ := futures.NewOrderPlaceWsService(apiKey, secretKey)

    ctx, cancel := context.WithCancel(context.Background())

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    go func() {
        select {
            case <-c:
            cancel()
        }
    }()

    request := futures.NewOrderPlaceWsRequest()
    request.
        Symbol("BTCUSDT").
        Side(futures.SideTypeSell).
        Type(futures.OrderTypeLimit).
        Price("68198.00").
        Quantity("0.002").
        TimeInForce(futures.TimeInForceTypeGTC)

    // sender
    go func() {
        for {
            select {
            case <-ctx.Done():
                return
            default:
                err := orderPlaceService.Do("id", request)
                if err != nil {
                    return
                }
            }
        }
    }()

    wg := &sync.WaitGroup{}
    wg.Add(1)
    go listenOrderPlaceResponse(ctx, wg, orderPlaceService)
    wg.Wait()

    log.Println("exit")
}

func listenOrderPlaceResponse(ctx context.Context, wg *sync.WaitGroup, orderPlaceService *futures.OrderPlaceWsService) {
    defer wg.Done()

    go func() {
        for msg := range orderPlaceService.GetReadChannel() {
            log.Println("order place response", string(msg))
        }
    }()

    go func() {
        for err := range orderPlaceService.GetReadErrorChannel() {
            log.Println("order place error", err)
        }
    }()

    select {
    case <-ctx.Done():
        orderPlaceService.ReceiveAllDataBeforeStop(10 * time.Second)
    }
}
Sync write/read
func main() {
    orderPlaceService, _ := futures.NewOrderPlaceWsService(apiKey, secretKey)

    id := "some-id"
    request := futures.NewOrderPlaceWsRequest()
    request.
        Symbol("BTCUSDT").
        Side(futures.SideTypeSell).
        Type(futures.OrderTypeLimit).
        Price("68198.00").
        Quantity("0.002").
        TimeInForce(futures.TimeInForceTypeGTC)

    response, err := orderPlaceService.SyncDo(id, request)
    if err != nil {
        log.Fatal(err)
    }

    // handle response
}

Star history

Star History Chart

Check out some of the other packages

  • Check out [CCXT]

Extension points exported contracts — how you extend this code

WsUserDataHandler (Interface)
WsUserDataHandler represents a handler for user data events [1 implementers]
v2/portfolio/websocket_service.go
WsPartialDepthHandler (FuncType)
WsPartialDepthHandler handle websocket partial depth event
v2/websocket_service.go
RequestOption (FuncType)
RequestOption define option type for request
v2/request.go
WsHandler (FuncType)
WsHandler handle raw websocket message
v2/websocket.go
WsAggTradeHandler (FuncType)
WsAggTradeHandler handle websocket that push trade information that is aggregated for a single taker order.
v2/delivery/websocket_service.go
RequestOption (FuncType)
RequestOption define option type for request
v2/portfolio_pro/request.go
WsUserDataHandler (FuncType)
WsUserDataHandler handle WsUserDataEvent
v2/options/websocket_service.go
Client (Interface)
(no doc) [2 implementers]
v2/common/websocket/client.go

Core symbols most depended-on inside this repo

setParam
called by 524
v2/request.go
setParam
called by 475
v2/portfolio/request.go
Do
called by 336
v2/portfolio/server_service.go
Len
called by 297
v2/common/websocket/client.go
Do
called by 256
v2/server_service.go
Error
called by 249
v2/portfolio/errors.go
callAPI
called by 196
v2/client.go
setParam
called by 177
v2/futures/request.go

Shape

Method 4,082
Struct 1,570
Function 767
TypeAlias 146
FuncType 85
Interface 3

Languages

Go100%

Modules by API surface

v2/subaccount_service.go345 symbols
v2/client.go237 symbols
v2/subaccount_service_test.go149 symbols
v2/portfolio/client.go141 symbols
v2/margin_service.go130 symbols
v2/simple_earn_service.go117 symbols
v2/futures/websocket_service.go116 symbols
v2/futures/client.go110 symbols
v2/futures/order_service.go102 symbols
v2/order_service.go97 symbols
v2/options/order_service.go92 symbols
v2/margin_order_service.go78 symbols

Dependencies from manifests, versioned

github.com/adshao/go-binance/v2v2.0.0-0001010100000 · 1×
github.com/bmizerany/assertv0.0.0-2016061122193 · 1×
github.com/golang/mockv1.6.0 · 1×
github.com/jpillora/backoffv1.0.0 · 1×
github.com/kr/prettyv0.2.0 · 1×
github.com/kr/textv0.2.0 · 1×
github.com/pmezard/go-difflibv1.0.0 · 1×

For agents

$ claude mcp add go-binance \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact