use crate::greeks::GreeksSnapshot;
use crate::model::Position;
use chrono::{DateTime, NaiveDateTime, Utc};
use positive::Positive;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TradeStatistics {
pub number_of_trades: usize,
pub winners: usize,
pub losers: usize,
pub break_even: usize,
pub average_trade_return: Decimal,
pub median_trade_return: Decimal,
pub largest_win: Option<Decimal>,
pub largest_loss: Option<Decimal>,
pub average_holding_period: Positive,
pub median_holding_period: Positive,
pub min_holding_period: Positive,
pub max_holding_period: Positive,
pub long_trades: usize,
pub short_trades: usize,
pub call_trades: usize,
pub put_trades: usize,
pub spread_trades: usize,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DrawdownAnalysis {
pub max_drawdown: Decimal,
pub max_drawdown_duration: Positive,
pub recovery_duration: Option<Positive>,
pub time_to_max_drawdown: Positive,
pub drawdowns: Vec<DrawdownEvent>,
pub avg_drawdown: Decimal,
pub avg_recovery_time: Option<Positive>,
pub total_underwater_days: Positive,
pub underwater_percentage: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DrawdownEvent {
pub start_date: NaiveDateTime,
pub bottom_date: NaiveDateTime,
pub recovery_date: Option<NaiveDateTime>,
pub magnitude: Decimal,
pub duration: Positive,
pub recovery_duration: Option<Positive>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CapitalUtilization {
pub max_capital_used: Decimal,
pub avg_capital_used: Decimal,
pub capital_efficiency: Decimal, pub total_margin_used: Decimal,
pub max_margin_used: Decimal,
pub avg_margin_used: Decimal,
pub total_premium_paid: Decimal,
pub total_premium_received: Decimal,
pub net_premium: Decimal,
pub max_position_size: Decimal, pub avg_position_size: Decimal,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TimeSeriesData {
pub timestamps: Vec<DateTime<Utc>>,
pub equity_curve: Vec<Decimal>,
pub drawdown_curve: Vec<Decimal>,
pub margin_usage: Vec<Decimal>,
pub position_count: Vec<usize>,
pub delta_exposure: Option<Vec<Decimal>>,
pub gamma_exposure: Option<Vec<Decimal>>,
pub theta_exposure: Option<Vec<Decimal>>,
pub vega_exposure: Option<Vec<Decimal>>,
pub vanna_exposure: Option<Vec<Decimal>>,
pub vomma_exposure: Option<Vec<Decimal>>,
pub veta_exposure: Option<Vec<Decimal>>,
pub charm_exposure: Option<Vec<Decimal>>,
pub color_exposure: Option<Vec<Decimal>>,
pub custom_series: HashMap<String, Vec<Decimal>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TradeRecord {
pub id: Uuid,
pub entry_date: DateTime<Utc>,
pub exit_date: Option<DateTime<Utc>>,
pub duration: Option<Positive>,
pub strategy: Option<Uuid>,
pub position: Position,
pub exit_price: Option<Decimal>,
pub slippage: Option<Decimal>,
pub profit_loss: Option<Decimal>,
pub return_percentage: Option<Decimal>,
pub margin_required: Option<Decimal>,
pub exit_reason: Option<ExitReason>,
pub notes: Option<String>,
pub entry_greeks: Option<GreeksSnapshot>,
pub exit_greeks: Option<GreeksSnapshot>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ExitReason {
TargetReached,
StopLoss,
Expiration,
RollOver,
ManualClose,
MarginCall,
Other(String),
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VolatilityData {
pub implied_volatility_used: bool,
pub avg_iv_traded: Option<Decimal>,
pub iv_percentile_traded: Option<Decimal>,
pub iv_rank_traded: Option<Decimal>,
}