package exchange import ( "app/commons/config" "app/commons/constant" "fmt" "github.com/shopspring/decimal" "strings" "time" ) // https://api.jucoin.vc/v1/spot/public/ticker/price?symbol=ju_usdt type CoinPriceResp struct { Biz string `json:"biz"` Code int `json:"code"` Msg string `json:"msg"` MsgInfo []interface{} `json:"msgInfo"` Data []struct { S string `json:"s"` T int64 `json:"t"` P string `json:"p"` CR string `json:"cr"` } `json:"data"` } type SymbolPrice struct { expr int64 price decimal.Decimal } var priceMap = map[string]*SymbolPrice{} // 转换为交易对 func coinToSymbol(symbol string) string { return strings.ToLower(fmt.Sprintf("%s_usdt", symbol)) } // 使用该方法获取当前价 func GetCurrentSymbolUsdPrice(coin string) (decimal.Decimal, error) { usdPrice := getSymbolPrice(coin) if usdPrice.LessThanOrEqual(decimal.Zero) { return decimal.Zero, fmt.Errorf(":%s price fail", coin) } return usdPrice, nil } func getSymbolPrice(coin string) decimal.Decimal { if strings.ToUpper(coin) == "USDT" { return decimal.NewFromFloat(1) } if strings.ToUpper(coin) == strings.ToUpper(constant.CoinSymbolTD) && config.AppConf().Mod != config.ModEnvProd { return decimal.NewFromFloat(1) } // 转换为交易对交易对 symbol_ := coinToSymbol(coin) _, ok := priceMap[symbol_] if !ok { priceMap[symbol_] = &SymbolPrice{0, decimal.NewFromFloat(0)} } if priceMap[symbol_].expr <= time.Now().Unix() { priceMap[symbol_].price = lastPriceBySymbol(symbol_, priceMap[symbol_].price) priceMap[symbol_].expr = time.Now().Unix() + 30 } return priceMap[symbol_].price } // 通过交易对获取更新价格 func lastPriceBySymbol(symbol string, nowPrice decimal.Decimal) decimal.Decimal { url := fmt.Sprintf("https://api.jucoin.vc/v1/spot/public/ticker/price?symbol=%s", symbol) resp, err := get[CoinPriceResp](url) if err != nil { return nowPrice } if resp.Code == 200 { if len(resp.Data) > 0 { nowPrice, _ = decimal.NewFromString(resp.Data[0].P) } } return nowPrice }