update
This commit is contained in:
parent
99d9199d8d
commit
93d158addf
@ -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()
|
||||
|
||||
@ -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 响应"""
|
||||
|
||||
Loading…
Reference in New Issue
Block a user