update
This commit is contained in:
parent
99d9199d8d
commit
93d158addf
@ -480,14 +480,28 @@ class CryptoAgent:
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
logger.info(f"\n🤖 【第一阶段:市场信号分析】")
|
logger.info(f"\n🤖 【第一阶段:市场信号分析】")
|
||||||
|
|
||||||
|
# 获取上一轮的信号(用于上下文)
|
||||||
|
previous_signal = self.last_signals.get(symbol)
|
||||||
|
|
||||||
market_signal = await self.market_analyzer.analyze(
|
market_signal = await self.market_analyzer.analyze(
|
||||||
symbol, data,
|
symbol, data,
|
||||||
symbols=self.symbols
|
symbols=self.symbols,
|
||||||
|
previous_signal=previous_signal
|
||||||
)
|
)
|
||||||
|
|
||||||
# 输出市场分析结果
|
# 输出市场分析结果
|
||||||
self._log_market_signal(market_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 信号
|
# 过滤掉 wait 信号,只保留 buy/sell 信号
|
||||||
signals = market_signal.get('signals', [])
|
signals = market_signal.get('signals', [])
|
||||||
trade_signals = [s for s in signals if s.get('action') in ['buy', 'sell']]
|
trade_signals = [s for s in signals if s.get('action') in ['buy', 'sell']]
|
||||||
@ -1916,9 +1930,11 @@ class CryptoAgent:
|
|||||||
return {'error': '数据不完整'}
|
return {'error': '数据不完整'}
|
||||||
|
|
||||||
# 使用新架构:市场分析 + 交易决策
|
# 使用新架构:市场分析 + 交易决策
|
||||||
|
previous_signal = self.last_signals.get(symbol)
|
||||||
market_signal = await self.market_analyzer.analyze(
|
market_signal = await self.market_analyzer.analyze(
|
||||||
symbol, data,
|
symbol, data,
|
||||||
symbols=self.symbols
|
symbols=self.symbols,
|
||||||
|
previous_signal=previous_signal
|
||||||
)
|
)
|
||||||
|
|
||||||
positions, account = self._get_trading_state()
|
positions, account = self._get_trading_state()
|
||||||
|
|||||||
@ -266,6 +266,18 @@ class MarketSignalAnalyzer:
|
|||||||
6. 90+分:强信号,但也要控制风险
|
6. 90+分:强信号,但也要控制风险
|
||||||
7. 不要输出 action 为 "wait" 的信号,如果没有交易机会就不输出
|
7. 不要输出 action 为 "wait" 的信号,如果没有交易机会就不输出
|
||||||
|
|
||||||
|
## 历史信号参考
|
||||||
|
**如果提供了上一轮的分析信号,请参考它来调整你的判断:**
|
||||||
|
|
||||||
|
1. **避免重复信号**:如果上一轮已经给出了买入/卖出信号,不要在没有明显变化的情况下重复给出相同方向的信号
|
||||||
|
2. **信号调整建议**:
|
||||||
|
- 上一轮买入 → 当前看涨 → 可以考虑"继续持有"或"加仓"(如果有新进展)
|
||||||
|
- 上一轮买入 → 当前转跌 → 应该建议"减仓"或"止损"
|
||||||
|
- 上一轮观望 → 当前出现机会 → 可以给出新的交易信号
|
||||||
|
- 上一轮做空 → 当前转涨 → 应该建议"平仓"或"反转"
|
||||||
|
3. **趋势延续性**:如果上一轮判断的趋势方向仍然有效,不要轻易改变方向判断,除非有明确的反转信号
|
||||||
|
4. **时间间隔考虑**:如果距离上一轮分析只有很短时间(5-15分钟),避免频繁改变信号方向
|
||||||
|
|
||||||
记住:你只负责分析市场,输出客观的交易信号,不需要考虑仓位管理和风险控制!
|
记住:你只负责分析市场,输出客观的交易信号,不需要考虑仓位管理和风险控制!
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -273,7 +285,8 @@ class MarketSignalAnalyzer:
|
|||||||
self.news_service = get_news_service()
|
self.news_service = get_news_service()
|
||||||
|
|
||||||
async def analyze(self, symbol: str, data: Dict[str, Any],
|
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: 交易对
|
symbol: 交易对
|
||||||
data: 多周期K线数据
|
data: 多周期K线数据
|
||||||
symbols: 所有监控的交易对(用于市场对比)
|
symbols: 所有监控的交易对(用于市场对比)
|
||||||
|
previous_signal: 上一轮的分析信号(用于避免重复信号和提供上下文)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
市场信号字典
|
市场信号字典
|
||||||
@ -293,7 +307,7 @@ class MarketSignalAnalyzer:
|
|||||||
news_context = await self._get_news_context(symbol)
|
news_context = await self._get_news_context(symbol)
|
||||||
|
|
||||||
# 3. 构建 LLM 提示词
|
# 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 分析
|
# 4. 调用 LLM 分析
|
||||||
messages = [
|
messages = [
|
||||||
@ -422,16 +436,59 @@ class MarketSignalAnalyzer:
|
|||||||
return "新闻获取失败"
|
return "新闻获取失败"
|
||||||
|
|
||||||
def _build_analysis_prompt(self, symbol: str, market_context: str,
|
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]:
|
def _parse_llm_response(self, response: str, symbol: str) -> Dict[str, Any]:
|
||||||
"""解析 LLM 响应"""
|
"""解析 LLM 响应"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user