69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			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
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |