9c39423315
Replace unreliable WebSocket connections with on-demand REST API calls for spot and futures prices. Add cached trading pair list (refreshed hourly) for symbol validation, and /refresh command for manual updates. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package market
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
func (ms *MarketData) refreshTradingPairCache() {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
|
defer cancel()
|
|
|
|
spotInfo, err := ms.spotClient.NewExchangeInfoService().Do(ctx)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("Failed to fetch spot exchange info")
|
|
return
|
|
}
|
|
|
|
futuresInfo, err := ms.futuresClient.NewExchangeInfoService().Do(ctx)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("Failed to fetch futures exchange info")
|
|
return
|
|
}
|
|
|
|
ms.pairCacheMutex.Lock()
|
|
defer ms.pairCacheMutex.Unlock()
|
|
|
|
ms.spotPairs = make(map[string]bool, len(spotInfo.Symbols))
|
|
for _, s := range spotInfo.Symbols {
|
|
if s.Status == "TRADING" {
|
|
ms.spotPairs[s.Symbol] = true
|
|
}
|
|
}
|
|
|
|
ms.futuresPairs = make(map[string]bool, len(futuresInfo.Symbols))
|
|
for _, s := range futuresInfo.Symbols {
|
|
if s.Status == "TRADING" {
|
|
ms.futuresPairs[s.Symbol] = true
|
|
}
|
|
}
|
|
|
|
ms.lastPairCacheUpdate = time.Now()
|
|
log.Info().
|
|
Int("spot", len(ms.spotPairs)).
|
|
Int("futures", len(ms.futuresPairs)).
|
|
Msg("Trading pair cache refreshed")
|
|
}
|
|
|
|
func (ms *MarketData) pairCacheRefreshLoop() {
|
|
ms.refreshTradingPairCache()
|
|
ticker := time.NewTicker(time.Hour)
|
|
defer ticker.Stop()
|
|
for range ticker.C {
|
|
ms.refreshTradingPairCache()
|
|
}
|
|
}
|
|
|
|
func (ms *MarketData) IsSpotPair(symbol string) bool {
|
|
ms.pairCacheMutex.RLock()
|
|
defer ms.pairCacheMutex.RUnlock()
|
|
return ms.spotPairs[symbol]
|
|
}
|
|
|
|
func (ms *MarketData) IsFuturesPair(symbol string) bool {
|
|
ms.pairCacheMutex.RLock()
|
|
defer ms.pairCacheMutex.RUnlock()
|
|
return ms.futuresPairs[symbol]
|
|
}
|
|
|
|
func (ms *MarketData) RefreshTradingPairCache() {
|
|
ms.refreshTradingPairCache()
|
|
}
|