Enable hedge review with dual-timeframe K-line charts.

Always install the review module in hedge-only mode, expose 对冲复盘 in nav, and allow auto charts for closed hedge plans.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-14 18:43:02 +08:00
parent 6607d09526
commit 16bba2eb1a
10 changed files with 60 additions and 20 deletions
+25 -7
View File
@@ -139,8 +139,12 @@ def _maybe_schedule_options_review_chart(
trade: dict[str, Any],
data: dict[str, Any],
) -> bool:
"""纯期权 + 无手动截图 + 勾选自动K线 → 后台生成标的永续双周期拼图(只钉进/出场)."""
if str(trade.get("source_type") or "").strip() != "option_spot":
"""无手动截图 + 勾选自动K线 → 后台生成标的永续双周期拼图(只钉进/出场).
纯期权与永期/期期对冲均可;对冲按计划开平时间钉在标的永续 K 线上.
"""
src = str(trade.get("source_type") or "").strip()
if src not in ("option_spot", "perp_options", "options_options"):
return False
images = data.get("images") if isinstance(data.get("images"), list) else []
has_manual = any(str((x or {}).get("file") or "").strip() for x in images)
@@ -205,12 +209,17 @@ def _maybe_schedule_options_review_chart(
except Exception:
now_ms = None
inst = str(trade.get("inst_id") or underlying or f"#{trade.get('id') or ''}").strip()
plan_id = trade.get("hedge_plan_id")
if plan_id:
title_prefix = f"{underlying or 'HEDGE'} plan#{plan_id} review"
else:
inst = str(trade.get("inst_id") or underlying or f"#{trade.get('id') or ''}").strip()
title_prefix = f"{underlying or 'OPT'} {inst} review"
upload_folder = options_review_upload_dir(cfg["upload_folder"])
schedule_options_review_exchange_chart(
trade_id=int(trade["id"]),
exchange_symbol=exchange_symbol,
title_prefix=f"{underlying or 'OPT'} {inst} review",
title_prefix=title_prefix,
journal_tfs=journal_tfs,
journal_limit=journal_limit,
marker_payload={
@@ -231,9 +240,7 @@ def _maybe_schedule_options_review_chart(
def register_options_review_routes(app: Flask, cfg: dict[str, Any], repo_root: str) -> None:
lr = cfg["login_required"]
@app.route("/options/review")
@lr
def options_review_page():
def _review_page():
from lib.instance.instance_embed_lib import redirect_to_embed_shell_if_enabled
redir = redirect_to_embed_shell_if_enabled("options_review")
@@ -241,6 +248,17 @@ def register_options_review_routes(app: Flask, cfg: dict[str, Any], repo_root: s
return redir
return cfg["render_main_page"]("options_review")
@app.route("/options/review")
@lr
def options_review_page():
return _review_page()
@app.route("/hedge-plan/review")
@lr
def hedge_plan_review_page():
"""对冲复盘入口(与 /options/review 同页;本仓主入口)."""
return _review_page()
@app.route("/static/options_review.js")
@lr
def static_options_review_js():