This commit is contained in:
aaron 2026-02-19 23:04:21 +08:00
parent 6f91b9522f
commit 111e46b8f3
3 changed files with 76 additions and 28 deletions

View File

@ -1143,12 +1143,16 @@ class LLMSignalAnalyzer:
position_icon = {'heavy': '🔥', 'medium': '📊', 'light': '🌱'}.get(position_size, '🌱') position_icon = {'heavy': '🔥', 'medium': '📊', 'light': '🌱'}.get(position_size, '🌱')
position_text = position_map.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': if signal['action'] == 'buy':
title = f"🟢 {symbol} {signal_type}做多信号 [{entry_type_text}]" title = f"🟢 {stock_tag}{symbol} {signal_type}做多信号 {market_badge}"
color = "green" color = "green"
else: else:
title = f"🔴 {symbol} {signal_type}做空信号 [{entry_type_text}]" title = f"🔴 {stock_tag}{symbol} {signal_type}做空信号 {market_badge}"
color = "red" color = "red"
# 计算风险收益比 # 计算风险收益比
@ -1158,7 +1162,28 @@ class LLMSignalAnalyzer:
sl_percent = ((sl - entry) / entry * 100) if entry else 0 sl_percent = ((sl - entry) / entry * 100) if entry else 0
tp_percent = ((tp - entry) / entry * 100) if entry else 0 tp_percent = ((tp - entry) / entry * 100) if entry else 0
# 构建 Markdown 内容 # 构建 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 = [ content_parts = [
f"**{signal_type}** | **{grade}**{grade_icon} | **{confidence}%** 置信度", f"**{signal_type}** | **{grade}**{grade_icon} | **{confidence}%** 置信度",
f"{entry_type_icon} **入场方式**: {entry_type_text}", f"{entry_type_icon} **入场方式**: {entry_type_text}",

View File

@ -11,17 +11,19 @@ cd "$(dirname "$0")/.." || exit 1
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
# 无参数,分析配置的所有股票 # 无参数,分析配置的所有股票
echo "📊 分析配置的所有股票(将发送通知)..." echo "📊 分析配置的所有股票(将发送通知)..."
# 使用更可靠的方式获取股票代码
python3 -c " python3 -c "
import sys import sys
sys.path.insert(0, 'backend') sys.path.insert(0, 'backend')
from app.config import get_settings from app.config import get_settings
settings = 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)) 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 else
# 分析指定的股票 # 分析指定的股票 - 使用引号正确传递参数
SYMBOLS="$@" echo "📊 分析股票: $*(将发送通知)"
echo "📊 分析股票: $SYMBOLS(将发送通知)" python3 scripts/test_stock.py "$@"
python3 scripts/test_stock.py $SYMBOLS
fi fi

View File

@ -114,8 +114,10 @@ async def analyze(symbol: str, send_notification: bool = True):
title = card['title'] title = card['title']
content = card['content'] content = card['content']
# 发送通知 # 发送通知 - 使用 send_card 方法
await feishu.send_markdown(title, content) # 根据信号方向选择颜色
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)) await telegram.send_message(llm.format_signal_message(best_signal, symbol))
print(f"\n📬 通知已发送:{title}") print(f"\n📬 通知已发送:{title}")
else: else:
@ -138,7 +140,26 @@ async def main():
print(" python3 scripts/test_stock.py AAPL TSLA NVDA") print(" python3 scripts/test_stock.py AAPL TSLA NVDA")
sys.exit(1) 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("="*60)
print("🤖 美股分析脚本") print("🤖 美股分析脚本")