Skip to content

Commit

Permalink
wrong order state after multiple connection reset errors
Browse files Browse the repository at this point in the history
closes #464
  • Loading branch information
liampauling committed Jul 12, 2021
1 parent bb902c0 commit 119cd8d
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Release History
**Bug Fixes**

- #454 SP nr size adjustment (@jsphon)
- #464 wrong order state after multiple connection reset errors

1.19.6 (2021-07-09)
+++++++++++++++++++
Expand Down
6 changes: 6 additions & 0 deletions flumine/execution/betfairexecution.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,12 @@ def _execution_helper(
)
if order_package.retry():
self.handler(order_package)
else:
# reset orders
if order_package.package_type == OrderPackageType.PLACE:
order_package.reset_orders(complete=True)
else:
order_package.reset_orders()

self._return_http_session(http_session, err=True)
return
Expand Down
8 changes: 8 additions & 0 deletions flumine/order/orderpackage.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ def retry(self):
return True
return False

def reset_orders(self, complete: bool = False) -> None:
for order in self:
with order.trade:
if complete:
order.execution_complete()
else:
order.executable()

def calc_simulated_delay(self) -> float:
if self.client.execution.EXCHANGE == ExchangeType.SIMULATED:
if self.package_type == OrderPackageType.PLACE:
Expand Down
27 changes: 27 additions & 0 deletions tests/test_execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,33 @@ def test__execution_helper_error_no_retry(
mock_trading_function.assert_called_with(mock_order_package, mock_session)
mock__return_http_session.assert_called_with(mock_session, err=True)
mock_handler.put.assert_not_called()
mock_order_package.reset_orders.assert_called_with()

@mock.patch("flumine.execution.betfairexecution.BetfairExecution.handler")
@mock.patch(
"flumine.execution.betfairexecution.BetfairExecution._return_http_session"
)
def test__execution_helper_error_no_retry_place(
self, mock__return_http_session, mock_handler
):
mock_trading_function = mock.Mock()
mock_trading_function.__name__ = "test"
mock_trading_function.side_effect = BetfairError()
mock_session = mock.Mock()
mock_order_package = mock.Mock(
elapsed_seconds=0.001, package_type=OrderPackageType.PLACE
)
mock_order_package.info = {}
mock_order_package.retry.return_value = False
self.assertIsNone(
self.execution._execution_helper(
mock_trading_function, mock_order_package, mock_session
)
)
mock_trading_function.assert_called_with(mock_order_package, mock_session)
mock__return_http_session.assert_called_with(mock_session, err=True)
mock_handler.put.assert_not_called()
mock_order_package.reset_orders.assert_called_with(complete=True)

@mock.patch(
"flumine.execution.betfairexecution.BetfairExecution._return_http_session"
Expand Down
9 changes: 9 additions & 0 deletions tests/test_orderpackage.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ def test_retry_false_count(self, mock_time):
self.assertEqual(self.order_package._retry_count, 3)
mock_time.sleep.assert_called()

def test_reset_orders(self):
mock_order = mock.MagicMock()
self.order_package._orders = [mock_order]
self.order_package.reset_orders()
mock_order.executable.assert_called()
mock_order.trade.__enter__.assert_called()
self.order_package.reset_orders(True)
mock_order.execution_complete.assert_called()

def test_calc_simulated_delay(self):
config.place_latency = 0.1
config.cancel_latency = 0.2
Expand Down

0 comments on commit 119cd8d

Please sign in to comment.