From a91041e1685f037b16d102c50f0ca1ffb914caa6 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Tue, 17 Mar 2026 05:47:27 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Yahoo=E8=82=A1=E7=A5=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=BD=AC=E6=8D=A2=EF=BC=8CBRK.B=20=E2=86=92=20BRK-B?= =?UTF-8?q?=EF=BC=88=E7=B1=BB=E5=88=AB=E8=82=A1=E7=94=A8=E8=BF=9E=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/YahooMarketService.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/AssetManager.Infrastructure/Services/YahooMarketService.cs b/AssetManager.Infrastructure/Services/YahooMarketService.cs index b688299..c07d991 100644 --- a/AssetManager.Infrastructure/Services/YahooMarketService.cs +++ b/AssetManager.Infrastructure/Services/YahooMarketService.cs @@ -40,11 +40,27 @@ public class YahooMarketService : IYahooMarketService .Build(); } + /// + /// 转换股票代码为 Yahoo Finance 格式 + /// BRK.B → BRK-B(伯克希尔B类股) + /// BRK.A → BRK-A(伯克希尔A类股) + /// + private string ConvertToYahooSymbol(string symbol) + { + if (string.IsNullOrEmpty(symbol)) + return symbol; + + // Yahoo Finance 用连字符表示类别股,而非点号 + // BRK.B → BRK-B, BRK.A → BRK-A + return symbol.ToUpper().Replace(".", "-"); + } + public async Task GetStockPriceAsync(string symbol) { - _logger.LogInformation("Yahoo获取股票价格: {Symbol}", symbol); + var yahooSymbol = ConvertToYahooSymbol(symbol); + _logger.LogInformation("Yahoo获取股票价格: {Symbol} -> {YahooSymbol}", symbol, yahooSymbol); - Snapshot? snapshot = await _yahooQuotes.GetSnapshotAsync(symbol); + Snapshot? snapshot = await _yahooQuotes.GetSnapshotAsync(yahooSymbol); if (snapshot is null) throw new InvalidOperationException($"Yahoo未知标的: {symbol}"); @@ -61,7 +77,7 @@ public class YahooMarketService : IYahooMarketService return new MarketPriceResponse { - Symbol = symbol, + Symbol = symbol, // 返回原始代码 Price = price, PreviousClose = previousClose, Timestamp = DateTime.UtcNow, @@ -71,9 +87,10 @@ public class YahooMarketService : IYahooMarketService public async Task> GetStockHistoricalDataAsync(string symbol, string timeframe, int limit) { - _logger.LogInformation("Yahoo获取历史数据: {Symbol}, {Timeframe}, {Limit}", symbol, timeframe, limit); + var yahooSymbol = ConvertToYahooSymbol(symbol); + _logger.LogInformation("Yahoo获取历史数据: {Symbol} -> {YahooSymbol}, {Timeframe}, {Limit}", symbol, yahooSymbol, timeframe, limit); - Result result = await _yahooQuotes.GetHistoryAsync(symbol); + Result result = await _yahooQuotes.GetHistoryAsync(yahooSymbol); if (result.Value == null) throw new InvalidOperationException($"Yahoo获取历史数据失败,标的: {symbol}"); @@ -86,7 +103,7 @@ public class YahooMarketService : IYahooMarketService { marketDataList.Add(new MarketDataResponse { - Symbol = symbol, + Symbol = symbol, // 返回原始代码 Timestamp = tick.Date.ToDateTimeUtc(), Open = (decimal)tick.Open, High = (decimal)tick.High,