| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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
- }
|