удалить лимиты
This commit is contained in:
@@ -2,7 +2,6 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
|
||||
from llm_trade_bot.config import RiskConfig
|
||||
from llm_trade_bot.models import (
|
||||
AccountSnapshot,
|
||||
Category,
|
||||
@@ -11,12 +10,12 @@ from llm_trade_bot.models import (
|
||||
OrderType,
|
||||
Side,
|
||||
)
|
||||
from llm_trade_bot.risk import RiskEngine, RiskRejected
|
||||
from llm_trade_bot.risk import OrderRejected, OrderValidator
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def engine() -> RiskEngine:
|
||||
return RiskEngine(RiskConfig())
|
||||
def engine() -> OrderValidator:
|
||||
return OrderValidator()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -40,7 +39,6 @@ def request(**overrides) -> OpenTradeRequest:
|
||||
"stop_loss": Decimal(90),
|
||||
"take_profit": Decimal(120),
|
||||
"trailing_distance": None,
|
||||
"risk_pct": Decimal(2),
|
||||
"leverage": Decimal(3),
|
||||
"rationale": "test",
|
||||
}
|
||||
@@ -48,36 +46,28 @@ def request(**overrides) -> OpenTradeRequest:
|
||||
return OpenTradeRequest(**values)
|
||||
|
||||
|
||||
def test_sizes_by_risk_and_exposure(engine, account, rules):
|
||||
def test_uses_all_available_buying_power(engine, account, rules):
|
||||
result = engine.validate_open(request(), account, rules)
|
||||
assert result.quantity == Decimal(20)
|
||||
assert result.notional == Decimal(2000)
|
||||
assert result.quantity == Decimal(300)
|
||||
assert result.notional == Decimal(30000)
|
||||
|
||||
|
||||
def test_remaining_exposure_caps_position(engine, rules):
|
||||
def test_existing_exposure_does_not_cap_position(engine, rules):
|
||||
account = AccountSnapshot(Decimal(10000), Decimal(10000), Decimal(3900), 2)
|
||||
result = engine.validate_open(request(), account, rules)
|
||||
assert result.quantity == Decimal(1)
|
||||
assert result.notional == Decimal(100)
|
||||
assert result.quantity == Decimal(300)
|
||||
assert result.notional == Decimal(30000)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"overrides, message",
|
||||
[
|
||||
({"risk_pct": Decimal("2.1")}, "risk_pct"),
|
||||
({"leverage": Decimal(4)}, "Leverage"),
|
||||
({"leverage": Decimal(101)}, "Leverage"),
|
||||
({"stop_loss": Decimal(101)}, "stop-loss"),
|
||||
({"take_profit": None, "trailing_distance": None}, "take-profit or trailing"),
|
||||
({"category": Category.SPOT, "order_type": OrderType.MARKET}, "Spot entries"),
|
||||
({"category": Category.SPOT, "order_type": OrderType.LIMIT, "limit_price": Decimal(100), "take_profit": None}, "Spot entry requires"),
|
||||
],
|
||||
)
|
||||
def test_rejects_unsafe_requests(engine, account, rules, overrides, message):
|
||||
with pytest.raises(RiskRejected, match=message):
|
||||
with pytest.raises(OrderRejected, match=message):
|
||||
engine.validate_open(request(**overrides), account, rules)
|
||||
|
||||
|
||||
def test_rejects_max_positions(engine, rules):
|
||||
account = AccountSnapshot(Decimal(10000), Decimal(10000), Decimal(0), 5)
|
||||
with pytest.raises(RiskRejected, match="Maximum"):
|
||||
engine.validate_open(request(), account, rules)
|
||||
|
||||
Reference in New Issue
Block a user