trading.ai/web/templates/pullbacks.html
2025-09-18 20:45:01 +08:00

220 lines
11 KiB
HTML

{% extends "base.html" %}
{% block title %}回踩监控 - A股量化交易系统{% endblock %}
{% block content %}
<!-- 页面标题和筛选 -->
<div class="row mb-4">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center">
<div>
<h1 class="h3 mb-1 text-primary fw-bold">
<i class="fas fa-exclamation-triangle me-2"></i>回踩监控
</h1>
<p class="text-muted mb-0">监控K线突破后的价格回踩情况</p>
</div>
<!-- 筛选表单 -->
<form method="GET" class="d-flex gap-2 align-items-center">
<select name="days" class="form-select form-select-sm">
<option value="7" {% if days == 7 %}selected{% endif %}>最近7天</option>
<option value="15" {% if days == 15 %}selected{% endif %}>最近15天</option>
<option value="30" {% if days == 30 %}selected{% endif %}>最近30天</option>
<option value="60" {% if days == 60 %}selected{% endif %}>最近60天</option>
</select>
<button type="submit" class="btn btn-primary btn-sm">
<i class="fas fa-filter me-1"></i>筛选
</button>
</form>
</div>
</div>
</div>
<!-- 说明卡片 -->
<div class="row mb-4">
<div class="col-12">
<div class="card fade-in">
<div class="card-body">
<div class="d-flex align-items-start">
<div class="text-primary me-3 mt-1">
<i class="fas fa-info-circle fa-lg"></i>
</div>
<div>
<h6 class="text-primary fw-bold mb-2">回踩监控说明</h6>
<p class="text-muted mb-0">
回踩监控功能会自动监控已触发的"两阳+阴+阳"突破信号,当价格回踩到阴线最高点附近时会发送特殊提醒。
这有助于识别关键支撑位的有效性,为交易决策提供参考。
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 回踩提醒表格 -->
<div class="row">
<div class="col-12">
<div class="card fade-in">
<div class="card-header">
<h5 class="mb-0 text-primary fw-bold">
<i class="fas fa-list-ul me-2"></i>回踩提醒记录
<span class="badge badge-light-primary ms-2">{{ pullback_alerts|length }} 条记录</span>
</h5>
</div>
<div class="card-body p-0">
{% if pullback_alerts %}
<div class="table-container">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead>
<tr>
<th>股票</th>
<th>周期</th>
<th>信号日期</th>
<th>回踩日期</th>
<th>天数间隔</th>
<th>突破价格</th>
<th>阴线高点</th>
<th>当前价格</th>
<th>当日最低</th>
<th>回调幅度</th>
<th>距离高点</th>
<th>提醒状态</th>
</tr>
</thead>
<tbody>
{% for alert in pullback_alerts %}
<tr>
<td>
<div class="d-flex align-items-center">
<span class="badge badge-light-primary me-2">{{ alert.stock_code }}</span>
<span class="fw-bold text-truncate" style="max-width: 80px;">{{ alert.stock_name or '未知' }}</span>
</div>
</td>
<td>
<span class="badge bg-{% if alert.timeframe == 'daily' %}primary{% elif alert.timeframe == '1h' %}info{% else %}success{% endif %}">
{{ 'D' if alert.timeframe == 'daily' else ('1H' if alert.timeframe == '1h' else 'W') }}
</span>
</td>
<td class="text-muted">{{ alert.original_signal_date | datetime_format('%Y-%m-%d') }}</td>
<td class="fw-bold">{{ alert.pullback_date | datetime_format('%Y-%m-%d') }}</td>
<td>
<span class="badge bg-info">{{ alert.days_since_signal }}天</span>
</td>
<td class="text-success">{{ alert.original_breakout_price | currency }}元</td>
<td class="text-warning fw-bold">{{ alert.yin_high | currency }}元</td>
<td class="text-danger">{{ alert.current_price | currency }}元</td>
<td class="text-danger">{{ alert.current_low | currency }}元</td>
<td>
<span class="badge bg-{% if alert.pullback_pct and alert.pullback_pct < -10 %}danger{% elif alert.pullback_pct and alert.pullback_pct < -5 %}warning{% else %}secondary{% endif %}">
{{ alert.pullback_pct | percentage }}
</span>
</td>
<td>
<span class="badge bg-{% if alert.distance_to_yin_high and alert.distance_to_yin_high < -5 %}danger{% elif alert.distance_to_yin_high and alert.distance_to_yin_high < 2 %}warning{% else %}success{% endif %}">
{{ alert.distance_to_yin_high | percentage }}
</span>
</td>
<td>
{% if alert.alert_sent %}
<span class="badge bg-success">
<i class="fas fa-check me-1"></i>已发送
</span>
<div class="text-muted small mt-1">{{ alert.alert_sent_time | datetime_format('%m-%d %H:%M') }}</div>
{% else %}
<span class="badge bg-secondary">未发送</span>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<!-- 统计信息 -->
<div class="row mt-4 px-3 pb-3">
<div class="col-md-3 mb-3">
<div class="stats-card text-center hover-lift">
<div class="stats-value text-danger">{{ pullback_alerts | selectattr('distance_to_yin_high', 'lt', -5) | list | length }}</div>
<div class="stats-label">跌破阴线高点</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="stats-card text-center hover-lift">
<div class="stats-value text-warning">{{ pullback_alerts | selectattr('distance_to_yin_high', 'ge', -5) | selectattr('distance_to_yin_high', 'lt', 2) | list | length }}</div>
<div class="stats-label">接近阴线高点</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="stats-card text-center hover-lift">
<div class="stats-value text-success">{{ pullback_alerts | selectattr('distance_to_yin_high', 'ge', 2) | list | length }}</div>
<div class="stats-label">上方支撑有效</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="stats-card text-center hover-lift">
<div class="stats-value text-info">{{ pullback_alerts | selectattr('alert_sent', 'equalto', true) | list | length }}</div>
<div class="stats-label">已发送提醒</div>
</div>
</div>
</div>
{% else %}
<div class="empty-state">
<i class="fas fa-shield-alt"></i>
<h4>暂无回踩提醒</h4>
<p>最近{{ days }}天内没有检测到价格回踩阴线最高点的情况</p>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<!-- 风险提示 -->
<div class="row mt-4">
<div class="col-12">
<div class="card border-danger">
<div class="card-header bg-danger text-white">
<h6 class="mb-0 fw-bold">
<i class="fas fa-exclamation-triangle me-2"></i>风险提示
</h6>
</div>
<div class="card-body">
<ul class="mb-0 text-muted">
<li>回踩阴线最高点可能表明原有突破信号的有效性受到质疑</li>
<li>跌破阴线最高点通常需要重新评估形态的技术有效性</li>
<li>建议结合成交量、其他技术指标和基本面情况综合判断</li>
<li>本系统仅供参考,投资需谨慎,风险需自担</li>
</ul>
</div>
</div>
</div>
</div>
{% endblock %}
{% block extra_js %}
<script>
$(document).ready(function() {
// 表格行点击高亮
$('tbody tr').on('click', function() {
$(this).toggleClass('table-active');
});
// 根据风险等级添加颜色标识
$('tbody tr').each(function() {
const distanceCell = $(this).find('td:nth-last-child(2)');
const distance = parseFloat(distanceCell.text());
if (distance < -5) {
$(this).addClass('table-danger');
} else if (distance < 2) {
$(this).addClass('table-warning');
}
});
});
</script>
{% endblock %}