use std::time::Duration;
use chrono::{Utc, FixedOffset};
use tokio::time::sleep;
use hyperliquid_backtest::prelude::*;
use hyperliquid_backtest::real_time_monitoring::{
MonitoringServer, MonitoringClient, MonitoringManager,
MonitoringMessage, TradeExecutionUpdate, ConnectionStatus
};
use hyperliquid_backtest::live_trading::{LiveTradingEngine, AlertLevel};
use hyperliquid_backtest::unified_data::{OrderRequest, OrderResult, OrderSide, OrderType, OrderStatus, TimeInForce};
use hyperliquid_backtest::trading_mode::TradingMode;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
init_logger();
println!("Starting real-time monitoring example...");
let port = 8080;
let mut server = MonitoringServer::new(port);
server.start().await.expect("Failed to start monitoring server");
println!("Monitoring server started on port {}", port);
let mut manager = MonitoringManager::new(TradingMode::LiveTrade);
manager.add_alert_handler(|alert| {
println!("Alert received: {} - {}", alert.level, alert.message);
});
manager.add_trade_execution_handler(|execution| {
println!("Trade execution: {} - {} - {:?}", execution.order_id, execution.symbol, execution.status);
});
println!("Sending alerts...");
manager.send_alert(AlertLevel::Info, "System started", None, None)?;
manager.send_alert(AlertLevel::Warning, "High volatility detected", Some("BTC"), None)?;
println!("Recording trade executions...");
let order_request = OrderRequest {
symbol: "BTC".to_string(),
side: OrderSide::Buy,
order_type: OrderType::Market,
quantity: 1.0,
price: None,
reduce_only: false,
time_in_force: TimeInForce::GoodTilCancelled,
};
let order_result = OrderResult {
order_id: "order1".to_string(),
status: OrderStatus::Filled,
filled_quantity: 1.0,
average_price: Some(50000.0),
fees: Some(25.0),
timestamp: Utc::now().with_timezone(&FixedOffset::east(0)),
error: None,
};
manager.record_trade_execution(&order_request, &order_result, 120)?;
println!("Updating performance metrics...");
manager.update_performance_metrics(
10000.0, 100.0, 500.0, 0.6, 1.5, 5.0, 2 )?;
println!("Updating connection metrics...");
manager.update_connection_metrics(
99.5, 2, 150.0, 50.0, 25.0 )?;
println!("Updating dashboard...");
let dashboard_data = create_sample_dashboard_data();
manager.update_dashboard(dashboard_data)?;
println!("Server running. Press Ctrl+C to stop...");
sleep(Duration::from_secs(60)).await;
println!("Stopping server...");
server.stop().await?;
println!("Example completed successfully!");
Ok(())
}
fn create_sample_dashboard_data() -> hyperliquid_backtest::mode_reporting::MonitoringDashboardData {
use hyperliquid_backtest::mode_reporting::*;
use std::collections::HashMap;
let now = Utc::now().with_timezone(&FixedOffset::east(0));
let mut risk_allocation = HashMap::new();
risk_allocation.insert("BTC".to_string(), 60.0);
risk_allocation.insert("ETH".to_string(), 40.0);
let mut recent_alerts = Vec::new();
recent_alerts.push(AlertEntry {
level: "Info".to_string(),
message: "System started".to_string(),
timestamp: now - chrono::Duration::minutes(5),
symbol: None,
order_id: None,
});
recent_alerts.push(AlertEntry {
level: "Warning".to_string(),
message: "High volatility detected".to_string(),
timestamp: now - chrono::Duration::minutes(2),
symbol: Some("BTC".to_string()),
order_id: None,
});
MonitoringDashboardData {
timestamp: now,
account_summary: AccountSummary {
total_equity: 10000.0,
available_balance: 9000.0,
margin_used: 1000.0,
margin_usage_pct: 10.0,
current_leverage: 1.0,
unrealized_pnl: 100.0,
realized_pnl: 200.0,
funding_pnl: 50.0,
},
position_summary: PositionSummary {
open_positions: 2,
long_positions: 1,
short_positions: 1,
total_position_value: 10000.0,
largest_position: PositionSnapshot {
symbol: "BTC".to_string(),
size: 1.0,
entry_price: 50000.0,
current_price: 51000.0,
unrealized_pnl: 1000.0,
unrealized_pnl_pct: 2.0,
funding_pnl: 50.0,
liquidation_price: None,
side: OrderSide::Buy,
position_age_hours: 24.0,
},
most_profitable: PositionSnapshot {
symbol: "BTC".to_string(),
size: 1.0,
entry_price: 50000.0,
current_price: 51000.0,
unrealized_pnl: 1000.0,
unrealized_pnl_pct: 2.0,
funding_pnl: 50.0,
liquidation_price: None,
side: OrderSide::Buy,
position_age_hours: 24.0,
},
least_profitable: PositionSnapshot {
symbol: "ETH".to_string(),
size: -2.0,
entry_price: 3000.0,
current_price: 3050.0,
unrealized_pnl: -100.0,
unrealized_pnl_pct: -1.67,
funding_pnl: -10.0,
liquidation_price: None,
side: OrderSide::Sell,
position_age_hours: 12.0,
},
},
order_summary: OrderSummary {
active_orders: 1,
filled_today: 5,
cancelled_today: 2,
rejected_today: 0,
success_rate: 0.8,
avg_fill_time_ms: 120.0,
volume_today: 50000.0,
fees_today: 25.0,
},
risk_summary: RiskSummary {
current_drawdown_pct: 2.0,
max_drawdown_pct: 5.0,
value_at_risk: 500.0,
daily_volatility: 1.5,
risk_allocation,
risk_warnings: Vec::new(),
circuit_breaker_status: "Normal".to_string(),
},
system_status: SystemStatus {
connection_status: "Connected".to_string(),
api_latency_ms: 50.0,
ws_latency_ms: 25.0,
uptime_hours: 24.0,
memory_usage_mb: 100.0,
cpu_usage_pct: 5.0,
last_error: None,
last_error_time: None,
},
recent_alerts,
performance: PerformanceSnapshot {
daily_pnl: 100.0,
daily_pnl_pct: 1.0,
weekly_pnl: 500.0,
weekly_pnl_pct: 5.0,
monthly_pnl: 2000.0,
monthly_pnl_pct: 20.0,
sharpe_ratio: 1.5,
sortino_ratio: 2.0,
win_rate: 0.6,
avg_win: 200.0,
avg_loss: -100.0,
profit_factor: 2.0,
},
}
}