Refactor and translate comments and docstrings in utility modules to English for better clarity and maintainability. Update Gunicorn and application startup messages for consistency in language. Enhance documentation with English translations for better accessibility.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
K线数据服务
|
||||
K-line data service
|
||||
"""
|
||||
from typing import Dict, List, Any, Optional
|
||||
|
||||
@@ -12,7 +12,7 @@ logger = get_logger(__name__)
|
||||
|
||||
|
||||
class KlineService:
|
||||
"""K线数据服务"""
|
||||
"""K-line data service"""
|
||||
|
||||
def __init__(self):
|
||||
self.cache = CacheManager()
|
||||
@@ -27,27 +27,27 @@ class KlineService:
|
||||
before_time: Optional[int] = None
|
||||
) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取K线数据
|
||||
Get K-line data
|
||||
|
||||
Args:
|
||||
market: 市场类型 (Crypto, USStock, Forex, Futures)
|
||||
symbol: 交易对/股票代码
|
||||
timeframe: 时间周期
|
||||
limit: 数据条数
|
||||
before_time: 获取此时间之前的数据
|
||||
market: market type (Crypto, USStock, Forex, Futures)
|
||||
symbol: trading pair/stock code
|
||||
timeframe: time period
|
||||
limit: number of data items
|
||||
before_time: Get data before this time
|
||||
|
||||
Returns:
|
||||
K线数据列表
|
||||
K-line data list
|
||||
"""
|
||||
# 构建缓存键(历史数据不缓存)
|
||||
# Build a cache key (historical data is not cached)
|
||||
if not before_time:
|
||||
cache_key = f"kline:{market}:{symbol}:{timeframe}:{limit}"
|
||||
cached = self.cache.get(cache_key)
|
||||
if cached:
|
||||
# logger.info(f"命中缓存: {cache_key}")
|
||||
# logger.info(f"Hit cache: {cache_key}")
|
||||
return cached
|
||||
|
||||
# 获取数据
|
||||
# Get data
|
||||
klines = DataSourceFactory.get_kline(
|
||||
market=market,
|
||||
symbol=symbol,
|
||||
@@ -56,16 +56,16 @@ class KlineService:
|
||||
before_time=before_time
|
||||
)
|
||||
|
||||
# 设置缓存(仅最新数据)
|
||||
# Set cache (latest data only)
|
||||
if klines and not before_time:
|
||||
ttl = self.cache_ttl.get(timeframe, 300)
|
||||
self.cache.set(cache_key, klines, ttl)
|
||||
# logger.info(f"缓存设置: {cache_key}, TTL: {ttl}s")
|
||||
# logger.info(f"Cache settings: {cache_key}, TTL: {ttl}s")
|
||||
|
||||
return klines
|
||||
|
||||
def get_latest_price(self, market: str, symbol: str) -> Optional[Dict[str, Any]]:
|
||||
"""获取最新价格(使用1分钟K线,已弃用,建议使用 get_realtime_price)"""
|
||||
"""Get the latest price (use 1-minute K-line, deprecated, it is recommended to use get_realtime_price)"""
|
||||
klines = self.get_kline(market, symbol, '1m', 1)
|
||||
if klines:
|
||||
return klines[-1]
|
||||
@@ -73,29 +73,29 @@ class KlineService:
|
||||
|
||||
def get_realtime_price(self, market: str, symbol: str, force_refresh: bool = False) -> Dict[str, Any]:
|
||||
"""
|
||||
获取实时价格(优先使用 ticker API,降级使用分钟 K 线)
|
||||
Get real-time prices (priority to use ticker API, downgrade to minute K-line)
|
||||
|
||||
Args:
|
||||
market: 市场类型 (Crypto, USStock, Forex, Futures)
|
||||
symbol: 交易对/股票代码
|
||||
force_refresh: 是否强制刷新(跳过缓存)
|
||||
market: market type (Crypto, USStock, Forex, Futures)
|
||||
symbol: trading pair/stock code
|
||||
force_refresh: whether to force refresh (skip cache)
|
||||
|
||||
Returns:
|
||||
实时价格数据: {
|
||||
'price': 最新价格,
|
||||
'change': 涨跌额,
|
||||
'changePercent': 涨跌幅,
|
||||
'high': 最高价,
|
||||
'low': 最低价,
|
||||
'open': 开盘价,
|
||||
'previousClose': 昨收价,
|
||||
'source': 数据来源 ('ticker' 或 'kline')
|
||||
Real-time price data: {
|
||||
'price': latest price,
|
||||
'change': change amount,
|
||||
'changePercent': increase or decrease,
|
||||
'high': highest price,
|
||||
'low': lowest price,
|
||||
'open': opening price,
|
||||
'previousClose': yesterday's closing price,
|
||||
'source': data source ('ticker' or 'kline')
|
||||
}
|
||||
"""
|
||||
# 构建缓存键(短时间缓存,避免频繁请求)
|
||||
# Build a cache key (short-term cache to avoid frequent requests)
|
||||
cache_key = f"realtime_price:{market}:{symbol}"
|
||||
|
||||
# 如果不是强制刷新,尝试使用缓存
|
||||
# If it is not a forced refresh, try using caching
|
||||
if not force_refresh:
|
||||
cached = self.cache.get(cache_key)
|
||||
if cached:
|
||||
@@ -112,7 +112,7 @@ class KlineService:
|
||||
'source': 'unknown'
|
||||
}
|
||||
|
||||
# 优先尝试使用 ticker API 获取实时价格
|
||||
# First try to use the ticker API to get real-time prices
|
||||
try:
|
||||
ticker = DataSourceFactory.get_ticker(market, symbol)
|
||||
if ticker and ticker.get('last', 0) > 0:
|
||||
@@ -126,13 +126,13 @@ class KlineService:
|
||||
'previousClose': ticker.get('previousClose', 0),
|
||||
'source': 'ticker'
|
||||
}
|
||||
# 缓存 30 秒
|
||||
# Cache for 30 seconds
|
||||
self.cache.set(cache_key, result, 30)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.debug(f"Ticker API failed for {market}:{symbol}, falling back to kline: {e}")
|
||||
|
||||
# 降级:使用 1 分钟 K 线
|
||||
# Downgrade: Use 1 minute candlestick
|
||||
try:
|
||||
klines = self.get_kline(market, symbol, '1m', 2)
|
||||
if klines and len(klines) > 0:
|
||||
@@ -153,13 +153,13 @@ class KlineService:
|
||||
'previousClose': prev_close,
|
||||
'source': 'kline_1m'
|
||||
}
|
||||
# 缓存 30 秒
|
||||
# Cache for 30 seconds
|
||||
self.cache.set(cache_key, result, 30)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.debug(f"1m kline failed for {market}:{symbol}, trying daily: {e}")
|
||||
|
||||
# 最后降级:使用日线数据(适用于非交易时间)
|
||||
# Last downgrade: using daily data (applies to non-trading hours)
|
||||
try:
|
||||
klines = self.get_kline(market, symbol, '1D', 2)
|
||||
if klines and len(klines) > 0:
|
||||
@@ -180,7 +180,7 @@ class KlineService:
|
||||
'previousClose': prev_close,
|
||||
'source': 'kline_1d'
|
||||
}
|
||||
# 日线数据缓存 5 分钟
|
||||
# Daily data cache for 5 minutes
|
||||
self.cache.set(cache_key, result, 300)
|
||||
return result
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user