def test__process_runner_removal_sp_place_inplay(self): order_type = MarketOnCloseOrder(liability=200) mock_order = mock.Mock( selection_id=1234, handicap=0, order_type=order_type, info={}, side="LAY", current_order=mock.Mock(size_matched=0), average_price_matched=10.0, ) mock_market_book = mock.Mock() mock_market_book.runners = [ mock.Mock(selection_id=1234, handicap=0, adjustment_factor=20) ] mock_market = mock.Mock(market_type="PLACE", blotter=[mock_order], market_book=mock_market_book) self.middleware._process_runner_removal(mock_market, 12345, 0, 50) # The liability of £200 is reduced by the non runner's adjustment factor of 50% self.assertEqual(mock_order.order_type.liability, 100) # Size matched should be 100 / (10.0-1.0) \approx 11.11 self.assertEqual(11.11, mock_order.current_order.size_matched)
def test__process_runner_removal_sp_win_inplay(self): order_type = MarketOnCloseOrder(liability=200) mock_order = mock.Mock( selection_id=1234, handicap=0, order_type=order_type, info={}, side="LAY", current_order=mock.Mock(size_matched=0), average_price_matched=10, ) mock_market_book = mock.Mock() mock_market_book.runners = [ mock.Mock(selection_id=1234, handicap=0, adjustment_factor=20) ] mock_market = mock.Mock(market_type="WIN", blotter=[mock_order], market_book=mock_market_book) self.middleware._process_runner_removal(mock_market, 12345, 0, 50) # The liability of £200 is adjusted by the multiplier of 37.5%, which s # defined in the example here: https://github.com/betcode-org/flumine/issues/454 self.assertEqual(mock_order.order_type.liability, 75) # Size matched should be 75 / (10.0-1.0) \approx 8.33 self.assertEqual(8.33, mock_order.current_order.size_matched)
def test_selection_exposure_from_market_on_close_lay(self): mock_strategy = mock.Mock() mock_trade = mock.Mock(strategy=mock_strategy) mock_order = mock.Mock( trade=mock_trade, lookup=(self.blotter.market_id, 123, 0), side="LAY", order_type=MarketOnCloseOrder(liability=10.0), ) self.blotter["12345"] = mock_order self.assertEqual( self.blotter.selection_exposure(mock_strategy, mock_order.lookup), 10.0, )
def process_market_book(self, market, market_book): for runner in market_book.runners: runner_context = self.get_runner_context( market.market_id, runner.selection_id ) if runner_context.trade_count == 0: trade = Trade( market_book.market_id, runner.selection_id, runner.handicap, self, ) order = trade.create_order( side="LAY", order_type=MarketOnCloseOrder(100.00), ) self.place_order(market, order)
class MarketOnCloseOrderTest(unittest.TestCase): def setUp(self) -> None: self.order_type = MarketOnCloseOrder(128) def test_init(self): self.assertEqual(self.order_type.EXCHANGE, ExchangeType.BETFAIR) self.assertEqual(self.order_type.ORDER_TYPE, OrderTypes.MARKET_ON_CLOSE) self.assertEqual(self.order_type.liability, 128) def test_place_instruction(self): self.assertEqual(self.order_type.place_instruction(), {"liability": 128}) def test_info(self): self.assertEqual(self.order_type.info, { "liability": 128, "order_type": "Market on close" })
def test_get_exposures_from_market_on_close_lay(self): mock_strategy = mock.Mock() mock_trade = mock.Mock(strategy=mock_strategy) mock_order = mock.Mock( trade=mock_trade, lookup=(self.blotter.market_id, 123, 0), side="LAY", order_type=MarketOnCloseOrder(liability=10.0), ) self.blotter["12345"] = mock_order self.assertEqual( self.blotter.get_exposures(mock_strategy, mock_order.lookup), { "matched_profit_if_lose": 0.0, "matched_profit_if_win": 0.0, "worst_possible_profit_on_lose": 0.0, "worst_possible_profit_on_win": -10.0, "worst_potential_unmatched_profit_if_lose": 0.0, "worst_potential_unmatched_profit_if_win": 0.0, }, )
def setUp(self) -> None: self.order_type = MarketOnCloseOrder(128)