package market import ( "github.com/adshao/go-binance/v2/futures" "github.com/rs/zerolog/log" "strconv" ) func (ms *MarketData) GetFuturePrice(symbol string) (float64, float64, int64, bool) { ms.mu.RLock() defer ms.mu.RUnlock() p, ok := ms.futureMarkPrice[symbol] if !ok { return 0, 0, 0, false } return p, ms.futureFundingRate[symbol], ms.futureNextFundingTime[symbol], true } func (ms *MarketData) StartFutureWsMarkPrice() error { _, _, err := futures.WsAllMarkPriceServe(ms.futureWsMarkPriceHandler, ms.futureWsErrHandler) if err != nil { return err } return nil } func (ms *MarketData) futureWsMarkPriceHandler(event futures.WsAllMarkPriceEvent) { ms.mu.Lock() defer ms.mu.Unlock() for _, priceEvent := range event { price, err := strconv.ParseFloat(priceEvent.MarkPrice, 64) if err != nil { continue } fundingRate, err := strconv.ParseFloat(priceEvent.FundingRate, 64) if err != nil { continue } ms.futureMarkPrice[priceEvent.Symbol] = price ms.futureFundingRate[priceEvent.Symbol] = fundingRate ms.futureNextFundingTime[priceEvent.Symbol] = priceEvent.NextFundingTime } } func (ms *MarketData) futureWsErrHandler(err error) { log.Debug().Err(err).Msg("Ws Error. Restart socket") _ = ms.StartFutureWsMarkPrice() } func (ms *MarketData) GetAllFundRate() (map[string]float64, map[string]int64) { ms.mu.RLock() defer ms.mu.RUnlock() rates := make(map[string]float64, len(ms.futureFundingRate)) for k, v := range ms.futureFundingRate { rates[k] = v } times := make(map[string]int64, len(ms.futureNextFundingTime)) for k, v := range ms.futureNextFundingTime { times[k] = v } return rates, times }