Пример #1
0
    def test_calculate_for_usdjpy_with_commission(self):
        # Arrange
        sizer = FixedRiskSizer(TestInstrumentProvider.default_fx_ccy("USD/JPY"))
        equity = Money(1_000_000, USD)

        # Act
        result = sizer.calculate(
            entry=Price("107.703"),
            stop_loss=Price("107.403"),
            equity=equity,
            risk=Decimal("0.01"),  # 1%
            commission_rate=Decimal("0.0002"),
            exchange_rate=Decimal(str(1 / 107.403)),
            unit_batch_size=Decimal(1000),
            units=1,
        )

        # Assert
        self.assertEqual(Quantity(3578000), result)
Пример #2
0
 def setup(self):
     # Fixture Setup
     self.sizer = FixedRiskSizer(USDJPY)
Пример #3
0
class TestFixedRiskSizer:
    def setup(self):
        # Fixture Setup
        self.sizer = FixedRiskSizer(USDJPY)

    def test_calculate_with_zero_equity_returns_quantity_zero(self):
        # Arrange
        equity = Money(0, USD)  # No equity

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00100"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            unit_batch_size=Decimal(1000),
        )

        # Assert
        assert result == Quantity.zero()

    def test_calculate_with_zero_exchange_rate_returns_quantity_zero(self):
        # Arrange
        equity = Money(0, USD)  # No equity

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00100"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            exchange_rate=Decimal("0"),
        )

        # Assert
        assert result == Quantity.zero()

    def test_calculate_with_zero_risk_returns_quantity_zero(self):
        # Arrange
        equity = Money(0, USD)  # No equity

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00100"),
            stop_loss=Price.from_str("1.00100"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            exchange_rate=Decimal("0"),
        )

        # Assert
        assert result == Quantity.zero()

    def test_calculate_single_unit_size(self):
        # Arrange
        equity = Money(1_000_000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00100"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            unit_batch_size=Decimal(1000),
        )

        # Assert
        assert result == Quantity.from_int(1_000_000)

    def test_calculate_single_unit_with_exchange_rate(self):
        # Arrange
        equity = Money(1_000_000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("110.010"),
            stop_loss=Price.from_str("110.000"),
            equity=equity,
            risk=Decimal("0.001"),  # 1%
            exchange_rate=Decimal(str(1 / 110)),
        )

        # Assert
        assert result == Quantity.from_int(10_000_000)

    def test_calculate_single_unit_size_when_risk_too_high(self):
        # Arrange
        equity = Money(100000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("3.00000"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.01"),  # 1%
            unit_batch_size=Decimal(1000),
        )

        # Assert
        assert result == Quantity.zero()

    def test_impose_hard_limit(self):
        # Arrange
        equity = Money(1_000_000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00010"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.01"),  # 1%
            hard_limit=Decimal(500000),
            unit_batch_size=Decimal(1000),
            units=1,
        )

        # Assert
        assert result == Quantity.from_int(500000)

    def test_calculate_multiple_unit_size(self):
        # Arrange
        equity = Money(1_000_000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00010"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            unit_batch_size=Decimal(1000),
            units=3,
        )

        # Assert
        assert result == Quantity.from_int(3_333_000)

    def test_calculate_multiple_unit_size_larger_batches(self):
        # Arrange
        equity = Money(1_000_000, USD)

        # Act
        result = self.sizer.calculate(
            entry=Price.from_str("1.00087"),
            stop_loss=Price.from_str("1.00000"),
            equity=equity,
            risk=Decimal("0.001"),  # 0.1%
            unit_batch_size=Decimal(25000),
            units=4,
        )

        # Assert
        assert result == Quantity.from_int(275000)

    def test_calculate_for_usdjpy_with_commission(self):
        # Arrange
        sizer = FixedRiskSizer(
            TestInstrumentProvider.default_fx_ccy("USD/JPY"))
        equity = Money(1_000_000, USD)

        # Act
        result = sizer.calculate(
            entry=Price.from_str("107.703"),
            stop_loss=Price.from_str("107.403"),
            equity=equity,
            risk=Decimal("0.01"),  # 1%
            commission_rate=Decimal("0.0002"),
            exchange_rate=Decimal(str(1 / 107.403)),
            unit_batch_size=Decimal(1000),
            units=1,
        )

        # Assert
        assert result == Quantity.from_int(3_578_000)