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