use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnalysisReport {
pub pair: String,
pub period_days: u64,
pub current_price: Decimal,
pub high_price: Decimal,
pub low_price: Decimal,
pub avg_price: Decimal,
pub volatility_daily: Decimal,
pub volatility_annual: Decimal,
pub recommended_lower: Decimal,
pub recommended_upper: Decimal,
pub recommended_width: Decimal,
pub estimated_time_in_range: Decimal,
pub data_points: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BacktestReport {
pub pair: String,
pub period_days: u64,
pub entry_price: Decimal,
pub exit_price: Decimal,
pub range_lower: Decimal,
pub range_upper: Decimal,
pub initial_capital: Decimal,
pub final_value: Decimal,
pub total_return: Decimal,
pub fee_earnings: Decimal,
pub impermanent_loss: Decimal,
pub vs_hodl: Decimal,
pub time_in_range: Decimal,
pub max_drawdown: Decimal,
pub rebalance_count: u32,
pub total_tx_costs: Decimal,
pub strategy: String,
pub sharpe_ratio: Option<Decimal>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationReport {
pub pair: String,
pub current_price: Decimal,
pub volatility: Decimal,
pub capital: Decimal,
pub objective: String,
pub candidates: Vec<RangeCandidate>,
pub strategy_recommendations: Vec<crate::commands::optimize::StrategyRecommendation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RangeCandidate {
pub rank: usize,
pub range_width_pct: Decimal,
pub lower_price: Decimal,
pub upper_price: Decimal,
pub expected_fees: Decimal,
pub expected_il: Decimal,
pub expected_pnl: Decimal,
pub time_in_range: Decimal,
pub score: Decimal,
}