ig_client/utils/
finance.rs1use crate::presentation::account::Position;
6use crate::presentation::order::Direction;
7
8#[must_use]
19pub fn calculate_pnl(position: &Position) -> Option<f64> {
20 let (bid, offer) = (position.market.bid, position.market.offer);
21
22 let current_price = match position.position.direction {
24 Direction::Buy => bid?,
25 Direction::Sell => offer?,
26 };
27
28 let price_diff = match position.position.direction {
30 Direction::Buy => current_price - position.position.level,
31 Direction::Sell => position.position.level - current_price,
32 };
33
34 Some(price_diff * position.position.size)
36}
37
38#[must_use]
48pub fn calculate_percentage_return(position: &Position) -> Option<f64> {
49 let pnl = calculate_pnl(position)?;
50 let initial_value = position.position.level * position.position.size;
51
52 if initial_value == 0.0 {
54 return None;
55 }
56
57 Some((pnl / initial_value) * 100.0)
58}