update
This commit is contained in:
parent
6f91b9522f
commit
111e46b8f3
@ -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}",
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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("🤖 美股分析脚本")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user