diff --git a/analysis/engine.py b/analysis/engine.py index f6f3c13..ac4a2c4 100644 --- a/analysis/engine.py +++ b/analysis/engine.py @@ -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]: """ diff --git a/analysis/llm_context.py b/analysis/llm_context.py index 18db5de..ad5c667 100644 --- a/analysis/llm_context.py +++ b/analysis/llm_context.py @@ -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