def test_position_filled_with_buy_order_returns_expected_attributes(self): # Arrange order = self.order_factory.market( AUDUSD_SIM.id, OrderSide.BUY, Quantity.from_int(100000), ) fill = TestStubs.event_order_filled( order, instrument=AUDUSD_SIM, position_id=PositionId("P-123456"), strategy_id=StrategyId("S-001"), last_px=Price.from_str("1.00001"), ) last = Price.from_str("1.00050") # Act position = Position(instrument=AUDUSD_SIM, fill=fill) # Assert assert position.symbol == AUDUSD_SIM.id.symbol assert position.venue == AUDUSD_SIM.id.venue assert not position.is_opposite_side(fill.order_side) assert not position != position # Equality operator test assert position.from_order == ClientOrderId( "O-19700101-000000-000-001-1") assert position.quantity == Quantity.from_int(100000) assert position.peak_qty == Quantity.from_int(100000) assert position.entry == OrderSide.BUY assert position.side == PositionSide.LONG assert position.ts_opened == 0 assert position.duration_ns == 0 assert position.avg_px_open == Decimal("1.00001") assert position.event_count == 1 assert position.client_order_ids == [order.client_order_id] assert position.venue_order_ids == [VenueOrderId("1")] assert position.execution_ids == [ ExecutionId("E-19700101-000000-000-001-1") ] assert position.last_execution_id == ExecutionId( "E-19700101-000000-000-001-1") assert position.id == PositionId("P-123456") assert len(position.events) == 1 assert position.is_long assert not position.is_short assert position.is_open assert not position.is_closed assert position.realized_points == 0 assert position.realized_return == 0 assert position.realized_pnl == Money(-2.00, USD) assert position.unrealized_pnl(last) == Money(49.00, USD) assert position.total_pnl(last) == Money(47.00, USD) assert position.commissions() == [Money(2.00, USD)] assert repr( position) == "Position(LONG 100_000 AUD/USD.SIM, id=P-123456)"
def test_position_filled_with_buy_order_returns_expected_attributes(self): # Arrange order = self.order_factory.market( AUDUSD_SIM.id, OrderSide.BUY, Quantity.from_int(100000), ) fill = TestStubs.event_order_filled( order, instrument=AUDUSD_SIM, position_id=PositionId("P-123456"), strategy_id=StrategyId("S-001"), last_px=Price.from_str("1.00001"), ) last = Price.from_str("1.00050") # Act position = Position(instrument=AUDUSD_SIM, fill=fill) # Assert assert position.symbol == AUDUSD_SIM.id.symbol assert position.venue == AUDUSD_SIM.id.venue assert not position.is_opposite_side(fill.order_side) self.assertFalse(position != position) # Equality operator test self.assertEqual(ClientOrderId("O-19700101-000000-000-001-1"), position.from_order) self.assertEqual(Quantity.from_int(100000), position.quantity) self.assertEqual(Quantity.from_int(100000), position.peak_qty) self.assertEqual(OrderSide.BUY, position.entry) self.assertEqual(PositionSide.LONG, position.side) self.assertEqual(0, position.opened_timestamp_ns) self.assertEqual(0, position.open_duration_ns) self.assertEqual(Decimal("1.00001"), position.avg_px_open) self.assertEqual(1, position.event_count) self.assertEqual([order.client_order_id], position.client_order_ids) self.assertEqual([VenueOrderId("1")], position.venue_order_ids) self.assertEqual([ExecutionId("E-19700101-000000-000-001-1")], position.execution_ids) self.assertEqual(ExecutionId("E-19700101-000000-000-001-1"), position.last_execution_id) self.assertEqual(PositionId("P-123456"), position.id) self.assertEqual(1, len(position.events)) self.assertTrue(position.is_long) self.assertFalse(position.is_short) self.assertTrue(position.is_open) self.assertFalse(position.is_closed) self.assertEqual(0, position.realized_points) self.assertEqual(0, position.realized_return) self.assertEqual(Money(-2.00, USD), position.realized_pnl) self.assertEqual(Money(49.00, USD), position.unrealized_pnl(last)) self.assertEqual(Money(47.00, USD), position.total_pnl(last)) self.assertEqual([Money(2.00, USD)], position.commissions()) self.assertEqual("Position(LONG 100_000 AUD/USD.SIM, id=P-123456)", repr(position))
def test_position_filled_with_buy_order_then_sell_order_returns_expected_attributes( self, ): # Arrange order = self.order_factory.market( AUDUSD_SIM.id, OrderSide.BUY, Quantity.from_int(150000), ) fill1 = TestStubs.event_order_filled( order, instrument=AUDUSD_SIM, position_id=PositionId("P-123456"), strategy_id=StrategyId("S-001"), last_px=Price.from_str("1.00001"), execution_ns=1_000_000_000, ) position = Position(instrument=AUDUSD_SIM, fill=fill1) fill2 = OrderFilled( self.account_id, order.client_order_id, VenueOrderId("2"), ExecutionId("E2"), PositionId("T123456"), StrategyId("S-001"), order.instrument_id, OrderSide.SELL, order.quantity, Price.from_str("1.00011"), AUDUSD_SIM.quote_currency, Money(0, USD), LiquiditySide.TAKER, 2_000_000_000, uuid4(), 0, ) last = Price.from_str("1.00050") # Act position.apply(fill2) # Assert assert position.is_opposite_side(fill2.order_side) self.assertEqual(Quantity.zero(), position.quantity) self.assertEqual(PositionSide.FLAT, position.side) self.assertEqual(1_000_000_000, position.opened_timestamp_ns) self.assertEqual(1_000_000_000, position.open_duration_ns) self.assertEqual(Decimal("1.00001"), position.avg_px_open) self.assertEqual(2, position.event_count) self.assertEqual(2_000_000_000, position.closed_timestamp_ns) self.assertEqual(Decimal("1.00011"), position.avg_px_close) self.assertFalse(position.is_long) self.assertFalse(position.is_short) self.assertFalse(position.is_open) self.assertTrue(position.is_closed) self.assertEqual(Decimal("0.00010"), position.realized_points) self.assertEqual(Decimal("0.00009999900000999990000099999000"), position.realized_return) self.assertEqual(Money(12.00, USD), position.realized_pnl) self.assertEqual(Money(0, USD), position.unrealized_pnl(last)) self.assertEqual(Money(12.00, USD), position.total_pnl(last)) self.assertEqual([Money(3.00, USD)], position.commissions()) self.assertEqual("Position(FLAT AUD/USD.SIM, id=P-123456)", repr(position))
def test_position_closed_and_reopened_returns_expected_attributes(self): # Arrange order = self.order_factory.market( AUDUSD_SIM.id, OrderSide.BUY, Quantity.from_int(150000), ) fill1 = TestEventStubs.order_filled( order, instrument=AUDUSD_SIM, position_id=PositionId("P-123456"), strategy_id=StrategyId("S-001"), last_px=Price.from_str("1.00001"), ts_filled_ns=1_000_000_000, ) position = Position(instrument=AUDUSD_SIM, fill=fill1) fill2 = OrderFilled( self.trader_id, StrategyId("S-001"), self.account_id, order.instrument_id, order.client_order_id, VenueOrderId("2"), TradeId("E2"), PositionId("P-123456"), OrderSide.SELL, OrderType.MARKET, order.quantity, Price.from_str("1.00011"), AUDUSD_SIM.quote_currency, Money(0, USD), LiquiditySide.TAKER, UUID4(), 2_000_000_000, 0, ) position.apply(fill2) fill3 = OrderFilled( self.trader_id, StrategyId("S-001"), self.account_id, order.instrument_id, order.client_order_id, VenueOrderId("2"), TradeId("E3"), PositionId("P-123456"), OrderSide.BUY, OrderType.MARKET, order.quantity, Price.from_str("1.00012"), AUDUSD_SIM.quote_currency, Money(0, USD), LiquiditySide.TAKER, UUID4(), 3_000_000_000, 0, ) # Act position.apply(fill3) # Assert last = Price.from_str("1.00030") assert position.is_opposite_side(fill2.order_side) assert position.quantity == Quantity.from_int(150000) assert position.side == PositionSide.LONG assert position.ts_opened == 1_000_000_000 assert position.duration_ns == 0 assert position.avg_px_open == Decimal("1.00001") assert position.event_count == 3 assert position.ts_closed == 0 assert position.avg_px_close == Decimal("1.00011") assert position.is_long assert position.is_open assert not position.is_short assert not position.is_closed assert position.realized_points == Decimal("0.00010") assert position.realized_return == Decimal( "0.00009999900000999990000099999000") assert position.realized_pnl == Money(12.00, USD) assert position.unrealized_pnl(last) == Money(43.50, USD) assert position.total_pnl(last) == Money(55.50, USD) assert position.commissions() == [Money(3.00, USD)] assert repr( position) == "Position(LONG 150_000 AUD/USD.SIM, id=P-123456)"