Add close price column to trade records for overnight position PnL review.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1280,34 +1280,83 @@ def trades():
|
||||
def update_trade(tid):
|
||||
d = request.form
|
||||
conn = get_db()
|
||||
row = conn.execute("SELECT * FROM trade_logs WHERE id=?", (tid,)).fetchone()
|
||||
if not row:
|
||||
conn.close()
|
||||
flash("记录不存在")
|
||||
return redirect(url_for("records"))
|
||||
row = dict(row)
|
||||
entry = float(d.get("entry_price") or 0)
|
||||
close_px = float(d.get("close_price") or 0)
|
||||
lots = float(d.get("lots") or 0)
|
||||
sl_raw = d.get("stop_loss")
|
||||
tp_raw = d.get("take_profit")
|
||||
stop_loss = float(sl_raw) if sl_raw not in (None, "") else None
|
||||
take_profit = float(tp_raw) if tp_raw not in (None, "") else None
|
||||
open_time = (d.get("open_time") or row.get("open_time") or "").strip()
|
||||
close_time = (d.get("close_time") or row.get("close_time") or "").strip()
|
||||
direction = (d.get("direction") or row.get("direction") or "long").strip()
|
||||
|
||||
from trade_log_lib import recalc_trade_log_pnl, refresh_trade_log_equity_chain, _read_initial_capital
|
||||
from trading_context import get_trading_mode
|
||||
|
||||
pnl = float(row.get("pnl") or 0)
|
||||
fee = float(row.get("fee") or 0)
|
||||
pnl_net = float(row.get("pnl_net") or 0)
|
||||
old_entry = float(row.get("entry_price") or 0)
|
||||
old_close = float(row.get("close_price") or 0)
|
||||
old_lots = float(row.get("lots") or 0)
|
||||
prices_changed = (
|
||||
abs(entry - old_entry) > 0.0001
|
||||
or abs(close_px - old_close) > 0.0001
|
||||
or abs(lots - old_lots) > 0.0001
|
||||
)
|
||||
if prices_changed and close_px > 0 and entry > 0 and lots > 0:
|
||||
calc = recalc_trade_log_pnl(
|
||||
symbol=row.get("symbol") or "",
|
||||
direction=direction,
|
||||
entry_price=entry,
|
||||
close_price=close_px,
|
||||
lots=lots,
|
||||
stop_loss=stop_loss,
|
||||
take_profit=take_profit,
|
||||
open_time=open_time,
|
||||
close_time=close_time,
|
||||
trading_mode=get_trading_mode(get_setting),
|
||||
)
|
||||
pnl = calc["pnl"]
|
||||
fee = calc["fee"]
|
||||
pnl_net = calc["pnl_net"]
|
||||
|
||||
conn.execute(
|
||||
"""UPDATE trade_logs SET
|
||||
symbol_name=?, monitor_type=?, direction=?,
|
||||
entry_price=?, stop_loss=?, take_profit=?, close_price=?,
|
||||
lots=?, margin=?, holding_minutes=?, open_time=?, close_time=?,
|
||||
pnl=?, result=?, verified=1
|
||||
pnl=?, fee=?, pnl_net=?, result=?, verified=1
|
||||
WHERE id=?""",
|
||||
(
|
||||
d.get("symbol_name", "").strip(),
|
||||
d.get("monitor_type", "").strip(),
|
||||
d.get("direction", "").strip(),
|
||||
float(d.get("entry_price") or 0),
|
||||
float(d.get("stop_loss") or 0),
|
||||
float(d.get("take_profit") or 0),
|
||||
float(d.get("close_price") or 0),
|
||||
float(d.get("lots") or 0),
|
||||
direction,
|
||||
entry,
|
||||
stop_loss,
|
||||
take_profit,
|
||||
close_px,
|
||||
lots,
|
||||
float(d.get("margin") or 0),
|
||||
int(d.get("holding_minutes") or 0),
|
||||
d.get("open_time", "").strip(),
|
||||
d.get("close_time", "").strip(),
|
||||
float(d.get("pnl") or 0),
|
||||
open_time,
|
||||
close_time,
|
||||
pnl,
|
||||
fee,
|
||||
pnl_net,
|
||||
d.get("result", "").strip(),
|
||||
tid,
|
||||
),
|
||||
)
|
||||
try:
|
||||
cap = float(get_setting("live_capital", "0") or 0)
|
||||
refresh_trade_log_equity_chain(conn, cap if cap > 0 else None)
|
||||
refresh_trade_log_equity_chain(conn, _read_initial_capital(conn))
|
||||
except Exception as exc:
|
||||
app.logger.debug("equity chain refresh after trade edit: %s", exc)
|
||||
conn.commit()
|
||||
|
||||
Reference in New Issue
Block a user