From dd104a9c90da52e61821e420a88190c845478b85 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 28 Feb 2026 18:44:53 +0800 Subject: [PATCH] update --- backend/app/crypto_agent/crypto_agent.py | 21 +++++ .../crypto_agent/market_signal_analyzer.py | 76 +++++++++++++++---- 2 files changed, 81 insertions(+), 16 deletions(-) diff --git a/backend/app/crypto_agent/crypto_agent.py b/backend/app/crypto_agent/crypto_agent.py index cd07d80..5701384 100644 --- a/backend/app/crypto_agent/crypto_agent.py +++ b/backend/app/crypto_agent/crypto_agent.py @@ -483,6 +483,27 @@ class CryptoAgent: # 获取上一轮的信号(用于上下文) previous_signal = self.last_signals.get(symbol) + # 显示上一轮信号(如果有) + if previous_signal: + prev_time = previous_signal.get('timestamp', 'Unknown') + prev_trend = previous_signal.get('trend', 'Unknown') + prev_signals = previous_signal.get('signals', []) + logger.info(f"📋 上一轮分析时间: {prev_time}") + logger.info(f"📋 上一轮趋势: {prev_trend}") + + if prev_signals: + for sig in prev_signals: + 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) + logger.info(f"📋 上一轮信号: {type_text} | {action} | {confidence}%") + else: + logger.info(f"📋 上一轮信号: 无交易信号(观望)") + else: + logger.info(f"📋 上一轮信号: 无历史记录(首次分析)") + market_signal = await self.market_analyzer.analyze( symbol, data, symbols=self.symbols, diff --git a/backend/app/crypto_agent/market_signal_analyzer.py b/backend/app/crypto_agent/market_signal_analyzer.py index e0590f3..7389ed3 100644 --- a/backend/app/crypto_agent/market_signal_analyzer.py +++ b/backend/app/crypto_agent/market_signal_analyzer.py @@ -35,6 +35,11 @@ class MarketSignalAnalyzer: 2. **顺势交易为主** - 上涨趋势只做多或观望,下跌趋势只做空或观望 3. **逆势交易极其谨慎** - 必须有多重反转信号才能考虑逆势 4. **单边行情不逆势** - 强趋势中(连续3根以上同向K线)严禁逆势开仓 +5. **严禁重复信号** - 如果上一轮已经给出了相同方向的交易信号,绝对不要重复输出!只有在以下情况才能给出新信号: + - 趋势发生了**明确的反转**(从多头转为空头,或反之) + - 上一轮是观望,现在出现了**新的明确交易机会** + - 上一轮信号已失效(价格已触及止损或止盈) + - 如果只是趋势延续、价格在合理波动范围内,**不要重复给出相同方向的信号** ### 交易目标 - **稳健为主**:宁可错过,不做错 @@ -266,17 +271,39 @@ class MarketSignalAnalyzer: 6. 90+分:强信号,但也要控制风险 7. 不要输出 action 为 "wait" 的信号,如果没有交易机会就不输出 -## 历史信号参考 -**如果提供了上一轮的分析信号,请参考它来调整你的判断:** +## 历史信号参考(非常重要!) +**如果提供了上一轮的分析信号,必须仔细参考它:** -1. **避免重复信号**:如果上一轮已经给出了买入/卖出信号,不要在没有明显变化的情况下重复给出相同方向的信号 -2. **信号调整建议**: - - 上一轮买入 → 当前看涨 → 可以考虑"继续持有"或"加仓"(如果有新进展) - - 上一轮买入 → 当前转跌 → 应该建议"减仓"或"止损" - - 上一轮观望 → 当前出现机会 → 可以给出新的交易信号 - - 上一轮做空 → 当前转涨 → 应该建议"平仓"或"反转" -3. **趋势延续性**:如果上一轮判断的趋势方向仍然有效,不要轻易改变方向判断,除非有明确的反转信号 -4. **时间间隔考虑**:如果距离上一轮分析只有很短时间(5-15分钟),避免频繁改变信号方向 +### 🚫 严禁重复信号 +**如果上一轮已经给出了买入/卖出信号,不要在没有明显变化的情况下重复给出相同方向的信号!** + +以下情况**不要**输出新的交易信号: +- ✗ 上一轮做空,现在仍然是空头排列,价格继续下跌 → **不要重复做空信号** +- ✗ 上一轮买入,现在仍然是多头排列,价格继续上涨 → **不要重复买入信号** +- ✗ 仅仅因为趋势延续就重复信号 → **绝对禁止!** + +### ✅ 允许输出新信号的情况 +只有在以下情况之一时,才输出新的交易信号: +1. **趋势反转**:上一轮判断的趋势发生了明确反转 + - 例如:上一轮看多(MA多头排列),现在转为空头排列 +2. **从观望到机会**:上一轮是观望(无信号),现在出现了明确的交易机会 +3. **上一轮信号已失效**: + - 价格已触及上一轮的止损或止盈价位 + - 距离上一轮信号已过去较长时间(>2小时) +4. **新的关键点位**:价格触及了重要的支撑/阻力位,且有明显反转信号 + +### 📋 信号调整建议 +当需要调整时,请在 reasoning 中说明: +- 上一轮买入 → 当前转跌 → reasoning 中说明"趋势转弱,建议减仓或止损" +- 上一轮做空 → 当前转涨 → reasoning 中说明"趋势反转,建议平仓" +- 上一轮观望 → 当前出现机会 → 说明新机会是什么 + +### ⏰ 时间间隔考虑 +- 5分钟级别:如果上一轮是15分钟内,除非有重大变化,否则不重复信号 +- 短线信号:同一方向信号间隔至少1小时 +- 波段信号:同一方向信号间隔至少4小时 + +**记住:宁可错过,不要噪音。重复信号只会导致过度交易!** 记住:你只负责分析市场,输出客观的交易信号,不需要考虑仓位管理和风险控制! """ @@ -452,7 +479,9 @@ class MarketSignalAnalyzer: prev_trend = previous_signal.get('trend', 'Unknown') prev_signals = previous_signal.get('signals', []) - prompt_parts.append("\n## 上一轮分析信号") + prompt_parts.append("\n" + "="*60) + prompt_parts.append("## 上一轮分析信号(必须参考!)") + prompt_parts.append("="*60) prompt_parts.append(f"分析时间: {prev_time}") prompt_parts.append(f"趋势判断: {prev_trend}") @@ -477,14 +506,29 @@ class MarketSignalAnalyzer: f" 止盈: ${tp}\n" f" 理由: {reasoning}" ) + + # 重点警告 + prompt_parts.append("\n" + "!"*60) + prompt_parts.append("🚨 严禁重复信号!") + prompt_parts.append("!"*60) + prompt_parts.append("如果上一轮已经给出了相同方向的信号(做空/做多),") + prompt_parts.append("且趋势没有发生明确反转,") + prompt_parts.append("绝对不要重复给出相同方向的信号!") + prompt_parts.append("") + prompt_parts.append("只有在以下情况才输出新信号:") + prompt_parts.append(" ✓ 趋势发生了明确的反转") + prompt_parts.append(" ✓ 上一轮是观望,现在出现了新的明确机会") + prompt_parts.append(" ✓ 价格已触及上一轮的止损/止盈价位") + prompt_parts.append("") + prompt_parts.append("以下情况不要输出信号:") + prompt_parts.append(" ✗ 趋势延续,只是价格继续向同一方向移动") + prompt_parts.append(" ✗ 仅仅因为均线排列仍然有效") + prompt_parts.append(" ✗ 没有明显的市场变化") else: prompt_parts.append("\n上一轮没有给出交易信号(市场观望建议)") + prompt_parts.append("\n你可以基于当前市场情况给出新的信号。") - prompt_parts.append("\n**重要**: 请参考上一轮的信号判断:") - prompt_parts.append("- 如果上一轮给出了买入信号,现在是否需要加仓、减仓、还是继续持有?") - prompt_parts.append("- 如果上一轮给出了做空信号,现在是否需要平仓、减仓、还是继续持有?") - prompt_parts.append("- 如果上一轮是观望,现在市场是否出现了新的机会?") - prompt_parts.append("- 避免在没有明显变化的情况下重复给出相同的信号") + prompt_parts.append("\n" + "="*60) prompt_parts.append("\n请根据以上数据,给出你的市场判断和交易信号。")