This commit is contained in:
aaron 2026-02-28 17:55:30 +08:00
parent 99d9199d8d
commit 93d158addf
2 changed files with 83 additions and 10 deletions

View File

@ -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()

View File

@ -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 响应"""