feat: add selectable leverage threshold on ops map (90-300 step 10)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-05 17:01:36 +08:00
parent 56f58a12bd
commit e213db8d2d
4 changed files with 69 additions and 5 deletions
+23 -2
View File
@@ -38,6 +38,17 @@ def _validate_min_hours(min_hours: float) -> float:
return float(int(round(h)))
def _validate_min_leverage(min_leverage: float) -> float:
# 90300,步进 10
v = float(min_leverage)
if v < 90 or v > 300 or abs(v - round(v)) > 1e-9 or int(round(v)) % 10 != 0:
raise HTTPException(
status_code=400,
detail="min_leverage must be multiple of 10 in [90, 300]",
)
return float(int(round(v)))
@router.get("/leverage")
def leverage_stats(
range: str = Query(default="day", pattern="^(day|week|month)$"),
@@ -50,9 +61,16 @@ def leverage_stats(
le=48,
description="采样时距离到期 ≥ 该小时数才计入",
),
min_leverage: float = Query(
default=100,
ge=90,
le=300,
description="杠杆达标线(≥ 该值计入达标占比)",
),
) -> dict:
s = get_settings()
mh = _validate_min_hours(min_hours)
ml = _validate_min_leverage(min_leverage)
info = _range_info(range, date)
repo = Repository(s.db_path)
try:
@@ -67,7 +85,7 @@ def leverage_stats(
rows,
range_info=info,
bucket_minutes=bucket_minutes,
min_leverage=float(s.min_option_leverage),
min_leverage=ml,
side=side,
)
payload["min_hours"] = mh
@@ -135,10 +153,12 @@ def ops_map(
side: str = Query(default="both", pattern="^(C|P|both)$"),
bucket_minutes: int = Query(default=60, ge=15, le=120),
min_hours: float = Query(default=12, ge=8, le=48),
min_leverage: float = Query(default=100, ge=90, le=300),
) -> dict:
# 直接算一遍,避免路由函数互相调用时 Query 默认值问题
s = get_settings()
mh = _validate_min_hours(min_hours)
ml = _validate_min_leverage(min_leverage)
info = _range_info(range, date)
repo = Repository(s.db_path)
try:
@@ -153,7 +173,7 @@ def ops_map(
rows,
range_info=info,
bucket_minutes=bucket_minutes,
min_leverage=float(s.min_option_leverage),
min_leverage=ml,
side=side,
)
lev["min_hours"] = mh
@@ -185,6 +205,7 @@ def ops_map(
"side": side,
"bucket_minutes": bucket_minutes,
"min_hours": mh,
"min_leverage": ml,
"expiry_filter": filt,
"leverage": lev,
"move_points": mov,