Files
Grid_Trading/tests/test_grid_levels.py

70 lines
2.5 KiB
Python
Raw Normal View History

2026-07-09 10:50:25 +08:00
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,
)