From 4ab402462867c3e1e1a800504b7408eb1f5c89f0 Mon Sep 17 00:00:00 2001 From: shinchan-zhai Date: Fri, 27 Mar 2026 13:41:49 +0800 Subject: [PATCH] fix: fallback to Binance kline when coinank returns empty data for non-Binance exchanges CoinAnk recently stopped providing free kline data for OKX/Bitget/Gate exchanges (returns success but empty array). This caused '3-minute k-line data is empty' errors for all users on those exchanges. Fix: detect empty kline response and automatically fallback to Binance kline data, which is always available. --- market/data_klines.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/market/data_klines.go b/market/data_klines.go index e4cb869f..94c320f0 100644 --- a/market/data_klines.go +++ b/market/data_klines.go @@ -78,15 +78,19 @@ func getKlinesFromCoinAnk(symbol, interval, exchange string, limit int) ([]Kline ts := time.Now().UnixMilli() // Use "To" side to search backward from current time (get historical klines) coinankKlines, err := coinank_api.Kline(ctx, symbol, coinankExchange, ts, coinank_enum.To, limit, coinankInterval) - if err != nil { - // If exchange-specific data fails, fallback to Binance + if err != nil || len(coinankKlines) == 0 { + // If exchange-specific data fails or returns empty, fallback to Binance if coinankExchange != coinank_enum.Binance { - logger.Warnf("⚠️ CoinAnk %s data failed, falling back to Binance: %v", exchange, err) + if err != nil { + logger.Warnf("⚠️ CoinAnk %s data failed, falling back to Binance: %v", exchange, err) + } else { + logger.Warnf("⚠️ CoinAnk %s %s data empty for %s, falling back to Binance", exchange, interval, symbol) + } coinankKlines, err = coinank_api.Kline(ctx, symbol, coinank_enum.Binance, ts, coinank_enum.To, limit, coinankInterval) if err != nil { return nil, fmt.Errorf("CoinAnk API error (fallback): %w", err) } - } else { + } else if err != nil { return nil, fmt.Errorf("CoinAnk API error: %w", err) } }