ex_price.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package exchange
  2. import (
  3. "app/commons/config"
  4. "app/commons/constant"
  5. "fmt"
  6. "github.com/shopspring/decimal"
  7. "strings"
  8. "time"
  9. )
  10. // https://api.jucoin.vc/v1/spot/public/ticker/price?symbol=ju_usdt
  11. type CoinPriceResp struct {
  12. Biz string `json:"biz"`
  13. Code int `json:"code"`
  14. Msg string `json:"msg"`
  15. MsgInfo []interface{} `json:"msgInfo"`
  16. Data []struct {
  17. S string `json:"s"`
  18. T int64 `json:"t"`
  19. P string `json:"p"`
  20. CR string `json:"cr"`
  21. } `json:"data"`
  22. }
  23. type SymbolPrice struct {
  24. expr int64
  25. price decimal.Decimal
  26. }
  27. var priceMap = map[string]*SymbolPrice{}
  28. // 转换为交易对
  29. func coinToSymbol(symbol string) string {
  30. return strings.ToLower(fmt.Sprintf("%s_usdt", symbol))
  31. }
  32. // 使用该方法获取当前价
  33. func GetCurrentSymbolUsdPrice(coin string) (decimal.Decimal, error) {
  34. usdPrice := getSymbolPrice(coin)
  35. if usdPrice.LessThanOrEqual(decimal.Zero) {
  36. return decimal.Zero, fmt.Errorf(":%s price fail", coin)
  37. }
  38. return usdPrice, nil
  39. }
  40. func getSymbolPrice(coin string) decimal.Decimal {
  41. if strings.ToUpper(coin) == "USDT" {
  42. return decimal.NewFromFloat(1)
  43. }
  44. if strings.ToUpper(coin) == strings.ToUpper(constant.CoinSymbolTD) && config.AppConf().Mod != config.ModEnvProd {
  45. return decimal.NewFromFloat(1)
  46. }
  47. // 转换为交易对交易对
  48. symbol_ := coinToSymbol(coin)
  49. _, ok := priceMap[symbol_]
  50. if !ok {
  51. priceMap[symbol_] = &SymbolPrice{0, decimal.NewFromFloat(0)}
  52. }
  53. if priceMap[symbol_].expr <= time.Now().Unix() {
  54. priceMap[symbol_].price = lastPriceBySymbol(symbol_, priceMap[symbol_].price)
  55. priceMap[symbol_].expr = time.Now().Unix() + 30
  56. }
  57. return priceMap[symbol_].price
  58. }
  59. // 通过交易对获取更新价格
  60. func lastPriceBySymbol(symbol string, nowPrice decimal.Decimal) decimal.Decimal {
  61. url := fmt.Sprintf("https://api.jucoin.vc/v1/spot/public/ticker/price?symbol=%s", symbol)
  62. resp, err := get[CoinPriceResp](url)
  63. if err != nil {
  64. return nowPrice
  65. }
  66. if resp.Code == 200 {
  67. if len(resp.Data) > 0 {
  68. nowPrice, _ = decimal.NewFromString(resp.Data[0].P)
  69. }
  70. }
  71. return nowPrice
  72. }