440fa3bacd
Add sync.RWMutex to protect future and spot price maps accessed by WebSocket handlers (writers) and Telegram bot handlers (readers). Also adds Alpha token support with caching. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
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
|
|
}
|