9f6651da2f
Crop thumbnails around entry/exit so short trades are visible; lightbox uses a tighter window. Co-authored-by: Cursor <cursoragent@cursor.com>
107 lines
5.3 KiB
HTML
107 lines
5.3 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}复盘 #{{ trade.id }} · {{ app_name }}{% endblock %}
|
||
{% block content %}
|
||
{% set side_cn = '买入(多)' if trade.side == 'buy' else ('卖出(空)' if trade.side == 'sell' else (trade.side or '—')) %}
|
||
{% set side_cls = 'green' if trade.side == 'buy' else ('red' if trade.side == 'sell' else 'gray') %}
|
||
<p><a href="{{ url_for('records_page') }}">← 返回列表</a></p>
|
||
<h2 style="margin:8px 0 14px">
|
||
复盘 #{{ trade.id }} · {{ trade.symbol }} ·
|
||
<span class="tag {{ side_cls }}" style="font-size:15px;vertical-align:middle">{{ side_cn }}</span>
|
||
</h2>
|
||
|
||
<div class="grid cols-2">
|
||
<div class="card">
|
||
<h3>成交信息</h3>
|
||
<table>
|
||
<tr><th>方向</th><td><span class="tag {{ side_cls }}">{{ side_cn }}</span></td></tr>
|
||
<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|fmt_price }}</td></tr>
|
||
<tr><th>平仓价</th><td>{{ trade.close_price|fmt_price }}</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|fmt_money }}</td></tr>
|
||
<tr><th>SL / TP</th><td>{{ trade.sl|fmt_price }} / {{ trade.tp|fmt_price }}</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">
|
||
方向 <span class="tag {{ side_cls }}">{{ side_cn }}</span> ·
|
||
入/出落在<strong>包含成交时刻</strong>的 K 线 · <strong>点击图可放大</strong>(放大时围绕进出场收紧)。
|
||
<span style="color:#4cc2ff">● 入场 {{ trade.open_price|fmt_price }}{% if trade.open_time_fmt %} · {{ trade.open_time_fmt }}{% endif %}</span>
|
||
{% if trade.close_price is not none %}
|
||
· <span style="color:#f0b429">● 出场 {{ trade.close_price|fmt_price }}{% if trade.close_time_fmt %} · {{ trade.close_time_fmt }}{% endif %}</span>
|
||
{% endif %}
|
||
</p>
|
||
<div class="chart-grid" style="margin-top:10px">
|
||
{% for tf in ['M1','M5','M15','H1'] %}
|
||
<div class="chart-box">
|
||
<h4>{{ tf }} <span class="chart-meta muted" style="font-weight:400"></span>
|
||
{% if charts[tf] %}<span class="chart-zoom-hint muted">点击放大</span>{% endif %}
|
||
</h4>
|
||
{% if charts[tf] %}
|
||
<canvas class="chart-canvas" id="chart-{{ tf }}"
|
||
title="点击放大"
|
||
data-tf="{{ tf }}"
|
||
data-bars='{{ charts[tf]|tojson }}'
|
||
data-open-ts="{{ trade.open_time or '' }}"
|
||
data-close-ts="{{ trade.close_time or '' }}"
|
||
data-open-price="{{ trade.open_price if trade.open_price is not none else '' }}"
|
||
data-close-price="{{ trade.close_price if trade.close_price is not none else '' }}"
|
||
data-side="{{ trade.side or '' }}"></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 %}
|