From 322ab39521ab3b2717913b986caef09a3c8a3de3 Mon Sep 17 00:00:00 2001 From: Richard Holzeis Date: Tue, 19 Sep 2023 13:53:17 +0200 Subject: [PATCH] fix: Do not rollover an expired position We need to provide the current timestamp instead of the position expiry, as it would have been otherwise never eligible for rollover. --- coordinator/src/node/rollover.rs | 4 +++- coordinator/src/position/models.rs | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/coordinator/src/node/rollover.rs b/coordinator/src/node/rollover.rs index 42d1b2415..63a27a3ea 100644 --- a/coordinator/src/node/rollover.rs +++ b/coordinator/src/node/rollover.rs @@ -78,7 +78,9 @@ async fn check_if_eligible_for_rollover( if let Some(position) = positions::Position::get_open_position_by_trader(conn, trader_id.to_string())? { - if coordinator_commons::is_in_rollover_weekend(position.expiry_timestamp) { + if coordinator_commons::is_in_rollover_weekend(OffsetDateTime::now_utc()) + && !position.is_expired() + { let next_expiry = coordinator_commons::calculate_next_expiry(OffsetDateTime::now_utc()); if position.expiry_timestamp == next_expiry { tracing::trace!(%trader_id, position_id=position.id, "Position has already been rolled over"); diff --git a/coordinator/src/position/models.rs b/coordinator/src/position/models.rs index 5b0750500..2e9ede8ee 100644 --- a/coordinator/src/position/models.rs +++ b/coordinator/src/position/models.rs @@ -74,6 +74,11 @@ pub struct Position { } impl Position { + // Returns true if the position is expired + pub fn is_expired(&self) -> bool { + OffsetDateTime::now_utc() >= self.expiry_timestamp + } + /// Calculates the profit and loss for the coordinator in satoshis pub fn calculate_coordinator_pnl(&self, quote: Quote) -> Result { let closing_price = match self.closing_price {