Files
exchange_go/services/binanceservice/spotsymbolservice.go
2025-02-06 11:14:33 +08:00

69 lines
1.9 KiB
Go

package binanceservice
import (
"go-admin/models"
"go-admin/models/spot"
"go-admin/pkg/utility"
"sync"
log "github.com/go-admin-team/go-admin-core/logger"
)
var quoteAssetSymbols = []string{"USDT", "ETH", "BTC", "SOL", "BNB", "DOGE"}
func GetSpotSymbols() (map[string]models.TradeSet, []string, error) {
spotApi := SpotRestApi{}
symbols, err := spotApi.GetExchangeInfo()
tradeSets := make(map[string]models.TradeSet, len(symbols))
if err != nil {
log.Error("获取规范信息失败", err)
return tradeSets, []string{}, err
}
var wg sync.WaitGroup
var mu sync.Mutex // 用于保护 tradeSets 的并发写入
for _, item := range symbols {
if utility.ContainsStr(quoteAssetSymbols, item.QuoteAsset) && item.Status == "TRADING" && item.IsSpotTradingAllowed {
wg.Add(1)
go func(item spot.Symbol) {
defer wg.Done()
tradeSet := models.TradeSet{
Coin: item.BaseAsset,
Currency: item.QuoteAsset,
}
for _, filter := range item.Filters {
switch filter.FilterType {
case "PRICE_FILTER":
tradeSet.PriceDigit = utility.GetPrecision(filter.TickSize)
tradeSet.MinBuyVal = utility.StringAsFloat(filter.MinPrice)
case "LOT_SIZE":
tradeSet.AmountDigit = utility.GetPrecision(filter.StepSize)
tradeSet.MinQty = utility.StringAsFloat(filter.MinQty)
tradeSet.MaxQty = utility.StringAsFloat(filter.MaxQty)
}
}
mu.Lock()
tradeSets[item.Symbol] = tradeSet
mu.Unlock()
}(item)
}
}
wg.Wait() // 等待所有 goroutine 完成
log.Info("初始化交易对")
deleteSymbols, err := spotApi.GetSpotTicker24h(&tradeSets)
if err != nil {
log.Error("初始化币安现货交易对失败", err)
return map[string]models.TradeSet{}, deleteSymbols, err
} else {
log.Info("初始化现货交易对完毕")
return tradeSets, deleteSymbols, err
}
}