bc50f300ba
Co-authored-by: Cursor <cursoragent@cursor.com>
85 lines
3.9 KiB
HTML
85 lines
3.9 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}复盘 #{{ trade.id }} · {{ app_name }}{% endblock %}
|
||
{% block content %}
|
||
<p><a href="{{ url_for('records_page') }}">← 返回列表</a></p>
|
||
<h2 style="margin:8px 0 14px">复盘 #{{ trade.id }} · {{ trade.symbol }} · {{ trade.side }}</h2>
|
||
|
||
<div class="grid cols-2">
|
||
<div class="card">
|
||
<h3>成交信息</h3>
|
||
<table>
|
||
<tr><th>账户</th><td>{{ trade.account_name or '—' }}</td></tr>
|
||
<tr><th>机器</th><td>{{ trade.machine_name or '—' }}</td></tr>
|
||
<tr><th>手数</th><td>{{ trade.volume }}</td></tr>
|
||
<tr><th>开仓价</th><td>{{ trade.open_price }}</td></tr>
|
||
<tr><th>平仓价</th><td>{{ trade.close_price if trade.close_price is not none else '—' }}</td></tr>
|
||
<tr><th>开仓时间</th><td>{{ trade.open_time_fmt }} <span class="muted">北京时间</span></td></tr>
|
||
<tr><th>平仓时间</th><td>{{ trade.close_time_fmt }} <span class="muted">北京时间</span></td></tr>
|
||
<tr><th>持仓时间</th><td style="font-weight:700;color:var(--accent)">{{ trade.hold_duration }}</td></tr>
|
||
<tr><th>盈亏</th><td>{{ trade.profit }}</td></tr>
|
||
<tr><th>SL / TP</th><td>{{ trade.sl }} / {{ trade.tp }}</td></tr>
|
||
<tr><th>单号</th><td>{{ trade.ticket or '—' }}</td></tr>
|
||
</table>
|
||
</div>
|
||
<div class="card">
|
||
<h3>入场形式标注</h3>
|
||
<form method="post" action="{{ url_for('record_annotate', tid=trade.id) }}">
|
||
<div class="form-row">
|
||
<label>入场形式</label>
|
||
<select name="entry_style">
|
||
<option value="" {% if not trade.entry_style %}selected{% endif %}>(未选)</option>
|
||
<optgroup label="顺势">
|
||
{% for p in entry_patterns %}
|
||
{% set s = '顺势 · ' ~ p %}
|
||
<option value="{{ s }}" {% if trade.entry_style==s %}selected{% endif %}>{{ p }}</option>
|
||
{% endfor %}
|
||
</optgroup>
|
||
<optgroup label="反转">
|
||
{% for p in entry_patterns %}
|
||
{% set s = '反转 · ' ~ p %}
|
||
<option value="{{ s }}" {% if trade.entry_style==s %}selected{% endif %}>{{ p }}</option>
|
||
{% endfor %}
|
||
</optgroup>
|
||
<optgroup label="其他">
|
||
<option value="其他 · 乱作" {% if trade.entry_style=='其他 · 乱作' %}selected{% endif %}>乱作</option>
|
||
</optgroup>
|
||
{% if trade.entry_style and trade.entry_style not in entry_styles %}
|
||
<optgroup label="历史标注">
|
||
<option value="{{ trade.entry_style }}" selected>{{ trade.entry_style }}(旧)</option>
|
||
</optgroup>
|
||
{% endif %}
|
||
</select>
|
||
<p class="muted" style="margin:8px 0 0">顺势/反转均含:窄幅区间突破、宽幅区间假突破、波段高低点假突破;对不上的选「乱作」。</p>
|
||
</div>
|
||
<div class="form-row">
|
||
<label>复盘备注</label>
|
||
<textarea name="review_note" rows="5" placeholder="位不对 / 形不对 / 出场违纪 …">{{ trade.review_note or '' }}</textarea>
|
||
</div>
|
||
<button class="btn" type="submit">保存标注</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card" style="margin-top:14px">
|
||
<h3>四周期 K 线(M1 / M5 / M15 / H1)</h3>
|
||
<p class="muted">数据来自服务器缓存;由已激活客户端通过 API 上报 bars。无数据时显示占位。</p>
|
||
<div class="chart-grid" style="margin-top:10px">
|
||
{% for tf in ['M1','M5','M15','H1'] %}
|
||
<div class="chart-box">
|
||
<h4>{{ tf }} · {{ charts[tf]|length }} 根</h4>
|
||
{% if charts[tf] %}
|
||
<canvas class="chart-canvas" id="chart-{{ tf }}"
|
||
data-bars='{{ charts[tf]|tojson }}'></canvas>
|
||
{% else %}
|
||
<div class="empty-chart">暂无 {{ tf }} K 线缓存</div>
|
||
{% endif %}
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block scripts %}
|
||
<script src="{{ url_for('static', filename='js/charts.js') }}"></script>
|
||
{% endblock %}
|