From 93d158addf3b3212ba6492574b1742c894ceb639 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 28 Feb 2026 17:55:30 +0800 Subject: [PATCH] update --- backend/app/crypto_agent/crypto_agent.py | 20 ++++- .../crypto_agent/market_signal_analyzer.py | 73 +++++++++++++++++-- 2 files changed, 83 insertions(+), 10 deletions(-) diff --git a/backend/app/crypto_agent/crypto_agent.py b/backend/app/crypto_agent/crypto_agent.py index e7d46e4..cd07d80 100644 --- a/backend/app/crypto_agent/crypto_agent.py +++ b/backend/app/crypto_agent/crypto_agent.py @@ -480,14 +480,28 @@ class CryptoAgent: # ============================================================ logger.info(f"\n🤖 【第一阶段:市场信号分析】") + # 获取上一轮的信号(用于上下文) + previous_signal = self.last_signals.get(symbol) + market_signal = await self.market_analyzer.analyze( symbol, data, - symbols=self.symbols + symbols=self.symbols, + previous_signal=previous_signal ) # 输出市场分析结果 self._log_market_signal(market_signal) + # 存储最新信号(用于下一轮分析的上下文) + self.last_signals[symbol] = { + 'timestamp': datetime.now().isoformat(), + 'trend': market_signal.get('trend', 'unknown'), + 'trend_strength': market_signal.get('trend_strength', 'unknown'), + 'signals': market_signal.get('signals', []), + 'key_levels': market_signal.get('key_levels', {}), + 'current_price': current_price + } + # 过滤掉 wait 信号,只保留 buy/sell 信号 signals = market_signal.get('signals', []) trade_signals = [s for s in signals if s.get('action') in ['buy', 'sell']] @@ -1916,9 +1930,11 @@ class CryptoAgent: return {'error': '数据不完整'} # 使用新架构:市场分析 + 交易决策 + previous_signal = self.last_signals.get(symbol) market_signal = await self.market_analyzer.analyze( symbol, data, - symbols=self.symbols + symbols=self.symbols, + previous_signal=previous_signal ) positions, account = self._get_trading_state() diff --git a/backend/app/crypto_agent/market_signal_analyzer.py b/backend/app/crypto_agent/market_signal_analyzer.py index 183b0dd..e0590f3 100644 --- a/backend/app/crypto_agent/market_signal_analyzer.py +++ b/backend/app/crypto_agent/market_signal_analyzer.py @@ -266,6 +266,18 @@ class MarketSignalAnalyzer: 6. 90+分:强信号,但也要控制风险 7. 不要输出 action 为 "wait" 的信号,如果没有交易机会就不输出 +## 历史信号参考 +**如果提供了上一轮的分析信号,请参考它来调整你的判断:** + +1. **避免重复信号**:如果上一轮已经给出了买入/卖出信号,不要在没有明显变化的情况下重复给出相同方向的信号 +2. **信号调整建议**: + - 上一轮买入 → 当前看涨 → 可以考虑"继续持有"或"加仓"(如果有新进展) + - 上一轮买入 → 当前转跌 → 应该建议"减仓"或"止损" + - 上一轮观望 → 当前出现机会 → 可以给出新的交易信号 + - 上一轮做空 → 当前转涨 → 应该建议"平仓"或"反转" +3. **趋势延续性**:如果上一轮判断的趋势方向仍然有效,不要轻易改变方向判断,除非有明确的反转信号 +4. **时间间隔考虑**:如果距离上一轮分析只有很短时间(5-15分钟),避免频繁改变信号方向 + 记住:你只负责分析市场,输出客观的交易信号,不需要考虑仓位管理和风险控制! """ @@ -273,7 +285,8 @@ class MarketSignalAnalyzer: self.news_service = get_news_service() async def analyze(self, symbol: str, data: Dict[str, Any], - symbols: List[str] = None) -> Dict[str, Any]: + symbols: List[str] = None, + previous_signal: Dict[str, Any] = None) -> Dict[str, Any]: """ 分析市场并生成信号 @@ -281,6 +294,7 @@ class MarketSignalAnalyzer: symbol: 交易对 data: 多周期K线数据 symbols: 所有监控的交易对(用于市场对比) + previous_signal: 上一轮的分析信号(用于避免重复信号和提供上下文) Returns: 市场信号字典 @@ -293,7 +307,7 @@ class MarketSignalAnalyzer: news_context = await self._get_news_context(symbol) # 3. 构建 LLM 提示词 - prompt = self._build_analysis_prompt(symbol, market_context, news_context) + prompt = self._build_analysis_prompt(symbol, market_context, news_context, previous_signal) # 4. 调用 LLM 分析 messages = [ @@ -422,16 +436,59 @@ class MarketSignalAnalyzer: return "新闻获取失败" def _build_analysis_prompt(self, symbol: str, market_context: str, - news_context: str) -> str: + news_context: str, + previous_signal: Dict[str, Any] = None) -> str: """构建分析提示词""" - return f"""请分析 {symbol} 的市场情况: + prompt_parts = [ + f"请分析 {symbol} 的市场情况:\n", + market_context, + "", + news_context + ] -{market_context} + # 添加历史信号上下文 + if previous_signal: + prev_time = previous_signal.get('timestamp', 'Unknown') + prev_trend = previous_signal.get('trend', 'Unknown') + prev_signals = previous_signal.get('signals', []) -{news_context} + prompt_parts.append("\n## 上一轮分析信号") + prompt_parts.append(f"分析时间: {prev_time}") + prompt_parts.append(f"趋势判断: {prev_trend}") -请根据以上数据,给出你的市场判断和交易信号。 -""" + if prev_signals: + prompt_parts.append("\n之前给出的信号:") + for i, sig in enumerate(prev_signals, 1): + action = sig.get('action', 'N/A') + confidence = sig.get('confidence', 0) + timeframe = sig.get('timeframe', 'unknown') + type_map = {'short_term': '短线', 'medium_term': '中线', 'long_term': '长线'} + type_text = type_map.get(timeframe, timeframe) + + entry = sig.get('entry_zone', 'N/A') + sl = sig.get('stop_loss', 'N/A') + tp = sig.get('take_profit', 'N/A') + reasoning = sig.get('reasoning', 'N/A') + + prompt_parts.append( + f"\n[{i}] {type_text} | {action} | 信心度: {confidence}%\n" + f" 入场: ${entry}\n" + f" 止损: ${sl}\n" + f" 止盈: ${tp}\n" + f" 理由: {reasoning}" + ) + else: + prompt_parts.append("\n上一轮没有给出交易信号(市场观望建议)") + + prompt_parts.append("\n**重要**: 请参考上一轮的信号判断:") + prompt_parts.append("- 如果上一轮给出了买入信号,现在是否需要加仓、减仓、还是继续持有?") + prompt_parts.append("- 如果上一轮给出了做空信号,现在是否需要平仓、减仓、还是继续持有?") + prompt_parts.append("- 如果上一轮是观望,现在市场是否出现了新的机会?") + prompt_parts.append("- 避免在没有明显变化的情况下重复给出相同的信号") + + prompt_parts.append("\n请根据以上数据,给出你的市场判断和交易信号。") + + return "\n".join(prompt_parts) def _parse_llm_response(self, response: str, symbol: str) -> Dict[str, Any]: """解析 LLM 响应"""