def test_calculate_pnl_for_inverse2(self):
        # Arrange
        order = self.order_factory.market(
            ETHUSD_BITMEX.symbol,
            OrderSide.SELL,
            Quantity(100000),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=ETHUSD_BITMEX,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S", "001"),
            fill_price=Price("375.95"),
        )

        position = Position(fill)

        # Act
        pnl = position.calculate_pnl(
            Price("375.95"),
            Price("365.50"),
            Quantity(100000),
            # xrate=Decimal("0.0294337")  # Currently not handling quanto settlement
        )

        # Assert
        self.assertEqual(Money(1582.66, USD), position.unrealized_pnl(Price("370.00")))
        self.assertEqual(Money(100000.00, USD), position.notional_value(Price("370.00")))
    def test_calculate_pnl_for_short_position_loss(self):
        # Arrange
        order = self.order_factory.market(
            BTCUSDT_BINANCE.symbol,
            OrderSide.SELL,
            Quantity("10"),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=BTCUSDT_BINANCE,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S", "001"),
            fill_price=Price("10500.00"),
        )

        position = Position(fill)

        # Act
        pnl = position.calculate_pnl(
            Price("10500.00"),
            Price("10670.50"),
            Quantity("10.000000"),
        )

        # Assert
        self.assertEqual(Money("-1705.00000000", USDT), pnl)
        self.assertEqual(Money("-1705.00000000", USDT), position.unrealized_pnl(Price("10670.50")))
        self.assertEqual(Money("-105.00000000", USDT), position.realized_pnl)
        self.assertEqual([Money("105.00000000", USDT)], position.commissions())
        self.assertEqual(Money("105.00000000", USDT), position.commission)
        self.assertEqual(Money("106705.00000000", USDT), position.notional_value(Price("10670.50")))
    def test_calculate_pnl_for_inverse1(self):
        # Arrange
        order = self.order_factory.market(
            XBTUSD_BITMEX.symbol,
            OrderSide.SELL,
            Quantity(100000),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=XBTUSD_BITMEX,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S", "001"),
            fill_price=Price("10000.00"),
        )

        position = Position(fill)

        # Act
        pnl = position.calculate_pnl(
            Price("10000.00"),
            Price("11000.00"),
            Quantity(100000),
        )

        # Assert
        self.assertEqual(Money(-10000.00, USD), pnl)
        self.assertEqual(Money(-10000.00, USD), position.unrealized_pnl(Price("11000.00")))
        self.assertEqual(Money(0.00, USD), position.realized_pnl)
        self.assertEqual(Money(0.00, USD), position.commission)
        self.assertEqual(Money(100000.00, USD), position.notional_value(Price("11000.00")))
Exemplo n.º 4
0
    def test_calculate_pnl_for_inverse1(self):
        # Arrange
        order = self.order_factory.market(
            XBTUSD_BITMEX.id,
            OrderSide.SELL,
            Quantity.from_int(100000),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=XBTUSD_BITMEX,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S-001"),
            last_px=Price.from_str("10000.00"),
        )

        position = Position(instrument=XBTUSD_BITMEX, fill=fill)

        # Act
        pnl = position.calculate_pnl(
            avg_px_open=Price.from_str("10000.00"),
            avg_px_close=Price.from_str("11000.00"),
            quantity=Quantity.from_int(100000),
        )

        # Assert
        self.assertEqual(Money(-0.90909091, BTC), pnl)
        self.assertEqual(Money(-0.90909091, BTC),
                         position.unrealized_pnl(Price.from_str("11000.00")))
        self.assertEqual(Money(-0.00750000, BTC), position.realized_pnl)
        self.assertEqual(Money(9.09090909, BTC),
                         position.notional_value(Price.from_str("11000.00")))
Exemplo n.º 5
0
    def test_calculate_pnl_for_short_position_loss(self):
        # Arrange
        order = self.order_factory.market(
            BTCUSDT_BINANCE.id,
            OrderSide.SELL,
            Quantity.from_str("10"),
        )

        fill = TestEventStubs.order_filled(
            order,
            instrument=BTCUSDT_BINANCE,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S-001"),
            last_px=Price.from_str("10500.00"),
        )

        position = Position(instrument=BTCUSDT_BINANCE, fill=fill)

        # Act
        pnl = position.calculate_pnl(
            Price.from_str("10500.00"),
            Price.from_str("10670.50"),
            Quantity.from_str("10.000000"),
        )

        # Assert
        assert pnl == Money(-1705.00000000, USDT)
        assert position.unrealized_pnl(Price.from_str("10670.50")) == Money(
            -1705.00000000, USDT)
        assert position.realized_pnl == Money(-105.00000000, USDT)
        assert position.commissions() == [Money(105.00000000, USDT)]
        assert position.notional_value(Price.from_str("10670.50")) == Money(
            106705.00000000, USDT)
Exemplo n.º 6
0
    def test_calculate_pnl_for_inverse2(self):
        # Arrange
        order = self.order_factory.market(
            ETHUSD_BITMEX.id,
            OrderSide.SELL,
            Quantity(100000),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=ETHUSD_BITMEX,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S", "001"),
            fill_price=Price("375.95"),
        )

        position = Position(fill)

        # Act
        # Assert
        self.assertEqual(Money(1582.66, USD), position.unrealized_pnl(Price("370.00")))
        self.assertEqual(Money(100000.00, USD), position.notional_value(Price("370.00")))
Exemplo n.º 7
0
    def test_calculate_pnl_for_inverse2(self):
        # Arrange
        order = self.order_factory.market(
            ETHUSD_BITMEX.id,
            OrderSide.SELL,
            Quantity.from_int(100000),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=ETHUSD_BITMEX,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S-001"),
            last_px=Price.from_str("375.95"),
        )

        position = Position(instrument=ETHUSD_BITMEX, fill=fill)

        # Act, Assert
        self.assertEqual(Money(4.27745208, ETH),
                         position.unrealized_pnl(Price.from_str("370.00")))
        self.assertEqual(Money(270.27027027, ETH),
                         position.notional_value(Price.from_str("370.00")))
Exemplo n.º 8
0
    def test_calculate_pnl_for_short_position_winning(self):
        # Arrange
        order = self.order_factory.market(
            BTCUSDT_BINANCE.id,
            OrderSide.SELL,
            Quantity.from_str("10.150000"),
        )

        fill = TestStubs.event_order_filled(
            order,
            instrument=BTCUSDT_BINANCE,
            position_id=PositionId("P-123456"),
            strategy_id=StrategyId("S-001"),
            last_px=Price.from_str("10500.00"),
        )

        position = Position(instrument=BTCUSDT_BINANCE, fill=fill)

        # Act
        pnl = position.calculate_pnl(
            Price.from_str("10500.00"),
            Price.from_str("10390.00"),
            Quantity.from_str("10.150000"),
        )

        # Assert
        self.assertEqual(Money(1116.50000000, USDT), pnl)
        self.assertEqual(
            Money(1116.50000000, USDT),
            position.unrealized_pnl(Price.from_str("10390.00")),
        )
        self.assertEqual(Money(-106.57500000, USDT), position.realized_pnl)
        self.assertEqual([Money(106.57500000, USDT)], position.commissions())
        self.assertEqual(
            Money(105458.50000000, USDT),
            position.notional_value(Price.from_str("10390.00")),
        )