Skip to main content

hyper_agent_core/services/
dashboard.rs

1use 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}