Files
atm-backtesting/tests/test_pl_calc.py

90 lines
3.0 KiB
Python

"""Tests for scripts/pl_calc.py."""
from __future__ import annotations
import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from scripts.pl_calc import ( # noqa: E402
PL_MARIUS_TABLE,
PL_THEORETICAL_TABLE,
pl_marius,
pl_theoretical,
)
class TestPlMarius:
def test_sl(self) -> None:
assert pl_marius("SL", be_moved=True) == -1.0
assert pl_marius("SL", be_moved=False) == -1.0
def test_tp0_sl_be_moved(self) -> None:
assert pl_marius("TP0->SL", be_moved=True) == pytest.approx(0.20)
def test_tp0_sl_no_be(self) -> None:
assert pl_marius("TP0->SL", be_moved=False) == pytest.approx(-0.30)
def test_tp0_tp1(self) -> None:
assert pl_marius("TP0->TP1", be_moved=True) == pytest.approx(0.50)
assert pl_marius("TP0->TP1", be_moved=False) == pytest.approx(0.50)
def test_tp0_tp2_closes_at_tp1(self) -> None:
assert pl_marius("TP0->TP2", be_moved=True) == pytest.approx(0.50)
assert pl_marius("TP0->TP2", be_moved=False) == pytest.approx(0.50)
def test_tp0_pending_returns_none(self) -> None:
assert pl_marius("TP0->pending", be_moved=True) is None
assert pl_marius("TP0->pending", be_moved=False) is None
def test_pending_returns_none(self) -> None:
assert pl_marius("pending", be_moved=True) is None
assert pl_marius("pending", be_moved=False) is None
def test_unicode_arrow_accepted(self) -> None:
assert pl_marius("TP0→TP1", be_moved=True) == pytest.approx(0.50)
assert pl_marius("TP0→SL", be_moved=False) == pytest.approx(-0.30)
def test_invalid_outcome_path(self) -> None:
with pytest.raises(ValueError):
pl_marius("nonsense", be_moved=True)
with pytest.raises(ValueError):
pl_marius("TP3", be_moved=False)
with pytest.raises(ValueError):
pl_marius("", be_moved=True)
class TestPlTheoretical:
def test_sl_first(self) -> None:
assert pl_theoretical("SL_first") == -1.0
def test_tp0(self) -> None:
assert pl_theoretical("TP0") == pytest.approx(0.133)
def test_tp1(self) -> None:
assert pl_theoretical("TP1") == pytest.approx(0.333)
def test_tp2(self) -> None:
assert pl_theoretical("TP2") == pytest.approx(0.667)
def test_invalid_max_reached(self) -> None:
with pytest.raises(ValueError):
pl_theoretical("TP3")
with pytest.raises(ValueError):
pl_theoretical("sl_first") # case-sensitive
with pytest.raises(ValueError):
pl_theoretical("")
class TestTables:
def test_marius_table_exported(self) -> None:
assert ("SL", True) in PL_MARIUS_TABLE
assert PL_MARIUS_TABLE[("TP0->TP1", True)] == pytest.approx(0.50)
def test_theoretical_table_exported(self) -> None:
assert PL_THEORETICAL_TABLE["TP2"] == pytest.approx(0.667)
assert PL_THEORETICAL_TABLE["SL_first"] == -1.0