diff --git a/flumine/markets/middleware.py b/flumine/markets/middleware.py index 73c86ed7..318fb73f 100644 --- a/flumine/markets/middleware.py +++ b/flumine/markets/middleware.py @@ -102,8 +102,8 @@ def _process_runner_removal( ): # todo place market for match in order.simulated.matched: - match[1] = round( - match[1] * (1 - (removal_adjustment_factor / 100)), 2 + match[1] = self._calculate_reduction_factor( + match[1], removal_adjustment_factor ) _, order.simulated.average_price_matched = wap( order.simulated.matched @@ -115,6 +115,11 @@ def _process_runner_removal( extra=order.info, ) + @staticmethod + def _calculate_reduction_factor(price: float, adjustment_factor: float) -> float: + price_adjusted = round(price * (1 - (adjustment_factor / 100)), 2) + return max(price_adjusted, 1.01) # min: 1.01 + @staticmethod def _process_simulated_orders(market, market_analytics: dict) -> None: for order in market.blotter.live_orders: diff --git a/tests/test_middleware.py b/tests/test_middleware.py index bec8d606..4a57d5bf 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -135,6 +135,14 @@ def test__process_runner_removal_none(self): self.middleware._process_runner_removal(mock_market, 12345, 0, None) self.assertEqual(mock_order.simulated.matched, [[123, 8.6, 10]]) + def test__calculate_reduction_factor(self): + self.assertEqual(self.middleware._calculate_reduction_factor(10, 10), 9) + self.assertEqual(self.middleware._calculate_reduction_factor(1000, 0), 1000) + self.assertEqual(self.middleware._calculate_reduction_factor(1000, 5), 950) + self.assertEqual(self.middleware._calculate_reduction_factor(3.2, 75.18), 1.01) + self.assertEqual(self.middleware._calculate_reduction_factor(10, 75.18), 2.48) + self.assertEqual(self.middleware._calculate_reduction_factor(1.01, 75.18), 1.01) + def test__process_simulated_orders(self): mock_market_book = mock.Mock() mock_order = mock.Mock()