|
@@ -160,6 +160,26 @@ class AggregationManager:
|
|
))
|
|
))
|
|
logger.info(f"Successfully aggregated closed trade for {token}. P&L: {realized_pnl}, ROE: {current_roe:.2f}%")
|
|
logger.info(f"Successfully aggregated closed trade for {token}. P&L: {realized_pnl}, ROE: {current_roe:.2f}%")
|
|
|
|
|
|
|
|
+ # 4. Update daily aggregated stats
|
|
|
|
+ try:
|
|
|
|
+ if closed_at:
|
|
|
|
+ date_str = datetime.fromisoformat(closed_at).strftime('%Y-%m-%d')
|
|
|
|
+ daily_upsert_query = """
|
|
|
|
+ INSERT INTO daily_aggregated_stats (date, token, realized_pnl, completed_cycles, entry_volume, exit_volume)
|
|
|
|
+ VALUES (?, ?, ?, 1, ?, ?)
|
|
|
|
+ ON CONFLICT(date, token) DO UPDATE SET
|
|
|
|
+ realized_pnl = realized_pnl + excluded.realized_pnl,
|
|
|
|
+ completed_cycles = completed_cycles + 1,
|
|
|
|
+ entry_volume = entry_volume + excluded.entry_volume,
|
|
|
|
+ exit_volume = exit_volume + excluded.exit_volume
|
|
|
|
+ """
|
|
|
|
+ self.db._execute_query(daily_upsert_query, (
|
|
|
|
+ date_str, token, realized_pnl, entry_value, exit_value
|
|
|
|
+ ))
|
|
|
|
+ logger.info(f"Successfully aggregated daily stats for {token} on {date_str}.")
|
|
|
|
+ except Exception as e:
|
|
|
|
+ logger.error(f"Error migrating trade to daily aggregated stats for token {token}: {e}", exc_info=True)
|
|
|
|
+
|
|
except Exception as e:
|
|
except Exception as e:
|
|
logger.error(f"Error migrating closed position to aggregated stats for token {token}: {e}", exc_info=True)
|
|
logger.error(f"Error migrating closed position to aggregated stats for token {token}: {e}", exc_info=True)
|
|
raise
|
|
raise
|
|
@@ -239,7 +259,7 @@ class AggregationManager:
|
|
date_formatted = target_date.strftime('%m/%d')
|
|
date_formatted = target_date.strftime('%m/%d')
|
|
|
|
|
|
day_aggregated_data = self.db._fetch_query(
|
|
day_aggregated_data = self.db._fetch_query(
|
|
- "SELECT SUM(realized_pnl) as pnl, SUM(completed_cycles) as trades, SUM(exit_volume) as volume FROM daily_aggregated_stats WHERE date = ?",
|
|
|
|
|
|
+ "SELECT SUM(realized_pnl) as pnl, SUM(completed_cycles) as trades, SUM(exit_volume) as volume, SUM(entry_volume) as entry_volume FROM daily_aggregated_stats WHERE date = ?",
|
|
(date_str,)
|
|
(date_str,)
|
|
)
|
|
)
|
|
|
|
|
|
@@ -248,7 +268,9 @@ class AggregationManager:
|
|
stats_for_day = day_aggregated_data[0]
|
|
stats_for_day = day_aggregated_data[0]
|
|
pnl = stats_for_day.get('pnl', 0.0) or 0.0
|
|
pnl = stats_for_day.get('pnl', 0.0) or 0.0
|
|
volume = stats_for_day.get('volume', 0.0) or 0.0
|
|
volume = stats_for_day.get('volume', 0.0) or 0.0
|
|
|
|
+ entry_volume = stats_for_day.get('entry_volume', 0.0) or 0.0
|
|
stats_for_day['pnl_pct'] = (pnl / volume * 100) if volume > 0 else 0.0
|
|
stats_for_day['pnl_pct'] = (pnl / volume * 100) if volume > 0 else 0.0
|
|
|
|
+ stats_for_day['roe'] = (pnl / entry_volume * 100) if entry_volume > 0 else 0.0
|
|
stats_for_day['trades'] = int(stats_for_day.get('trades', 0) or 0)
|
|
stats_for_day['trades'] = int(stats_for_day.get('trades', 0) or 0)
|
|
|
|
|
|
if stats_for_day and stats_for_day['trades'] > 0:
|
|
if stats_for_day and stats_for_day['trades'] > 0:
|
|
@@ -259,7 +281,7 @@ class AggregationManager:
|
|
else:
|
|
else:
|
|
daily_stats_list.append({
|
|
daily_stats_list.append({
|
|
'date': date_str, 'date_formatted': date_formatted, 'has_trades': False,
|
|
'date': date_str, 'date_formatted': date_formatted, 'has_trades': False,
|
|
- 'trades': 0, 'pnl': 0.0, 'volume': 0.0, 'pnl_pct': 0.0
|
|
|
|
|
|
+ 'trades': 0, 'pnl': 0.0, 'volume': 0.0, 'pnl_pct': 0.0, 'roe': 0.0
|
|
})
|
|
})
|
|
return daily_stats_list
|
|
return daily_stats_list
|
|
|
|
|