Gate one-open-per-expiry by historical expiry_ymd across days.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-03 07:35:44 +08:00
parent 5c334a4d89
commit a10ecf7409
10 changed files with 49 additions and 44 deletions
+10 -9
View File
@@ -152,22 +152,23 @@ def test_one_expiry_per_day(tmp_path, monkeypatch) -> None:
from app.models.db import Database
db = Database(tmp_path / "one_exp.db")
day = datetime(2026, 8, 1, 12, 0, tzinfo=_SH)
# 日历已跨到 8.3,但 8.2 开过的 260803 仍须占用
day = datetime(2026, 8, 3, 0, 0, 2, tzinfo=_SH)
with db._lock:
db._conn.execute(
"""INSERT INTO groups(group_id, status, expiry_ymd, open_at_ms)
VALUES ('G-20260802-01','closed','260803',1)"""
)
db._conn.execute(
"""INSERT INTO groups(group_id, status, expiry_ymd, open_at_ms)
VALUES ('G-20260801-01','closed','260802',1)"""
)
db._conn.execute(
"""INSERT INTO groups(group_id, status, expiry_ymd, open_at_ms)
VALUES ('G-20260731-01','closed','260801',1)"""
)
db._conn.commit()
used = used_expiry_ymds_for_day(db, day)
assert used == {"260802"}
assert expiry_blocked_by_one_per_day("260802", used, enabled=True) is True
assert expiry_blocked_by_one_per_day("260803", used, enabled=True) is False
assert expiry_blocked_by_one_per_day("260802", used, enabled=False) is False
assert used == {"260803", "260802"}
assert expiry_blocked_by_one_per_day("260803", used, enabled=True) is True
assert expiry_blocked_by_one_per_day("260804", used, enabled=True) is False
assert expiry_blocked_by_one_per_day("260803", used, enabled=False) is False
db.close()
+13 -13
View File
@@ -1,11 +1,14 @@
"""空仓选约:跳过当日已用到期与残留待结算到期。"""
"""空仓选约:跳过历史上已用到期与残留待结算到期。"""
from __future__ import annotations
from datetime import datetime
from zoneinfo import ZoneInfo
from app.strategy.clock import (
expiry_blocked_by_one_per_day,
pending_residual_expiry_ymds,
used_expiry_ymds_for_day,
used_expiry_ymds,
)
@@ -22,32 +25,29 @@ class _FakeDB:
def fetchall(self, sql: str, params: tuple = ()) -> list[dict]:
s = " ".join(sql.split()).lower()
if "from groups" in s:
like = params[0] if params else ""
prefix = like.replace("%", "")
return [
r
for r in self._groups
if str(r.get("group_id", "")).startswith(prefix)
if str(r.get("expiry_ymd") or "").strip()
]
if "from residual_options" in s:
return [r for r in self._residuals if r.get("status") == "pending"]
return []
def test_used_expiry_ymds_for_day() -> None:
def test_used_expiry_ymds_across_calendar_days() -> None:
"""8.2 开过 260803 后,8.3 零点仍须拦截同到期。"""
db = _FakeDB(
groups=[
{"group_id": "G-20260802-01", "expiry_ymd": "260803"},
{"group_id": "G-20260801-01", "expiry_ymd": "260802"},
]
)
from datetime import datetime
from zoneinfo import ZoneInfo
now = datetime(2026, 8, 2, 12, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
assert used_expiry_ymds_for_day(db, now) == {"260803"}
assert expiry_blocked_by_one_per_day("260803", {"260803"}, enabled=True)
assert not expiry_blocked_by_one_per_day("260804", {"260803"}, enabled=True)
now_aug3 = datetime(2026, 8, 3, 0, 0, 2, tzinfo=ZoneInfo("Asia/Shanghai"))
used = used_expiry_ymds(db, now_aug3)
assert used == {"260803", "260802"}
assert expiry_blocked_by_one_per_day("260803", used, enabled=True)
assert not expiry_blocked_by_one_per_day("260804", used, enabled=True)
def test_pending_residual_expiry_ymds() -> None: