diff --git a/kernel/engine.go b/kernel/engine.go index 393582f9..35d450a5 100644 --- a/kernel/engine.go +++ b/kernel/engine.go @@ -447,6 +447,7 @@ func (e *StrategyEngine) GetCandidateCoins() ([]CandidateCoin, error) { if err != nil { return nil, err } + // 空列表是正常情况,直接返回 return e.filterExcludedCoins(coins), nil case "oi_top": @@ -466,6 +467,7 @@ func (e *StrategyEngine) GetCandidateCoins() ([]CandidateCoin, error) { if err != nil { return nil, err } + // 空列表是正常情况,直接返回 return e.filterExcludedCoins(coins), nil case "mixed": diff --git a/provider/nofxos/ai500.go b/provider/nofxos/ai500.go index 19f46cb4..a62e2d3d 100644 --- a/provider/nofxos/ai500.go +++ b/provider/nofxos/ai500.go @@ -73,8 +73,10 @@ func (c *Client) fetchAI500() ([]CoinData, error) { return nil, fmt.Errorf("API returned failure status") } + // 空列表是正常情况,不是错误 if len(response.Data.Coins) == 0 { - return nil, fmt.Errorf("coin list is empty") + log.Printf("ℹ️ AI500 returned empty coin list (no coins meet criteria currently)") + return []CoinData{}, nil } // Set IsAvailable flag diff --git a/trader/auto_trader.go b/trader/auto_trader.go index 3ec70635..5a59c662 100644 --- a/trader/auto_trader.go +++ b/trader/auto_trader.go @@ -534,6 +534,12 @@ func (at *AutoTrader) runCycle() error { return fmt.Errorf("failed to build trading context: %w", err) } + // 如果没有候选币种,友好提示并跳过本周期 + if len(ctx.CandidateCoins) == 0 { + logger.Infof("ℹ️ No candidate coins available, skipping this cycle") + return nil + } + // Save equity snapshot independently (decoupled from AI decision, used for drawing profit curve) at.saveEquitySnapshot(ctx)