This commit is contained in:
aaron 2025-12-15 22:14:57 +08:00
parent 4490072d66
commit f8f1b3eaae
2 changed files with 22 additions and 10 deletions

View File

@ -31,7 +31,7 @@ class MarketAnalysisEngine:
"""
self.symbol = symbol or config.SYMBOL
self.data_reader = MarketDataReader(symbol=self.symbol)
self.llm_builder = LLMContextBuilder()
self.llm_builder = LLMContextBuilder(symbol=self.symbol)
def analyze_current_market(
self, timeframe: str = '5m', symbol: str = None
@ -135,20 +135,22 @@ class MarketAnalysisEngine:
logger.error(f"Error in market analysis: {e}", exc_info=True)
return {'error': str(e)}
def get_llm_context(self, format: str = 'full') -> Dict[str, Any]:
def get_llm_context(self, format: str = 'full', symbol: str = None) -> Dict[str, Any]:
"""
Get market context formatted for LLM consumption
Args:
format: 'full' or 'simplified'
symbol: Trading symbol (uses engine's symbol if None)
Returns:
LLM-ready context dictionary
"""
symbol = symbol or self.symbol
if format == 'simplified':
return self.llm_builder.get_simplified_context()
else:
return self.llm_builder.build_full_context()
return self.llm_builder.build_full_context(symbol=symbol)
def get_multi_timeframe_analysis(self) -> Dict[str, Any]:
"""

View File

@ -35,22 +35,26 @@ KLINE_LIMITS = {
class LLMContextBuilder:
"""Build structured context for LLM trading decisions"""
def __init__(self):
self.data_reader = MarketDataReader()
def __init__(self, symbol: str = "BTCUSDT"):
self.symbol = symbol
self.data_reader = MarketDataReader(symbol=symbol)
def build_full_context(self, symbol: str = "BTCUSDT") -> Dict[str, Any]:
def build_full_context(self, symbol: str = None) -> Dict[str, Any]:
"""
Build complete market context for LLM analysis
Args:
symbol: Trading symbol (default: BTCUSDT)
symbol: Trading symbol (uses instance symbol if None)
Returns:
Dict with structured market analysis
"""
# Use passed symbol or fall back to instance symbol
symbol = symbol or self.symbol
try:
# Fetch multi-timeframe data with custom limits
mtf_data = self._get_multi_timeframe_data_for_llm()
mtf_data = self._get_multi_timeframe_data_for_llm(symbol)
if '5m' not in mtf_data or mtf_data['5m'].empty:
logger.error("No 5m data available for analysis")
@ -90,16 +94,22 @@ class LLMContextBuilder:
logger.error(f"Error building LLM context: {e}", exc_info=True)
return self._empty_context()
def _get_multi_timeframe_data_for_llm(self) -> Dict[str, pd.DataFrame]:
def _get_multi_timeframe_data_for_llm(self, symbol: str = None) -> Dict[str, pd.DataFrame]:
"""
Fetch data from multiple timeframes with custom limits for LLM
Args:
symbol: Trading symbol (uses instance symbol if None)
Returns:
Dict mapping timeframe to DataFrame
"""
symbol = symbol or self.symbol
data = {}
for tf, count in KLINE_LIMITS.items():
df = self.data_reader.fetch_klines(interval=tf, limit=count)
df = self.data_reader.fetch_historical_klines_from_api(
symbol=symbol, interval=tf, limit=count
)
if not df.empty:
data[tf] = df