fix: Improve trade P/L calculation in plot_trade_history function
This commit is contained in:
parent
b1240cd582
commit
a6746ff267
@ -87,29 +87,34 @@ def plot_trade_history(trades):
|
|||||||
cumulative_pnl = 0
|
cumulative_pnl = 0
|
||||||
|
|
||||||
for trade in trades:
|
for trade in trades:
|
||||||
# Only include trades with both entry and exit prices (closed trades)
|
|
||||||
if (not trade.get('exit_price') or not trade.get('entry_price') or
|
|
||||||
not isinstance(trade['exit_price'], (int, float)) or
|
|
||||||
not isinstance(trade['entry_price'], (int, float))):
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Convert prices to float if they're strings and are numeric
|
# For sell orders
|
||||||
exit_price = float(trade['exit_price'])
|
if trade.get('direction') == 'sell' or trade.get('exit_price'):
|
||||||
entry_price = float(trade['entry_price'])
|
price = float(trade.get('exit_price') or trade.get('entry_price'))
|
||||||
shares = float(trade['shares'])
|
date = trade.get('exit_date') or trade.get('entry_date')
|
||||||
|
shares = float(trade['shares'])
|
||||||
# Calculate realized P/L for this trade
|
|
||||||
trade_pnl = (exit_price - entry_price) * shares
|
|
||||||
cumulative_pnl += trade_pnl
|
|
||||||
|
|
||||||
# Use exit_date for realized P/L
|
|
||||||
if trade.get('exit_date'):
|
|
||||||
dates.append(trade['exit_date'])
|
|
||||||
pnl.append(cumulative_pnl)
|
|
||||||
|
|
||||||
except (ValueError, TypeError):
|
# Find matching buy order to calculate P/L
|
||||||
# Skip trades where conversion to float fails
|
position_id = trade['position_id']
|
||||||
|
buy_trades = [t for t in trades
|
||||||
|
if t['position_id'] == position_id and
|
||||||
|
(t.get('direction', '').lower() != 'sell' and not t.get('exit_price'))]
|
||||||
|
|
||||||
|
if buy_trades:
|
||||||
|
# Use average entry price from buy trades
|
||||||
|
total_cost = sum(float(t['entry_price']) * float(t['shares']) for t in buy_trades)
|
||||||
|
total_shares = sum(float(t['shares']) for t in buy_trades)
|
||||||
|
avg_entry_price = total_cost / total_shares if total_shares > 0 else 0
|
||||||
|
|
||||||
|
# Calculate P/L
|
||||||
|
trade_pnl = (price - avg_entry_price) * shares
|
||||||
|
cumulative_pnl += trade_pnl
|
||||||
|
|
||||||
|
dates.append(date)
|
||||||
|
pnl.append(cumulative_pnl)
|
||||||
|
|
||||||
|
except (ValueError, TypeError) as e:
|
||||||
|
print(f"Error processing trade for P/L chart: {e}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not dates:
|
if not dates:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user