39bff20d60
Co-authored-by: Cursor <cursoragent@cursor.com>
93 lines
4.4 KiB
HTML
93 lines
4.4 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|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">
|
||
K 线由客户端上报后<strong>写入服务器 bars 表保存</strong>;打开复盘时按开/平仓时间窗口<strong>读取</strong>。
|
||
蓝线/点=入场,黄线/点=出场,紫虚线=入场→出场。
|
||
</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 }}'
|
||
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 %}
|