From 928c1e9882501b28bb917251708557061cf0d476 Mon Sep 17 00:00:00 2001 From: Lucas Soriano del Pino Date: Tue, 26 Mar 2024 12:53:25 +1100 Subject: [PATCH] fix(coordinator): Calculate position PNL correctly We were using the closing trade trader direction instead of the position direction. --- coordinator/src/db/positions.rs | 4 ++-- coordinator/src/dlc_protocol.rs | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/coordinator/src/db/positions.rs b/coordinator/src/db/positions.rs index a323c4414..eed0fa863 100644 --- a/coordinator/src/db/positions.rs +++ b/coordinator/src/db/positions.rs @@ -266,13 +266,13 @@ impl Position { pub fn set_position_to_closed_with_pnl( conn: &mut PgConnection, id: i32, - pnl: i64, + trader_realized_pnl_sat: i64, ) -> QueryResult { let position: Position = diesel::update(positions::table) .filter(positions::id.eq(id)) .set(( positions::position_state.eq(PositionState::Closed), - positions::trader_realized_pnl_sat.eq(Some(pnl)), + positions::trader_realized_pnl_sat.eq(Some(trader_realized_pnl_sat)), positions::update_timestamp.eq(OffsetDateTime::now_utc()), )) .get_result(conn)?; diff --git a/coordinator/src/dlc_protocol.rs b/coordinator/src/dlc_protocol.rs index 7998d4585..4e514eb9c 100644 --- a/coordinator/src/dlc_protocol.rs +++ b/coordinator/src/dlc_protocol.rs @@ -355,8 +355,10 @@ impl DlcProtocolExecutor { "Finalize closing position", ); - let pnl = { - let (initial_margin_long, initial_margin_short) = match trade_params.direction { + let trader_realized_pnl_sat = { + let trader_position_direction = position.trader_direction; + + let (initial_margin_long, initial_margin_short) = match trader_position_direction { Direction::Long => (position.trader_margin, position.coordinator_margin), Direction::Short => (position.coordinator_margin, position.trader_margin), }; @@ -365,7 +367,7 @@ impl DlcProtocolExecutor { Decimal::from_f32(position.average_entry_price).expect("to fit into decimal"), Decimal::from_f32(trade_params.average_price).expect("to fit into decimal"), trade_params.quantity, - trade_params.direction, + trader_position_direction, initial_margin_long as u64, initial_margin_short as u64, ) { @@ -377,7 +379,11 @@ impl DlcProtocolExecutor { } }; - db::positions::Position::set_position_to_closed_with_pnl(conn, position.id, pnl)?; + db::positions::Position::set_position_to_closed_with_pnl( + conn, + position.id, + trader_realized_pnl_sat, + )?; let coordinator_margin = calculate_margin( Decimal::try_from(trade_params.average_price).expect("to fit into decimal"),