def test_flatten_position(self): # Arrange strategy = TradingStrategy() strategy.register( trader_id=self.trader_id, portfolio=self.portfolio, msgbus=self.msgbus, cache=self.cache, clock=self.clock, logger=self.logger, ) order = strategy.order_factory.market( USDJPY_SIM.id, OrderSide.BUY, Quantity.from_int(100000), ) strategy.submit_order(order) self.exchange.process(0) position = self.cache.positions_open()[0] # Act strategy.flatten_position(position) self.exchange.process(0) # Assert assert order.status == OrderStatus.FILLED assert strategy.portfolio.is_completely_flat()
def test_flatten_position_when_position_already_flat_does_nothing(self): # Arrange strategy = TradingStrategy() strategy.register( trader_id=self.trader_id, portfolio=self.portfolio, msgbus=self.msgbus, cache=self.cache, clock=self.clock, logger=self.logger, ) order1 = strategy.order_factory.market( USDJPY_SIM.id, OrderSide.BUY, Quantity.from_int(100000), ) order2 = strategy.order_factory.market( USDJPY_SIM.id, OrderSide.SELL, Quantity.from_int(100000), ) strategy.submit_order(order1) self.exchange.process(0) strategy.submit_order(order2, PositionId("1-001")) # Generated by exchange self.exchange.process(0) position = strategy.cache.positions_closed()[0] # Act strategy.flatten_position(position) self.exchange.process(0) # Assert assert strategy.portfolio.is_completely_flat()
def test_can_flatten_position(self): # Arrange strategy = TradingStrategy(order_id_tag='001') self.exec_engine.register_strategy(strategy) order = strategy.order_factory.market(USDJPY_FXCM, OrderSide.BUY, Quantity(100000)) position_id = strategy.position_id_generator.generate() strategy.submit_order(order, position_id) # Act strategy.flatten_position(position_id) # Assert self.assertEqual(order, strategy.orders()[order.id]) self.assertEqual(OrderState.FILLED, strategy.orders()[order.id].state) self.assertEqual(MarketPosition.FLAT, strategy.positions()[position_id].market_position) self.assertTrue(strategy.positions()[position_id].is_closed) self.assertTrue(position_id in strategy.positions_closed()) self.assertTrue(strategy.is_flat())
def test_flatten_position(self): # Arrange strategy = TradingStrategy(order_id_tag="001") strategy.register_trader( TraderId("TESTER", "000"), clock=self.clock, uuid_factory=self.uuid_factory, logger=self.logger, ) self.exec_engine.register_strategy(strategy) order = strategy.order_factory.market( USDJPY_FXCM, OrderSide.BUY, Quantity(100000), ) strategy.submit_order(order) filled = TestStubs.event_order_filled( order, position_id=PositionId("B-USD/JPY-1"), strategy_id=strategy.id, ) position = Position(filled) # Act strategy.flatten_position(position) # Assert self.assertTrue(order in strategy.execution.orders()) self.assertEqual(OrderState.FILLED, strategy.execution.orders()[0].state()) self.assertEqual(PositionSide.FLAT, strategy.execution.positions()[0].side) self.assertTrue(strategy.execution.positions()[0].is_closed()) self.assertTrue(PositionId("B-USD/JPY-1") in strategy.execution.position_closed_ids()) self.assertTrue(strategy.execution.is_completely_flat())