70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
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,
|
|
)
|