hyper_agent_core/services/
dashboard.rs1use crate::position_manager::PositionManager;
2use serde::Serialize;
3
4#[derive(Serialize)]
5pub struct DashboardStats {
6 pub engines_running: u32,
7 pub open_positions: u32,
8 pub total_pnl: f64,
9}
10
11pub async fn get_stats(
12 pm: &PositionManager,
13 engines_running: u32,
14) -> Result<DashboardStats, String> {
15 let open = pm.list_open().await.map_err(|e| e.to_string())?;
16 let closed = pm.list_closed(1000).await.map_err(|e| e.to_string())?;
17 let total_pnl: f64 = closed.iter().filter_map(|p| p.pnl).sum();
18
19 Ok(DashboardStats {
20 engines_running,
21 open_positions: open.len() as u32,
22 total_pnl,
23 })
24}
25
26pub async fn get_pnl_history(pm: &PositionManager) -> Result<Vec<(String, f64)>, String> {
27 let closed = pm.list_closed(1000).await.map_err(|e| e.to_string())?;
28 let mut cumulative = 0.0;
29 let points: Vec<(String, f64)> = closed
30 .iter()
31 .filter(|p| p.closed_at.is_some())
32 .map(|p| {
33 cumulative += p.pnl.unwrap_or(0.0);
34 (p.closed_at.clone().unwrap_or_default(), cumulative)
35 })
36 .collect();
37 Ok(points)
38}