平仓汇总新增盈亏比数据

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fish
2026-07-28 15:31:16 +08:00
parent 0d01faf464
commit 6609b39f7b
2 changed files with 39 additions and 3 deletions
+33 -3
View File
@@ -15,6 +15,8 @@ def _future_stats(records) -> dict:
open_fee = 0.0 open_fee = 0.0
close_fee = 0.0 close_fee = 0.0
wins = 0 wins = 0
profit_sum = 0.0
loss_sum = 0.0
for t in records: for t in records:
mul = t.point_value mul = t.point_value
if t.direction == "short": if t.direction == "short":
@@ -26,8 +28,12 @@ def _future_stats(records) -> dict:
cf = t.close_fee or 0 cf = t.close_fee or 0
open_fee += of open_fee += of
close_fee += cf close_fee += cf
if g - of - cf > 0: net = g - of - cf
if net > 0:
wins += 1 wins += 1
profit_sum += net
elif net < 0:
loss_sum += net
return { return {
"count": total, "count": total,
"gross": gross, "gross": gross,
@@ -37,6 +43,8 @@ def _future_stats(records) -> dict:
"open_fee": open_fee, "open_fee": open_fee,
"close_fee": close_fee, "close_fee": close_fee,
"total_fee": open_fee + close_fee, "total_fee": open_fee + close_fee,
"profit_sum": profit_sum,
"loss_sum": loss_sum,
} }
@@ -46,6 +54,8 @@ def _option_stats(records) -> dict:
open_fee = 0.0 open_fee = 0.0
close_fee = 0.0 close_fee = 0.0
wins = 0 wins = 0
profit_sum = 0.0
loss_sum = 0.0
for t in records: for t in records:
mul = t.point_value mul = t.point_value
if t.direction == "sell": if t.direction == "sell":
@@ -57,8 +67,12 @@ def _option_stats(records) -> dict:
cf = t.close_fee or 0 cf = t.close_fee or 0
open_fee += of open_fee += of
close_fee += cf close_fee += cf
if g - of - cf > 0: net = g - of - cf
if net > 0:
wins += 1 wins += 1
profit_sum += net
elif net < 0:
loss_sum += net
return { return {
"count": total, "count": total,
"gross": gross, "gross": gross,
@@ -68,6 +82,8 @@ def _option_stats(records) -> dict:
"open_fee": open_fee, "open_fee": open_fee,
"close_fee": close_fee, "close_fee": close_fee,
"total_fee": open_fee + close_fee, "total_fee": open_fee + close_fee,
"profit_sum": profit_sum,
"loss_sum": loss_sum,
} }
@@ -77,6 +93,8 @@ def _dual_stats(records) -> dict:
open_fee = 0.0 open_fee = 0.0
close_fee = 0.0 close_fee = 0.0
wins = 0 wins = 0
profit_sum = 0.0
loss_sum = 0.0
for t in records: for t in records:
mul = t.point_value mul = t.point_value
call_g = (t.call_close_price - t.call_open_price) * mul call_g = (t.call_close_price - t.call_open_price) * mul
@@ -87,8 +105,12 @@ def _dual_stats(records) -> dict:
cf = (t.call_close_fee or 0) + (t.put_close_fee or 0) cf = (t.call_close_fee or 0) + (t.put_close_fee or 0)
open_fee += of open_fee += of
close_fee += cf close_fee += cf
if g - of - cf > 0: net = g - of - cf
if net > 0:
wins += 1 wins += 1
profit_sum += net
elif net < 0:
loss_sum += net
return { return {
"count": total, "count": total,
"gross": gross, "gross": gross,
@@ -98,6 +120,8 @@ def _dual_stats(records) -> dict:
"open_fee": open_fee, "open_fee": open_fee,
"close_fee": close_fee, "close_fee": close_fee,
"total_fee": open_fee + close_fee, "total_fee": open_fee + close_fee,
"profit_sum": profit_sum,
"loss_sum": loss_sum,
} }
@@ -131,6 +155,9 @@ def summary_page(request: Request, db: Session = Depends(get_db)):
total_fee = future_stats["total_fee"] + option_stats["total_fee"] + dual_stats["total_fee"] total_fee = future_stats["total_fee"] + option_stats["total_fee"] + dual_stats["total_fee"]
total_wins = future_stats["wins"] + option_stats["wins"] + dual_stats["wins"] total_wins = future_stats["wins"] + option_stats["wins"] + dual_stats["wins"]
total_win_rate = round(total_wins / total_count * 100, 1) if total_count > 0 else 0 total_win_rate = round(total_wins / total_count * 100, 1) if total_count > 0 else 0
total_profit = future_stats["profit_sum"] + option_stats["profit_sum"] + dual_stats["profit_sum"]
total_loss = future_stats["loss_sum"] + option_stats["loss_sum"] + dual_stats["loss_sum"]
profit_ratio = round(total_profit / abs(total_loss), 2) if total_loss != 0 else 0
template = request.app.state.templates.get_template("summary.html") template = request.app.state.templates.get_template("summary.html")
return HTMLResponse( return HTMLResponse(
@@ -143,6 +170,9 @@ def summary_page(request: Request, db: Session = Depends(get_db)):
total_wins=total_wins, total_wins=total_wins,
total_win_rate=total_win_rate, total_win_rate=total_win_rate,
total_fee=total_fee, total_fee=total_fee,
total_profit=total_profit,
total_loss=total_loss,
profit_ratio=profit_ratio,
future_stats=future_stats, future_stats=future_stats,
future_trades=future_trades, future_trades=future_trades,
option_stats=option_stats, option_stats=option_stats,
+6
View File
@@ -52,6 +52,12 @@
{{ total_win_rate }}% {{ total_win_rate }}%
</div> </div>
</div> </div>
<div class="stat-card">
<div class="label">盈亏比</div>
<div class="value" style="{% if profit_ratio >= 1 %}color:var(--danger-fg);{% else %}color:var(--success-fg);{% endif %}">
{{ "%.2f"|format(profit_ratio) }}
</div>
</div>
<div class="stat-card"> <div class="stat-card">
<div class="label">净利润</div> <div class="label">净利润</div>
<div class="value" style="{% if net_pnl > 0 %}color:var(--danger-fg);{% elif net_pnl < 0 %}color:var(--success-fg);{% endif %}"> <div class="value" style="{% if net_pnl > 0 %}color:var(--danger-fg);{% elif net_pnl < 0 %}color:var(--success-fg);{% endif %}">