use serde::{Serialize, Deserialize};
use crate::live::state::PositionSnapshot;
use crate::live::meta::TradingMeta;
/// ======================================================
/// RiskLevel — типы рыночных угроз
/// ======================================================
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum RiskLevel {
None, // всё ок
HighDelta, // дельта начинает разбегаться
HighLeverage, // слишком много маржи
FastMove, // резкое движение против позиции
}
/// ======================================================
/// RiskReport — пакет данных для стратегий
/// ======================================================
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RiskReport {
pub level: RiskLevel,
pub delta: f64,
pub unrealized: f64,
pub price_change: f64,
}
impl RiskReport {
pub fn none() -> Self {
Self {
level: RiskLevel::None,
delta: 0.0,
unrealized: 0.0,
price_change: 0.0,
}
}
}
/// ======================================================
/// risk_check() — основной анализатор
/// ======================================================
///
/// ⚠ ВАЖНО:
/// Никаких direct-операций тут нет.
/// Только сигнализация.
/// ======================================================
pub fn risk_check(pos: &PositionSnapshot, meta_prev: &TradingMeta, meta_now: &TradingMeta) -> RiskReport {
// Если нет позиций — нет рисков.
if pos.long_qty == 0.0 && pos.short_qty == 0.0 {
return RiskReport::none();
}
let delta = pos.delta();
let unreal = pos.unrealized();
// Резкое движение
let move_abs = (meta_now.price - meta_prev.price).abs();
let move_pct = if meta_prev.price > 0.0 {
move_abs / meta_prev.price
} else {
0.0
};
// Простой риск алгоритм (можно расширять в любой момент)
if delta.abs() > 1.0 {
return RiskReport {
level: RiskLevel::HighDelta,
delta,
unrealized: unreal,
price_change: move_pct,
};
}
if move_pct > 0.015 {
return RiskReport {
level: RiskLevel::FastMove,
delta,
unrealized: unreal,
price_change: move_pct,
};
}
// Мягкий вариант: всё ок
RiskReport {
level: RiskLevel::None,
delta,
unrealized: unreal,
price_change: move_pct,
}
}