feat: add selectable leverage threshold on ops map (90-300 step 10)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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:
|
||||
# 90–300,步进 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,
|
||||
|
||||
Reference in New Issue
Block a user