diff --git a/lib/common/static/options_review.js b/lib/common/static/options_review.js index c7cf7f3..4dd38a6 100644 --- a/lib/common/static/options_review.js +++ b/lib/common/static/options_review.js @@ -14,7 +14,7 @@ option_spot: { strategy: ["顺势", "反转"], direction: ["多", "空"], - entry: ["假突破", "结构突破"], + entry: ["假突破", "结构突破", "左侧条件单"], }, hedge: { strategy: ["横盘", "趋势"], @@ -713,7 +713,8 @@ function resetChartOptions() { var cb = $("or-exchange-chart"); - if (cb) cb.checked = false; + // 期权复盘:默认勾选后台生成 K 线 + if (cb) cb.checked = true; } function renderDetailImages(images, opts) { @@ -826,6 +827,7 @@ ["离场", e.exit_reason || "—"], ["按计划", e.followed_plan || "—"], ["入场逻辑", e.entry_logic || "—"], + ["上一个入场周期", e.prev_entry_tf || "—"], ]; if (t.is_hedge) { cells.push(["永续盈亏", fmtPnl(t.realized_pnl_perp)]); @@ -1094,6 +1096,7 @@ ($("or-f-followed") || {}).value = ""; ($("or-f-result") || {}).value = ""; ($("or-f-entry") || {}).value = ""; + ($("or-f-prev-tf") || {}).value = ""; ($("or-f-note") || {}).value = ""; setMoodTags(""); resetUploadSlots(); @@ -1158,6 +1161,7 @@ ($("or-f-followed") || {}).value = e.followed_plan || ""; setSelectValue($("or-f-result"), e.result_tag || autoResultTag(t.realized_pnl_total)); setSelectValue($("or-f-entry"), e.entry_logic || ""); + setSelectValue($("or-f-prev-tf"), e.prev_entry_tf || ""); ($("or-f-note") || {}).value = e.note || ""; setMoodTags(e.mistake_tags); resetChartOptions(); @@ -1275,6 +1279,7 @@ result_tag: ($("or-f-result") || {}).value || "", mistake_tags: collectMoodTags(), entry_logic: ($("or-f-entry") || {}).value || "", + prev_entry_tf: ($("or-f-prev-tf") || {}).value || "", note: ($("or-f-note") || {}).value || "", images: collectImages(), }; diff --git a/lib/options/options_review_db.py b/lib/options/options_review_db.py index f0db635..be67a2b 100644 --- a/lib/options/options_review_db.py +++ b/lib/options/options_review_db.py @@ -130,6 +130,7 @@ def init_options_review_tables(conn: sqlite3.Connection) -> None: _ensure_column(conn, "options_review_trades", "target_price_up", "REAL") _ensure_column(conn, "options_review_trades", "target_price_down", "REAL") _ensure_column(conn, "options_review_trades", "profit_rr", "REAL") + _ensure_column(conn, "options_review_entries", "prev_entry_tf", "TEXT") def _ensure_column(conn: sqlite3.Connection, table: str, col: str, typedef: str) -> None: diff --git a/lib/options/options_review_lib.py b/lib/options/options_review_lib.py index 9072f14..1d9197d 100644 --- a/lib/options/options_review_lib.py +++ b/lib/options/options_review_lib.py @@ -669,6 +669,7 @@ def enrich_trade_row(row: dict[str, Any], entry: dict[str, Any] | None = None) - out["strategy_tag"] = entry.get("strategy_tag") out["direction_view"] = entry.get("direction_view") out["entry_logic"] = entry.get("entry_logic") + out["prev_entry_tf"] = entry.get("prev_entry_tf") out["result_tag"] = entry.get("result_tag") out["reviewed_at"] = entry.get("reviewed_at") or entry.get("updated_at") else: @@ -676,6 +677,7 @@ def enrich_trade_row(row: dict[str, Any], entry: dict[str, Any] | None = None) - out["strategy_tag"] = None out["direction_view"] = None out["entry_logic"] = None + out["prev_entry_tf"] = None out["result_tag"] = None out["reviewed_at"] = None return out @@ -837,7 +839,7 @@ def list_review_trades( rows = conn.execute( f""" SELECT t.*, e.id AS entry_id, e.strategy_tag AS e_strategy_tag, - e.direction_view, e.entry_logic, e.exit_reason, e.followed_plan, + e.direction_view, e.entry_logic, e.prev_entry_tf, e.exit_reason, e.followed_plan, e.mistake_tags, e.result_tag, e.note, e.images_json, e.image, e.reviewed_at, e.updated_at FROM options_review_trades t @@ -858,6 +860,7 @@ def list_review_trades( "strategy_tag": d.pop("e_strategy_tag", None), "direction_view": d.pop("direction_view", None), "entry_logic": d.pop("entry_logic", None), + "prev_entry_tf": d.pop("prev_entry_tf", None), "exit_reason": d.pop("exit_reason", None), "followed_plan": d.pop("followed_plan", None), "mistake_tags": d.pop("mistake_tags", None), @@ -874,6 +877,7 @@ def list_review_trades( "e_strategy_tag", "direction_view", "entry_logic", + "prev_entry_tf", "exit_reason", "followed_plan", "mistake_tags", @@ -924,10 +928,14 @@ def save_review_entry( primary = None if images: primary = str(images[0].get("file") or "").strip() or None + prev_tf = str(payload.get("prev_entry_tf") or "").strip().lower() + if prev_tf and prev_tf not in ("15m", "1h", "2h", "4h", "8h", "12h"): + prev_tf = "" fields = { "strategy_tag": str(payload.get("strategy_tag") or "").strip() or None, "direction_view": str(payload.get("direction_view") or "").strip() or None, "entry_logic": str(payload.get("entry_logic") or "").strip() or None, + "prev_entry_tf": prev_tf or None, "exit_reason": str(payload.get("exit_reason") or "").strip() or None, "followed_plan": str(payload.get("followed_plan") or "").strip() or None, "mistake_tags": str(payload.get("mistake_tags") or "").strip() or None, diff --git a/lib/options/templates/options_review_panel.html b/lib/options/templates/options_review_panel.html index 54aeeaf..4ef768f 100644 --- a/lib/options/templates/options_review_panel.html +++ b/lib/options/templates/options_review_panel.html @@ -314,6 +314,15 @@ +
{% for tf in ['5m', '15m', '1h', '4h'] %} @@ -329,7 +338,7 @@ - +