From 111e46b8f35f42f8fd8d5dded83c695dbe47c49c Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 19 Feb 2026 23:04:21 +0800 Subject: [PATCH] update --- .../app/crypto_agent/llm_signal_analyzer.py | 63 +++++++++++++------ scripts/stock.sh | 14 +++-- scripts/test_stock.py | 27 +++++++- 3 files changed, 76 insertions(+), 28 deletions(-) diff --git a/backend/app/crypto_agent/llm_signal_analyzer.py b/backend/app/crypto_agent/llm_signal_analyzer.py index 826bb58..d1e4b1e 100644 --- a/backend/app/crypto_agent/llm_signal_analyzer.py +++ b/backend/app/crypto_agent/llm_signal_analyzer.py @@ -1143,12 +1143,16 @@ class LLMSignalAnalyzer: position_icon = {'heavy': '🔥', 'medium': '📊', 'light': '🌱'}.get(position_size, '🌱') position_text = position_map.get(position_size, '轻仓') - # 标题和颜色 + # 标题和颜色 - 添加美股标记 + is_market_order = entry_type == 'market' + market_badge = '【现价】' if is_market_order else '' + stock_tag = '[美股] ' + if signal['action'] == 'buy': - title = f"🟢 {symbol} {signal_type}做多信号 [{entry_type_text}]" + title = f"🟢 {stock_tag}{symbol} {signal_type}做多信号 {market_badge}" color = "green" else: - title = f"🔴 {symbol} {signal_type}做空信号 [{entry_type_text}]" + title = f"🔴 {stock_tag}{symbol} {signal_type}做空信号 {market_badge}" color = "red" # 计算风险收益比 @@ -1158,22 +1162,43 @@ class LLMSignalAnalyzer: sl_percent = ((sl - entry) / entry * 100) if entry else 0 tp_percent = ((tp - entry) / entry * 100) if entry else 0 - # 构建 Markdown 内容 - content_parts = [ - f"**{signal_type}** | **{grade}**{grade_icon} | **{confidence}%** 置信度", - f"{entry_type_icon} **入场方式**: {entry_type_text}", - f"{position_icon} **建议仓位**: {position_text}", - "", - f"💰 **入场**: ${entry:,.2f}", - f"🛑 **止损**: ${sl:,.2f} ({sl_percent:+.1f}%)", - f"🎯 **止盈**: ${tp:,.2f} ({tp_percent:+.1f}%)", - "", - f"📝 **分析理由**:", - f"{signal.get('reason', '无')}", - "", - f"⚠️ **风险提示**:", - f"{signal.get('risk_warning', '请注意风险控制')}", - ] + # 构建 Markdown 内容 - 现价时突出显示 + if is_market_order: + # 现价入场,重点突出价格 + content_parts = [ + f"**{signal_type}** | **{grade}**{grade_icon} | **{confidence}%** 置信度", + f"{entry_type_icon} **入场方式**: {entry_type_text}", + f"{position_icon} **建议仓位**: {position_text}", + "", + f"💰 **⭐ 现价入场 ⭐**", + f"**>>> ${entry:,.2f} <<<**", + "", + f"🛑 **止损**: ${sl:,.2f} ({sl_percent:+.1f}%)", + f"🎯 **止盈**: ${tp:,.2f} ({tp_percent:+.1f}%)", + "", + f"📝 **分析理由**:", + f"{signal.get('reason', '无')}", + "", + f"⚠️ **风险提示**:", + f"{signal.get('risk_warning', '请注意风险控制')}", + ] + else: + # 挂单,正常显示 + content_parts = [ + f"**{signal_type}** | **{grade}**{grade_icon} | **{confidence}%** 置信度", + f"{entry_type_icon} **入场方式**: {entry_type_text}", + f"{position_icon} **建议仓位**: {position_text}", + "", + f"💰 **入场**: ${entry:,.2f}", + f"🛑 **止损**: ${sl:,.2f} ({sl_percent:+.1f}%)", + f"🎯 **止盈**: ${tp:,.2f} ({tp_percent:+.1f}%)", + "", + f"📝 **分析理由**:", + f"{signal.get('reason', '无')}", + "", + f"⚠️ **风险提示**:", + f"{signal.get('risk_warning', '请注意风险控制')}", + ] return { 'title': title, diff --git a/scripts/stock.sh b/scripts/stock.sh index 014582a..0fd31bc 100755 --- a/scripts/stock.sh +++ b/scripts/stock.sh @@ -11,17 +11,19 @@ cd "$(dirname "$0")/.." || exit 1 if [ $# -eq 0 ]; then # 无参数,分析配置的所有股票 echo "📊 分析配置的所有股票(将发送通知)..." + # 使用更可靠的方式获取股票代码 python3 -c " import sys sys.path.insert(0, 'backend') from app.config import get_settings settings = get_settings() -symbols = settings.stock_symbols.split(',') +symbols = [s.strip() for s in settings.stock_symbols.split(',') if s.strip()] print(' '.join(symbols)) -" 2>/dev/null | xargs python3 scripts/test_stock.py +" 2>/dev/null | while read -r symbols; do + python3 scripts/test_stock.py $symbols + done else - # 分析指定的股票 - SYMBOLS="$@" - echo "📊 分析股票: $SYMBOLS(将发送通知)" - python3 scripts/test_stock.py $SYMBOLS + # 分析指定的股票 - 使用引号正确传递参数 + echo "📊 分析股票: $*(将发送通知)" + python3 scripts/test_stock.py "$@" fi diff --git a/scripts/test_stock.py b/scripts/test_stock.py index 178825b..e6181b5 100755 --- a/scripts/test_stock.py +++ b/scripts/test_stock.py @@ -114,8 +114,10 @@ async def analyze(symbol: str, send_notification: bool = True): title = card['title'] content = card['content'] - # 发送通知 - await feishu.send_markdown(title, content) + # 发送通知 - 使用 send_card 方法 + # 根据信号方向选择颜色 + color = "green" if best_signal.get('action') == 'buy' else "red" + await feishu.send_card(title, content, color) await telegram.send_message(llm.format_signal_message(best_signal, symbol)) print(f"\n📬 通知已发送:{title}") else: @@ -138,7 +140,26 @@ async def main(): print(" python3 scripts/test_stock.py AAPL TSLA NVDA") sys.exit(1) - symbols = sys.argv[1:] + # 过滤掉无效的参数(如环境变量路径、配置项等) + # 只接受有效的股票代码(字母开头,1-5个字符) + raw_symbols = sys.argv[1:] + symbols = [] + for arg in raw_symbols: + # 跳过包含路径分隔符、等号、或明显不是股票代码的参数 + if '/' in arg or '=' in arg or ':' in arg or len(arg) > 10: + logger.debug(f"跳过无效参数: {arg}") + continue + # 只保留纯字母的参数(股票代码) + if arg.isalpha() and 1 <= len(arg) <= 5: + symbols.append(arg.upper()) + else: + logger.debug(f"跳过非股票代码参数: {arg}") + + if not symbols: + print("❌ 未找到有效的股票代码") + print(f"接收到的参数: {raw_symbols}") + print("\n用法: python3 scripts/test_stock.py AAPL [TSLA] [NVDA] ...") + sys.exit(1) print("="*60) print("🤖 美股分析脚本")