Files
eth_hedge_sim/backend/tests/test_amplitude_gate.py
T
dekun a88d708ea3 Add amplitude filter as first open gate for 永期 hedge.
Reuse OO amplitude settings (default off); Plan shows index/HL when filtering.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 21:41:51 +08:00

61 lines
2.0 KiB
Python

"""振幅过滤门:永期开仓第一关 / 与期期共用口径。"""
from __future__ import annotations
from app.exchange.candles import AmplitudeHL
from app.strategy.amplitude_gate import evaluate_amplitude_gate
def test_amplitude_gate_off_always_pass() -> None:
amp = AmplitudeHL(high=2060, low=1940, mid=2000, hours=12, bar_count=12)
# 6% 超常见上限,但过滤关 → 不拦
g = evaluate_amplitude_gate(
filter_enabled=False, amp=amp, max_pct=2.0, hours=12
)
assert g["blocked"] is False
assert g["ok"] is True
assert g["reason"] is None
assert g["snapshot"]["filter_enabled"] is False
assert g["snapshot"]["range_pct"] == amp.range_pct
def test_amplitude_gate_on_blocks_over_max() -> None:
amp = AmplitudeHL(high=2060, low=1940, mid=2000, hours=12, bar_count=12)
assert amp.range_pct == 6.0
g = evaluate_amplitude_gate(
filter_enabled=True, amp=amp, max_pct=2.0, hours=12
)
assert g["blocked"] is True
assert g["ok"] is False
assert "振幅未过关" in (g["reason"] or "")
assert "6.00%" in (g["reason"] or "")
assert "2%" in (g["reason"] or "")
def test_amplitude_gate_on_pass_within_max() -> None:
amp = AmplitudeHL(high=2010, low=1990, mid=2000, hours=12, bar_count=12)
assert amp.range_pct == 1.0
g = evaluate_amplitude_gate(
filter_enabled=True, amp=amp, max_pct=2.0, hours=12
)
assert g["blocked"] is False
assert g["ok"] is True
assert g["reason"] is None
def test_amplitude_gate_on_no_candles_fail_closed() -> None:
g = evaluate_amplitude_gate(
filter_enabled=True, amp=None, max_pct=2.0, hours=12
)
assert g["blocked"] is True
assert g["ok"] is False
assert "无法获取" in (g["reason"] or "")
def test_amplitude_gate_off_no_candles_still_ok() -> None:
g = evaluate_amplitude_gate(
filter_enabled=False, amp=None, max_pct=2.0, hours=12
)
assert g["blocked"] is False
assert g["ok"] is True