from decimal import Decimal import pytest from grid_trading.domain.grid_levels import generate_grid_levels def test_generate_grid_levels_compounds_percentage_spacing_and_rounds_values(): levels = generate_grid_levels( current_price=Decimal("10.00"), spacing=Decimal("0.03"), amount_per_grid=Decimal("10000"), lot_size=100, levels=3, ) assert [item.level for item in levels] == [1, 2, 3] assert [item.buy_price for item in levels] == [Decimal("9.70"), Decimal("9.41"), Decimal("9.13")] assert [item.buy_amount for item in levels] == [Decimal("10000.00")] * 3 assert [item.suggested_quantity for item in levels] == [1000, 1000, 1000] assert [item.actual_investment for item in levels] == [ Decimal("9700.00"), Decimal("9410.00"), Decimal("9130.00"), ] assert [item.sell_price for item in levels] == [Decimal("9.99"), Decimal("9.69"), Decimal("9.40")] assert [item.estimated_gross_profit for item in levels] == [ Decimal("290.00"), Decimal("280.00"), Decimal("270.00"), ] def test_generate_grid_levels_uses_zero_quantity_when_amount_cannot_buy_one_lot(): [level] = generate_grid_levels( current_price=Decimal("10.00"), spacing=Decimal("0.03"), amount_per_grid=Decimal("500"), lot_size=100, levels=1, ) assert level.buy_price == Decimal("9.70") assert level.suggested_quantity == 0 assert level.actual_investment == Decimal("0.00") assert level.estimated_gross_profit == Decimal("0.00") @pytest.mark.parametrize( ("current_price", "spacing", "amount_per_grid", "lot_size", "levels"), [ (Decimal("0"), Decimal("0.03"), Decimal("10000"), 100, 10), (Decimal("10"), Decimal("0"), Decimal("10000"), 100, 10), (Decimal("10"), Decimal("1"), Decimal("10000"), 100, 10), (Decimal("10"), Decimal("0.03"), Decimal("0"), 100, 10), (Decimal("10"), Decimal("0.03"), Decimal("10000"), 0, 10), (Decimal("10"), Decimal("0.03"), Decimal("10000"), 100, 0), (Decimal("10"), Decimal("0.03"), Decimal("10000"), 100, 101), ], ) def test_generate_grid_levels_validates_inputs(current_price, spacing, amount_per_grid, lot_size, levels): with pytest.raises(ValueError): generate_grid_levels( current_price=current_price, spacing=spacing, amount_per_grid=amount_per_grid, lot_size=lot_size, levels=levels, )