@ -468,98 +468,233 @@
< div class = "ai-title" >
< div class = "ai-icon" > AI< / div >
AI智能分析
< div style = "margin-left: auto; display: flex; align-items: center;" >
< span style = "font-size: 14px; margin-right: 8px; color: #666;" > 模型选择:< / span >
< form action = "/symbol/{{ symbol }}" method = "get" style = "display: flex; align-items: center;" >
< select name = "model" onchange = "this.form.submit()" style = "padding: 4px 8px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; outline: none;" >
{% for model in available_models %}
< option value = "{{ model }}" { % if model_name = = model % } selected { % endif % } >
{% if model == 'deepseek' %}DeepSeek
{% elif model == 'gpt' %}GPT
{% elif model == 'gemini' %}Gemini
{% else %}{{ model }}
{% endif %}
< / option >
{% endfor %}
< / select >
< / form >
< / div >
< / div >
{% if ai_analysis.error %}
<!-- 模型不可用时的友好提示 -->
< div style = "text-align: center; padding: 60px; background: #f9fafb; border-radius: 8px;" >
< div style = "font-size: 48px; margin-bottom: 20px;" > ⚠️< / div >
< h3 style = "font-size: 18px; font-weight: 600; color: #333; margin-bottom: 12px;" > AI分析不可用< / h3 >
< p style = "font-size: 14px; color: #666; margin-bottom: 24px;" >
{% if ai_analysis.error == 'API密钥未配置' %}
当前模型的API密钥未配置, 请在.env文件中添加相应的API密钥
{% elif ai_analysis.error == 'API调用失败' %}
API调用失败, 请检查网络连接或API密钥是否正确
{% else %}
{{ ai_analysis.error }}
{% endif %}
< / p >
< div style = "display: flex; justify-content: center; gap: 16px;" >
< a href = "/symbol/{{ symbol }}?model=deepseek" style = "padding: 8px 16px; background: #f0f0f0; color: #333; text-decoration: none; border-radius: 4px; font-size: 14px;" > 切换模型< / a >
< / div >
< / div >
{% else %}
<!-- AI分析内容 -->
< div class = "ai-content" >
< div class = "analysis-grid" >
<!-- 趋势分析 -->
< div class = "analysis-card" >
< div class = "card-title" > 趋势判断< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 趋势方向< / div >
<!-- 趋势分析卡片 -->
< div class = "analysis-card" style = "margin-bottom: 20px;" >
< div class = "card-title" >
< div style = "display: flex; align-items: center;" >
< div style = "width: 8px; height: 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 4px; margin-right: 8px;" > < / div >
趋势判断
< / div >
< / div >
< div class = "analysis-grid" style = "gap: 16px;" >
< div class = "analysis-item" style = "flex: 1; padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 趋势方向< / div >
< div class = "analysis-value
{% if ai_analysis.trend_judgment and ('多' in ai_analysis.trend_judgment) %}direction-up{% elif ai_analysis.trend_judgment and ('空' in ai_analysis.trend_judgment) %}direction-down{% endif %}">
{% if ai_analysis.trend_judgment and ('多' in ai_analysis.trend_judgment) %}direction-up{% elif ai_analysis.trend_judgment and ('空' in ai_analysis.trend_judgment) %}direction-down{% endif %}"
style="font-size: 16px; font-weight: 600;">
{{ ai_analysis.trend_judgment | default('未知') }}
< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 胜率评估< / div >
< div class = "analysis-value" > {{ ai_analysis.win_rate_assessment | default('未知') }}< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 风险预警< / div >
< div class = "analysis-value warning" > {{ ai_analysis.risk_warning | default('无') }}< / div >
< div class = "analysis-item" style = "flex: 1; padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 胜率评估< / div >
< div class = "analysis-value" style = "font-size: 16px; font-weight: 600;" > {{ ai_analysis.win_rate_assessment | default('未知') }}< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 交易建议< / div >
< div class = "analysis-item" style = "flex: 1; padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 交易建议< / div >
< div class = "analysis-value
{% if ai_analysis.trade_recommendation and ('多' in ai_analysis.trade_recommendation) %}direction-up{% elif ai_analysis.trade_recommendation and ('空' in ai_analysis.trade_recommendation) %}direction-down{% endif %}">
{% if ai_analysis.trade_recommendation and ('多' in ai_analysis.trade_recommendation) %}direction-up{% elif ai_analysis.trade_recommendation and ('空' in ai_analysis.trade_recommendation) %}direction-down{% endif %}"
style="font-size: 16px; font-weight: 600;">
{{ ai_analysis.trade_recommendation | default('未知') }}
< / div >
< / div >
< / div >
<!-- 分析逻辑 -->
< div class = "analysis-card" >
< div class = "card-title" > 分析逻辑< / div >
< div style = "padding: 8px 0;" >
{{ ai_analysis.analysis_logic | default('无详细分析') }}
<!-- 风险预警 -->
{% if ai_analysis.risk_warning and ai_analysis.risk_warning != '无' %}
< div style = "margin-top: 16px; padding: 12px; background: #fff2f0; border: 1px solid #ffccc7; border-radius: 6px;" >
< div style = "font-size: 14px; font-weight: 600; color: #ff4d4f; margin-bottom: 4px;" > ⚠️ 风险预警< / div >
< div style = "font-size: 14px; color: #ff4d4f;" > {{ ai_analysis.risk_warning }}< / div >
< / div >
{% endif %}
< / div >
<!-- 分析逻辑 -->
{% if ai_analysis.analysis_logic %}
< div class = "analysis-card" style = "margin-bottom: 20px;" >
< div class = "card-title" >
< div style = "display: flex; align-items: center;" >
< div style = "width: 8px; height: 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 4px; margin-right: 8px;" > < / div >
分析逻辑
< / div >
< / div >
< div style = "padding: 12px; background: #f9fafb; border-radius: 6px;" >
{% if ai_analysis.analysis_logic is string %}
<!-- 处理字符串形式的分析逻辑 -->
{% if '1.' in ai_analysis.analysis_logic or '2.' in ai_analysis.analysis_logic or '3.' in ai_analysis.analysis_logic %}
<!-- 处理列表形式的分析逻辑 -->
< ul style = "list-style: none; padding: 0; margin: 0;" >
{% for item in ai_analysis.analysis_logic.split('\n') %}
{% if item.strip() %}
< li style = "padding: 8px 0; border-bottom: 1px solid #f0f0f0;" >
< div style = "display: flex; align-items: flex-start;" >
< div style = "width: 20px; height: 20px; background: #667eea; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; margin-right: 12px; flex-shrink: 0;" >
{% if loop.index < = 9 %}{{ loop.index }}{% else %}{{ loop.index }}{% endif %}
< / div >
< div style = "flex: 1;" > {{ item.strip() }}< / div >
< / div >
< / li >
{% endif %}
{% endfor %}
< / ul >
{% else %}
<!-- 处理普通文本形式的分析逻辑 -->
< p style = "margin: 0;" > {{ ai_analysis.analysis_logic }}< / p >
{% endif %}
{% else %}
<!-- 处理其他形式的分析逻辑 -->
< p style = "margin: 0;" > {{ ai_analysis.analysis_logic | default('无详细分析') }}< / p >
{% endif %}
< / div >
< / div >
{% endif %}
< / div >
<!-- 交易建议 -->
< div class = "recommendation" style = "margin-top: 20px;" >
< div class = "recommendation-title" > 详细交易建议< / div >
< div class = "analysis-grid" style = "margin-top: 16px;" >
< div class = "recommendation-title" >
< div style = "display: flex; align-items: center;" >
< div style = "width: 8px; height: 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 4px; margin-right: 8px;" > < / div >
详细交易建议
< / div >
< / div >
< div class = "analysis-grid" style = "margin-top: 16px; gap: 20px;" >
<!-- 交易参数 -->
< div class = "analysis-card" >
< div class = "analysis-card" style = "flex: 1;" >
< div class = "card-title" > 交易参数< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 交易方向< / div >
< div class = "analysis-value
{% if recommendation.direction == 'long' %}direction-up{% elif recommendation.direction == 'short' %}direction-down{% endif %}">
{% if recommendation.direction == 'long' %}多头
{% elif recommendation.direction == 'short' %}空头
{% else %}{{ recommendation.direction | default('未知') }}
{% endif %}
< div style = "display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px;" >
< div class = "analysis-item" style = "padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 交易方向< / div >
< div class = "analysis-value
{% if recommendation.direction == 'long' %}direction-up{% elif recommendation.direction == 'short' %}direction-down{% endif %}"
style="font-size: 16px; font-weight: 600;">
{% if recommendation.direction == 'long' %}多头
{% elif recommendation.direction == 'short' %}空头
{% else %}{{ recommendation.direction | default('未知') }}
{% endif %}
< / div >
< / div >
< div class = "analysis-item" style = "padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 入场价格< / div >
< div class = "analysis-value" style = "font-size: 16px; font-weight: 600;" > {{ recommendation.entry_price | default('未知') }}< / div >
< / div >
< div class = "analysis-item" style = "padding: 12px; background: #fff2f0; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 止损价格< / div >
< div class = "analysis-value warning" style = "font-size: 16px; font-weight: 600;" > {{ recommendation.stop_loss | default('未知') }}< / div >
< / div >
< div class = "analysis-item" style = "padding: 12px; background: #f0f5ff; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 目标价格< / div >
< div class = "analysis-value direction-up" style = "font-size: 16px; font-weight: 600;" > {{ recommendation.target_price | default('未知') }}< / div >
< / div >
< div class = "analysis-item" style = "padding: 12px; background: #f9fafb; border-radius: 6px;" >
< div class = "analysis-label" style = "margin-bottom: 4px;" > 仓位大小< / div >
< div class = "analysis-value" style = "font-size: 16px; font-weight: 600;" > {{ recommendation.position_size | default('未知') }}手< / div >
< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 入场价格< / div >
< div class = "analysis-value" > {{ recommendation.entry_price | default('未知') }}< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 止损价格< / div >
< div class = "analysis-value warning" > {{ recommendation.stop_loss | default('未知') }}< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 目标价格< / div >
< div class = "analysis-value direction-up" > {{ recommendation.target_price | default('未知') }}< / div >
< / div >
< div class = "analysis-item" >
< div class = "analysis-label" > 仓位大小< / div >
< div class = "analysis-value" > {{ recommendation.position_size | default('未知') }}手< / div >
< / div >
< / div >
<!-- 执行计划 -->
< div class = "analysis-card" >
< div class = "analysis-card" style = "flex: 1;" >
< div class = "card-title" > 执行计划< / div >
< div style = "padding: 8px 0;" >
{{ recommendation.execution_plan | default('无详细计划') }}
< div style = "padding: 12px; background: #f9fafb; border-radius: 6px;" >
{% if recommendation.execution_plan %}
{% if '1.' in recommendation.execution_plan or '2.' in recommendation.execution_plan or '3.' in recommendation.execution_plan %}
<!-- 处理列表形式的执行计划 -->
< ul style = "list-style: none; padding: 0; margin: 0;" >
{% for item in recommendation.execution_plan.split('\n') %}
{% if item.strip() %}
< li style = "padding: 8px 0; border-bottom: 1px solid #f0f0f0;" >
< div style = "display: flex; align-items: flex-start;" >
< div style = "width: 20px; height: 20px; background: #764ba2; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; margin-right: 12px; flex-shrink: 0;" >
{% if loop.index < = 9 %}{{ loop.index }}{% else %}{{ loop.index }}{% endif %}
< / div >
< div style = "flex: 1;" > {{ item.strip() }}< / div >
< / div >
< / li >
{% endif %}
{% endfor %}
< / ul >
{% else %}
<!-- 处理普通文本形式的执行计划 -->
< p style = "margin: 0;" > {{ recommendation.execution_plan }}< / p >
{% endif %}
{% else %}
< p style = "margin: 0; color: #999;" > 无详细计划< / p >
{% endif %}
< / div >
< / div >
<!-- 风险提示 -->
< div class = "analysis-card" >
< div class = "analysis-card" style = "flex: 1;" >
< div class = "card-title" > 风险提示< / div >
< div style = "padding: 8px 0; color: #ff4d4f;" >
{{ recommendation.risk_tips | default('无风险提示') }}
< div style = "padding: 12px; background: #fff2f0; border: 1px solid #ffccc7; border-radius: 6px;" >
{% if recommendation.risk_tips %}
{% if '1.' in recommendation.risk_tips or '2.' in recommendation.risk_tips or '3.' in recommendation.risk_tips %}
<!-- 处理列表形式的风险提示 -->
< ul style = "list-style: none; padding: 0; margin: 0;" >
{% for item in recommendation.risk_tips.split('\n') %}
{% if item.strip() %}
< li style = "padding: 8px 0; border-bottom: 1px solid #ffccc7;" >
< div style = "display: flex; align-items: flex-start;" >
< div style = "width: 20px; height: 20px; background: #ff4d4f; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; margin-right: 12px; flex-shrink: 0;" >
⚠️
< / div >
< div style = "flex: 1; color: #ff4d4f;" > {{ item.strip() }}< / div >
< / div >
< / li >
{% endif %}
{% endfor %}
< / ul >
{% else %}
<!-- 处理普通文本形式的风险提示 -->
< p style = "margin: 0; color: #ff4d4f;" > {{ recommendation.risk_tips }}< / p >
{% endif %}
{% else %}
< p style = "margin: 0; color: #ff4d4f;" > 无风险提示< / p >
{% endif %}
< / div >
< / div >
< / div >
< / div >
{% endif %}
< / div >
<!-- 底部 -->