use crate::{
engine::state::position::{PositionExited, calculate_pnl_return},
statistic::summary::dataset::DataSetSummary,
};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, PartialOrd, Default, Deserialize, Serialize)]
pub struct PnLReturns {
pub pnl_raw: Decimal,
pub total: DataSetSummary,
pub losses: DataSetSummary,
}
impl PnLReturns {
pub fn update<AssetKey, InstrumentKey>(
&mut self,
position: &PositionExited<AssetKey, InstrumentKey>,
) {
self.pnl_raw += position.pnl_realised;
let pnl_return = calculate_pnl_return(
position.pnl_realised,
position.price_entry_average,
position.quantity_abs_max,
);
self.total.update(pnl_return);
if pnl_return.is_sign_negative() {
self.losses.update(pnl_return)
}
}
}