nautilus_analysis/python/statistics/
long_ratio.rs1use std::collections::BTreeMap;
17
18#[allow(unused_imports)] use nautilus_core::UnixNanos;
20use nautilus_model::enums::OrderSide;
21use pyo3::prelude::*;
22
23use crate::{statistic::PortfolioStatistic, statistics::long_ratio::LongRatio};
24
25#[pymethods]
26impl LongRatio {
27 #[new]
28 #[pyo3(signature = (precision=None))]
29 fn py_new(precision: Option<usize>) -> Self {
30 Self::new(precision)
31 }
32
33 fn __repr__(&self) -> String {
34 self.to_string()
35 }
36
37 #[getter]
38 #[pyo3(name = "name")]
39 fn py_name(&self) -> String {
40 self.name()
41 }
42
43 #[pyo3(name = "calculate_from_positions")]
44 fn py_calculate_from_positions(
45 &mut self,
46 py: Python,
47 positions: Vec<Py<PyAny>>,
48 ) -> PyResult<Option<f64>> {
49 if positions.is_empty() {
50 return Ok(None);
51 }
52
53 let mut longs = 0;
56 for position in &positions {
57 let entry = position.getattr(py, "entry")?;
58 let entry_value: u8 = entry.extract(py)?;
59 if entry_value == OrderSide::Buy as u8 {
60 longs += 1;
61 }
62 }
63
64 let value = f64::from(longs) / positions.len() as f64;
65 let scale = 10f64.powi(self.precision as i32);
66 Ok(Some((value * scale).round() / scale))
67 }
68
69 #[pyo3(name = "calculate_from_realized_pnls")]
70 fn py_calculate_from_realized_pnls(&mut self, _realized_pnls: Vec<f64>) -> Option<f64> {
71 None
72 }
73
74 #[pyo3(name = "calculate_from_returns")]
75 #[allow(unused_variables)] fn py_calculate_from_returns(&mut self, _returns: BTreeMap<u64, f64>) -> Option<f64> {
77 None
78 }
79}