Skip to content

banbox/banexg

Repository files navigation

中文

BanExg - CryptoCurrency Exchange Trading Library

A Go library for cryptocurrency trading.
Currently supported exchanges: binance, china. Both implement the interface BanExchange

Ask DeepWiki

Features

  • Support for multiple accounts, with seamless switching and no conflicts between them.
  • Comprehensive Websocket support, including subscribing and unsubscribing.
  • Support for Websocket dump and playback, which can be used for backtesting.
  • Automatic reconnection and resumption of subscriptions in case of a Websocket disconnection.

How to Use

var options = map[string]interface{}{} // more option keys can be found by type `banexg.Opt...` options[banexg.OptMarketType] = banexg.MarketLinear // usd based future market exchange, err := bex.New('binance', options) // You can also instantiate an exchange object directly // exchange, err := binance.NewExchange(options) // exchange is a BanExchange interface object res, err := exg.FetchOHLCV("ETH/USDT:USDT", "1d", 0, 10, nil) if err != nil { panic(err) } for _, k := range res { fmt.Printf("%v, %v %v %v %v %v\n", k.Time, k.Open, k.High, k.Low, k.Close, int(k.Volume)) }

Complete Initialization Options

// The following parameters can be passed when initializing the exchange object var options = map[string]interface{}{ // Proxy server address banexg.OptProxy: "http://127.0.0.1:7890", // API key configuration method 1: directly configure a single account banexg.OptApiKey: "your-api-key", // API Key banexg.OptApiSecret: "your-secret", // API Secret // API key configuration method 2: configure multiple accounts banexg.OptAccCreds: map[string]map[string]interface{}{ "account1": { "ApiKey": "key1", "ApiSecret": "secret1", }, "account2": { "ApiKey": "key2", "ApiSecret": "secret2", }, }, banexg.OptAccName: "account1", // Set default account // HTTP request related banexg.OptUserAgent: "Mozilla/5.0", // Custom User-Agent banexg.OptReqHeaders: map[string]string{ // Custom request headers "X-Custom": "value", }, // Market type settings banexg.OptMarketType: banexg.MarketLinear, // Set default market type: spot/contract etc banexg.OptContractType: banexg.MarketSwap, // Set contract type: perpetual/delivery banexg.OptTimeInForce: banexg.TimeInForceGTC, // Order validity type // WebSocket related banexg.OptWsIntvs: map[string]int{ // WebSocket subscription intervals (milliseconds) "WatchOrderBooks": 100, // Orderbook subscription interval }, // API retry settings banexg.OptRetries: map[string]int{ // API call retry count "FetchOrderBook": 3, // Retry 3 times when fetching orderbook "FetchPositions": 2, // Retry 2 times when fetching positions }, // API cache settings banexg.OptApiCaches: map[string]int{ // API result cache time (seconds) "FetchMarkets": 3600, // Cache market info for 1 hour }, // Fee settings banexg.OptFees: map[string]map[string]float64{ "linear": { // USDT-M contract fees "maker": 0.0002, // Maker fee rate "taker": 0.0004, // Taker fee rate }, "inverse": { // Coin-M contract fees "maker": 0.0001, "taker": 0.0005, }, }, // Debug options banexg.OptDebugWS: true, // Print WebSocket debug info banexg.OptDebugAPI: true, // Print API debug info // Data capture and replay banexg.OptDumpPath: "./ws_dump", // WebSocket data save path banexg.OptDumpBatchSize: 1000, // Number of messages per batch save banexg.OptReplayPath: "./ws_replay", // Replay data path } // Create exchange instance with parameters exchange, err := bex.New("binance", options) if err != nil { panic(err) }

All above parameters are optional, pass according to actual needs. Some important notes:

  1. API key configuration supports two methods:

    • Directly configure single account via OptApiKey and OptApiSecret
    • Configure multiple accounts via OptAccCreds and specify default account with OptAccName
  2. Market type (OptMarketType) options:

    • MarketSpot: Spot
    • MarketMargin: Margin
    • MarketLinear: USDT-M Futures
    • MarketInverse: Coin-M Futures
    • MarketOption: Options
  3. Contract type (OptContractType) options:

    • MarketSwap: Perpetual contracts
    • MarketFuture: Delivery contracts
  4. Time in force (OptTimeInForce) options:

    • TimeInForceGTC: Good Till Cancel
    • TimeInForceIOC: Immediate or Cancel
    • TimeInForceFOK: Fill or Kill
    • TimeInForceGTX: Good Till Crossing
    • TimeInForceGTD: Good Till Date
    • TimeInForcePO: Post Only
  5. API cache and retry counts can be set individually for different interfaces

  6. Fees can be set with different rates for different market types

API List

// Load market information LoadMarkets(reload bool, params map[string]interface{}) (MarketMap, *errs.Error) GetCurMarkets() MarketMap GetMarket(symbol string) (*Market, *errs.Error) MapMarket(rawID string, year int) (*Market, *errs.Error) FetchTicker(symbol string, params map[string]interface{}) (*Ticker, *errs.Error) FetchTickers(symbols []string, params map[string]interface{}) ([]*Ticker, *errs.Error) FetchTickerPrice(symbol string, params map[string]interface{}) (map[string]float64, *errs.Error) LoadLeverageBrackets(reload bool, params map[string]interface{}) *errs.Error GetLeverage(symbol string, notional float64, account string) (float64, float64) CheckSymbols(symbols ...string) ([]string, []string) Info() *ExgInfo // Fetch OHLCV, orderbook, funding rate etc FetchOHLCV(symbol, timeframe string, since int64, limit int, params map[string]interface{}) ([]*Kline, *errs.Error) FetchOrderBook(symbol string, limit int, params map[string]interface{}) (*OrderBook, *errs.Error) FetchLastPrices(symbols []string, params map[string]interface{}) ([]*LastPrice, *errs.Error) FetchFundingRate(symbol string, params map[string]interface{}) (*FundingRateCur, *errs.Error) FetchFundingRates(symbols []string, params map[string]interface{}) ([]*FundingRateCur, *errs.Error) FetchFundingRateHistory(symbol string, since int64, limit int, params map[string]interface{}) ([]*FundingRate, *errs.Error) // Authentication: fetch orders, balance, positions FetchOrder(symbol, orderId string, params map[string]interface{}) (*Order, *errs.Error) FetchOrders(symbol string, since int64, limit int, params map[string]interface{}) ([]*Order, *errs.Error) FetchBalance(params map[string]interface{}) (*Balances, *errs.Error) FetchAccountPositions(symbols []string, params map[string]interface{}) ([]*Position, *errs.Error) FetchPositions(symbols []string, params map[string]interface{}) ([]*Position, *errs.Error) FetchOpenOrders(symbol string, since int64, limit int, params map[string]interface{}) ([]*Order, *errs.Error) FetchIncomeHistory(inType string, symbol string, since int64, limit int, params map[string]interface{}) ([]*Income, *errs.Error) // Authentication: create, modify, cancel orders CreateOrder(symbol, odType, side string, amount, price float64, params map[string]interface{}) (*Order, *errs.Error) EditOrder(symbol, orderId, side string, amount, price float64, params map[string]interface{}) (*Order, *errs.Error) CancelOrder(id string, symbol string, params map[string]interface{}) (*Order, *errs.Error) // Set/calculate fees; set leverage, calculate maintenance margin SetFees(fees map[string]map[string]float64) CalculateFee(symbol, odType, side string, amount float64, price float64, isMaker bool, params map[string]interface{}) (*Fee, *errs.Error) SetLeverage(leverage float64, symbol string, params map[string]interface{}) (map[string]interface{}, *errs.Error) CalcMaintMargin(symbol string, cost float64) (float64, *errs.Error) Call(method string, params map[string]interface{}) (*HttpRes, *errs.Error) // WebSocket related: watch orderbook, klines, mark price, trades, balance, positions, account config WatchOrderBooks(symbols []string, limit int, params map[string]interface{}) (chan *OrderBook, *errs.Error) UnWatchOrderBooks(symbols []string, params map[string]interface{}) *errs.Error WatchOHLCVs(jobs [][2]string, params map[string]interface{}) (chan *PairTFKline, *errs.Error) UnWatchOHLCVs(jobs [][2]string, params map[string]interface{}) *errs.Error WatchMarkPrices(symbols []string, params map[string]interface{}) (chan map[string]float64, *errs.Error) UnWatchMarkPrices(symbols []string, params map[string]interface{}) *errs.Error WatchTrades(symbols []string, params map[string]interface{}) (chan *Trade, *errs.Error) UnWatchTrades(symbols []string, params map[string]interface{}) *errs.Error WatchMyTrades(params map[string]interface{}) (chan *MyTrade, *errs.Error) WatchBalance(params map[string]interface{}) (chan *Balances, *errs.Error) WatchPositions(params map[string]interface{}) (chan []*Position, *errs.Error) WatchAccountConfig(params map[string]interface{}) (chan *AccountConfig, *errs.Error) // WebSocket data capture and replay (for backtesting) SetDump(path string) *errs.Error SetReplay(path string) *errs.Error GetReplayTo() int64 ReplayOne() *errs.Error ReplayAll() *errs.Error SetOnWsChan(cb FuncOnWsChan) // Precision handling PrecAmount(m *Market, amount float64) (float64, *errs.Error) PrecPrice(m *Market, price float64) (float64, *errs.Error) PrecCost(m *Market, cost float64) (float64, *errs.Error) PrecFee(m *Market, fee float64) (float64, *errs.Error) // Others HasApi(key, market string) bool SetOnHost(cb func(n string) string) PriceOnePip(symbol string) (float64, *errs.Error) IsContract(marketType string) bool MilliSeconds() int64 GetAccount(id string) (*Account, *errs.Error) SetMarketType(marketType, contractType string) *errs.Error GetExg() *Exchange Close() *errs.Error

Note

Use Options instead of direct fields assign to initialized a Exchange

When an exchange object is initialized, some fields of simple types like int will have default type values. When setting these in the Init method, it's impossible to distinguish whether the current value is one set by the user or the default value. Therefore, any configuration needed from outside should be passed in through Options, and then these Options should be read and set onto the corresponding fields in the Init method.

Market Type

Spot Margin Contract Linear Contract Inverse Option
Swap Linear future Linear swap Inverse future Inverse option linear option inverse
Desc spot margin USDⓈ-M Perpetual USDⓈ-M Futures COIN-M Perpetual COIN-M Futures USDⓈ-M Option COIN-M Option

Raw Data Dictionary Return

The raw data returned by the exchange can be accessed through Info, and its type is map[string]interface{} or []map[string]interface{}.

Included types: Currency, ChainNetwork, Market, Ticker, Balances, Position, Order, Trade, MyTrade, FundingRate, FundingRateCur, LastPrice

Common parameter naming adjustments

MarketType
The default market type of the current exchange. It can be set during initialization using OptMarketType or by modifying the MarketType property of the exchange at any time.
Valid Values: MarketSpot/MarketMargin/MarketLinear/MarketInverse/MarketOption

ContractType
The contract type for the current exchange, with options of swap for perpetual contracts and future for contracts with an expiration date.
It can be set during initialization using OptContractType or by modifying the ContractType property of the exchange after initialization.

Deadlock Detection

This project uses the go-deadlock library by default to detect deadlocks.
This may slow down the execution speed by more than ten times when frequently calling certain methods. You can disable it by setting deadlock.Opts.Disable = true.

Contact Me

Email: anyongjin163@163.com
WeChat: phiilo_null