Add one-expiry-per-day open rhythm gate (default on).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-01 16:39:32 +08:00
parent 22c42a19a0
commit f1da2778ef
11 changed files with 166 additions and 2 deletions
+32
View File
@@ -3,6 +3,7 @@
from __future__ import annotations
from datetime import datetime
from typing import Any
from zoneinfo import ZoneInfo
_SH = ZoneInfo("Asia/Shanghai")
@@ -38,3 +39,34 @@ def can_open_new(
def group_date_ymd(now: datetime | None = None) -> str:
return window_key(now)
def used_expiry_ymds_for_day(db: Any, now: datetime | None = None) -> set[str]:
"""
上海日历日已开过的期权到期日(groups.expiry_ymdYYMMDD)。
按当日组号 G-{YYYYMMDD}-% 统计;含已平仓,用于「同到期一天只开一次」。
"""
wkey = window_key(now)
rows = db.fetchall(
"SELECT DISTINCT expiry_ymd FROM groups WHERE group_id LIKE ?",
(f"G-{wkey}-%",),
)
out: set[str] = set()
for r in rows or []:
y = str(r["expiry_ymd"] or "").strip()
if y:
out.add(y)
return out
def expiry_blocked_by_one_per_day(
expiry_ymd: str | None,
used: set[str],
*,
enabled: bool = True,
) -> bool:
"""开启时:候选到期已在当日用过则拦截。"""
if not enabled:
return False
y = str(expiry_ymd or "").strip()
return bool(y and y in used)