← Назад к документации
risk
Исходный код Rust - Trading AI
📄 Rust
📦 Модуль
🔧 Исходный код
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,
    }
}