use crate::presentation::account::Position;
use crate::presentation::order::Direction;
#[must_use]
pub fn calculate_pnl(position: &Position) -> Option<f64> {
let (bid, offer) = (position.market.bid, position.market.offer);
let current_price = match position.position.direction {
Direction::Buy => bid?,
Direction::Sell => offer?,
};
let price_diff = match position.position.direction {
Direction::Buy => current_price - position.position.level,
Direction::Sell => position.position.level - current_price,
};
Some(price_diff * position.position.size)
}
#[must_use]
pub fn calculate_percentage_return(position: &Position) -> Option<f64> {
let pnl = calculate_pnl(position)?;
let initial_value = position.position.level * position.position.size;
if initial_value == 0.0 {
return None;
}
Some((pnl / initial_value) * 100.0)
}