diff --git a/crypto_monitor_binance/app.py b/crypto_monitor_binance/app.py
index 24d8af9..f65cf4c 100644
--- a/crypto_monitor_binance/app.py
+++ b/crypto_monitor_binance/app.py
@@ -133,6 +133,7 @@ from key_monitor_lib import (
detect_rs_box_break,
format_auto_amp_line,
format_auto_confirm_line,
+ key_monitor_rule_template_context,
notify_interval_elapsed,
resolve_rs_break_for_alert,
rs_break_from_direction,
@@ -6125,12 +6126,20 @@ def render_main_page(page="trade"):
opens_today=opens_today,
hard_limit=DAILY_OPEN_HARD_LIMIT,
)
- key_gate_rule_text = (
- f"【箱体/收敛】{KLINE_TIMEFRAME} 两根闭合K|突破越过关键位 > {KEY_BREAKOUT_AMP_MIN_PCT}%|"
- f"确认K收于箱外|量能>前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}|"
- f"RR>{KEY_AUTO_MIN_PLANNED_RR}|日成交前{KEY_DAILY_VOLUME_RANK_MAX}|"
- f"【假突破·BTC/ETH】做空填高点/做多填低点,外侧 0.1% 挂限价,止损 0.5%,RR 1.5,有效期 {FALSE_BREAKOUT_VALIDITY_HOURS}h|"
- f"【阻力/支撑】填上/下沿,5m 收盘突破任一侧即提醒 {KEY_ALERT_MAX_TIMES} 次(间隔 {KEY_ALERT_INTERVAL_MINUTES} 分),不选方向、不自动开仓"
+ key_rule_ctx = key_monitor_rule_template_context(
+ kline_timeframe=KLINE_TIMEFRAME,
+ key_breakout_amp_min_pct=KEY_BREAKOUT_AMP_MIN_PCT,
+ key_volume_ma_bars=KEY_VOLUME_MA_BARS,
+ key_volume_ratio_min=KEY_VOLUME_RATIO_MIN,
+ key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
+ key_daily_volume_rank_max=KEY_DAILY_VOLUME_RANK_MAX,
+ key_confirm_breakout_bar=KEY_CONFIRM_BREAKOUT_BAR,
+ key_confirm_bar=KEY_CONFIRM_BAR,
+ key_alert_max_times=KEY_ALERT_MAX_TIMES,
+ key_alert_interval_minutes=KEY_ALERT_INTERVAL_MINUTES,
+ key_stop_outside_breakout_pct=KEY_STOP_OUTSIDE_BREAKOUT_PCT,
+ key_trend_stop_outside_pct=KEY_TREND_STOP_OUTSIDE_PCT,
+ false_breakout_validity_hours=FALSE_BREAKOUT_VALIDITY_HOURS,
)
strategy_extra = {}
if page in ("strategy", "strategy_trend", "strategy_roll", "strategy_records"):
@@ -6209,7 +6218,7 @@ def render_main_page(page="trade"):
max_active_positions=MAX_ACTIVE_POSITIONS,
manual_min_planned_rr=MANUAL_MIN_PLANNED_RR,
key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
- key_gate_rule_text=key_gate_rule_text,
+ key_rule_ctx=key_rule_ctx,
kline_timeframe=KLINE_TIMEFRAME,
**strategy_extra,
)
diff --git a/crypto_monitor_gate/app.py b/crypto_monitor_gate/app.py
index d428245..79b9381 100644
--- a/crypto_monitor_gate/app.py
+++ b/crypto_monitor_gate/app.py
@@ -132,6 +132,7 @@ from key_monitor_lib import (
detect_rs_box_break,
format_auto_amp_line,
format_auto_confirm_line,
+ key_monitor_rule_template_context,
notify_interval_elapsed,
resolve_rs_break_for_alert,
rs_break_from_direction,
@@ -6218,12 +6219,20 @@ def render_main_page(page="trade"):
opens_today=opens_today,
hard_limit=DAILY_OPEN_HARD_LIMIT,
)
- key_gate_rule_text = (
- f"【箱体/收敛】{KLINE_TIMEFRAME} 两根闭合K|突破越过关键位 > {KEY_BREAKOUT_AMP_MIN_PCT}%|"
- f"确认K收于箱外|量能>前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}|"
- f"RR>{KEY_AUTO_MIN_PLANNED_RR}|日成交前{KEY_DAILY_VOLUME_RANK_MAX}|"
- f"【假突破·BTC/ETH】做空填高点/做多填低点,外侧 0.1% 挂限价,止损 0.5%,RR 1.5,有效期 {FALSE_BREAKOUT_VALIDITY_HOURS}h|"
- f"【阻力/支撑】填上/下沿,5m 收盘突破任一侧即提醒 {KEY_ALERT_MAX_TIMES} 次(间隔 {KEY_ALERT_INTERVAL_MINUTES} 分),不选方向、不自动开仓"
+ key_rule_ctx = key_monitor_rule_template_context(
+ kline_timeframe=KLINE_TIMEFRAME,
+ key_breakout_amp_min_pct=KEY_BREAKOUT_AMP_MIN_PCT,
+ key_volume_ma_bars=KEY_VOLUME_MA_BARS,
+ key_volume_ratio_min=KEY_VOLUME_RATIO_MIN,
+ key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
+ key_daily_volume_rank_max=KEY_DAILY_VOLUME_RANK_MAX,
+ key_confirm_breakout_bar=KEY_CONFIRM_BREAKOUT_BAR,
+ key_confirm_bar=KEY_CONFIRM_BAR,
+ key_alert_max_times=KEY_ALERT_MAX_TIMES,
+ key_alert_interval_minutes=KEY_ALERT_INTERVAL_MINUTES,
+ key_stop_outside_breakout_pct=KEY_STOP_OUTSIDE_BREAKOUT_PCT,
+ key_trend_stop_outside_pct=KEY_TREND_STOP_OUTSIDE_PCT,
+ false_breakout_validity_hours=FALSE_BREAKOUT_VALIDITY_HOURS,
)
strategy_extra = {}
if page in ("strategy", "strategy_trend", "strategy_roll", "strategy_records"):
@@ -6305,7 +6314,7 @@ def render_main_page(page="trade"):
max_active_positions=MAX_ACTIVE_POSITIONS,
manual_min_planned_rr=MANUAL_MIN_PLANNED_RR,
key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
- key_gate_rule_text=key_gate_rule_text,
+ key_rule_ctx=key_rule_ctx,
kline_timeframe=KLINE_TIMEFRAME,
exchange_pnl_sync=exchange_pnl_sync,
**strategy_extra,
diff --git a/crypto_monitor_gate_bot/app.py b/crypto_monitor_gate_bot/app.py
index 94f7398..1b920fa 100644
--- a/crypto_monitor_gate_bot/app.py
+++ b/crypto_monitor_gate_bot/app.py
@@ -132,6 +132,7 @@ from key_monitor_lib import (
detect_rs_box_break,
format_auto_amp_line,
format_auto_confirm_line,
+ key_monitor_rule_template_context,
notify_interval_elapsed,
resolve_rs_break_for_alert,
rs_break_from_direction,
@@ -6218,12 +6219,20 @@ def render_main_page(page="trade"):
opens_today=opens_today,
hard_limit=DAILY_OPEN_HARD_LIMIT,
)
- key_gate_rule_text = (
- f"【箱体/收敛】{KLINE_TIMEFRAME} 两根闭合K|突破越过关键位 > {KEY_BREAKOUT_AMP_MIN_PCT}%|"
- f"确认K收于箱外|量能>前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}|"
- f"RR>{KEY_AUTO_MIN_PLANNED_RR}|日成交前{KEY_DAILY_VOLUME_RANK_MAX}|"
- f"【假突破·BTC/ETH】做空填高点/做多填低点,外侧 0.1% 挂限价,止损 0.5%,RR 1.5,有效期 {FALSE_BREAKOUT_VALIDITY_HOURS}h|"
- f"【阻力/支撑】填上/下沿,5m 收盘突破任一侧即提醒 {KEY_ALERT_MAX_TIMES} 次(间隔 {KEY_ALERT_INTERVAL_MINUTES} 分),不选方向、不自动开仓"
+ key_rule_ctx = key_monitor_rule_template_context(
+ kline_timeframe=KLINE_TIMEFRAME,
+ key_breakout_amp_min_pct=KEY_BREAKOUT_AMP_MIN_PCT,
+ key_volume_ma_bars=KEY_VOLUME_MA_BARS,
+ key_volume_ratio_min=KEY_VOLUME_RATIO_MIN,
+ key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
+ key_daily_volume_rank_max=KEY_DAILY_VOLUME_RANK_MAX,
+ key_confirm_breakout_bar=KEY_CONFIRM_BREAKOUT_BAR,
+ key_confirm_bar=KEY_CONFIRM_BAR,
+ key_alert_max_times=KEY_ALERT_MAX_TIMES,
+ key_alert_interval_minutes=KEY_ALERT_INTERVAL_MINUTES,
+ key_stop_outside_breakout_pct=KEY_STOP_OUTSIDE_BREAKOUT_PCT,
+ key_trend_stop_outside_pct=KEY_TREND_STOP_OUTSIDE_PCT,
+ false_breakout_validity_hours=FALSE_BREAKOUT_VALIDITY_HOURS,
)
strategy_extra = {}
if page in ("strategy", "strategy_trend", "strategy_roll", "strategy_records"):
@@ -6305,7 +6314,7 @@ def render_main_page(page="trade"):
max_active_positions=MAX_ACTIVE_POSITIONS,
manual_min_planned_rr=MANUAL_MIN_PLANNED_RR,
key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
- key_gate_rule_text=key_gate_rule_text,
+ key_rule_ctx=key_rule_ctx,
kline_timeframe=KLINE_TIMEFRAME,
exchange_pnl_sync=exchange_pnl_sync,
**strategy_extra,
diff --git a/crypto_monitor_okx/app.py b/crypto_monitor_okx/app.py
index ce05be5..f8122dc 100644
--- a/crypto_monitor_okx/app.py
+++ b/crypto_monitor_okx/app.py
@@ -132,6 +132,7 @@ from key_monitor_lib import (
detect_rs_box_break,
format_auto_amp_line,
format_auto_confirm_line,
+ key_monitor_rule_template_context,
notify_interval_elapsed,
resolve_rs_break_for_alert,
rs_break_from_direction,
@@ -5764,12 +5765,20 @@ def render_main_page(page="trade"):
opens_today=opens_today,
hard_limit=DAILY_OPEN_HARD_LIMIT,
)
- key_gate_rule_text = (
- f"【箱体/收敛】{KLINE_TIMEFRAME} 两根闭合K|突破越过关键位 > {KEY_BREAKOUT_AMP_MIN_PCT}%|"
- f"确认K收于箱外|量能>前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}|"
- f"RR>{KEY_AUTO_MIN_PLANNED_RR}|日成交前{KEY_DAILY_VOLUME_RANK_MAX}|"
- f"【假突破·BTC/ETH】做空填高点/做多填低点,外侧 0.1% 挂限价,止损 0.5%,RR 1.5,有效期 {FALSE_BREAKOUT_VALIDITY_HOURS}h|"
- f"【阻力/支撑】填上/下沿,5m 收盘突破任一侧即提醒 {KEY_ALERT_MAX_TIMES} 次(间隔 {KEY_ALERT_INTERVAL_MINUTES} 分),不选方向、不自动开仓"
+ key_rule_ctx = key_monitor_rule_template_context(
+ kline_timeframe=KLINE_TIMEFRAME,
+ key_breakout_amp_min_pct=KEY_BREAKOUT_AMP_MIN_PCT,
+ key_volume_ma_bars=KEY_VOLUME_MA_BARS,
+ key_volume_ratio_min=KEY_VOLUME_RATIO_MIN,
+ key_auto_min_planned_rr=KEY_AUTO_MIN_PLANNED_RR,
+ key_daily_volume_rank_max=KEY_DAILY_VOLUME_RANK_MAX,
+ key_confirm_breakout_bar=KEY_CONFIRM_BREAKOUT_BAR,
+ key_confirm_bar=KEY_CONFIRM_BAR,
+ key_alert_max_times=KEY_ALERT_MAX_TIMES,
+ key_alert_interval_minutes=KEY_ALERT_INTERVAL_MINUTES,
+ key_stop_outside_breakout_pct=KEY_STOP_OUTSIDE_BREAKOUT_PCT,
+ key_trend_stop_outside_pct=KEY_TREND_STOP_OUTSIDE_PCT,
+ false_breakout_validity_hours=FALSE_BREAKOUT_VALIDITY_HOURS,
)
strategy_extra = {}
if page in ("strategy", "strategy_trend", "strategy_roll", "strategy_records"):
@@ -5844,7 +5853,7 @@ def render_main_page(page="trade"):
journal_chart_default_tf2=JOURNAL_CHART_DEFAULT_TF2,
journal_chart_default_limit=JOURNAL_CHART_DEFAULT_LIMIT,
journal_chart_default_anchor=JOURNAL_CHART_DEFAULT_ANCHOR,
- key_gate_rule_text=key_gate_rule_text,
+ key_rule_ctx=key_rule_ctx,
funds_fmt=format_funds_u,
exchange_display=EXCHANGE_DISPLAY_NAME,
max_active_positions=MAX_ACTIVE_POSITIONS,
diff --git a/key_monitor_lib.py b/key_monitor_lib.py
index 2c400ef..23f2a5d 100644
--- a/key_monitor_lib.py
+++ b/key_monitor_lib.py
@@ -293,3 +293,46 @@ def format_auto_confirm_line(confirm_ok: bool, cfm_close, edge_price, direction:
f"第二根确认:{'通过' if confirm_ok else '不通过'}"
f"(确认收盘 {cfm_close},须收于{side},关键位 {edge_price})"
)
+
+
+def key_monitor_rule_template_context(
+ *,
+ kline_timeframe: str,
+ key_breakout_amp_min_pct: float,
+ key_volume_ma_bars: int,
+ key_volume_ratio_min: float,
+ key_auto_min_planned_rr: float,
+ key_daily_volume_rank_max: int,
+ key_confirm_breakout_bar: int,
+ key_confirm_bar: int,
+ key_alert_max_times: int,
+ key_alert_interval_minutes: int,
+ key_stop_outside_breakout_pct: float,
+ key_trend_stop_outside_pct: float,
+ false_breakout_validity_hours: int,
+) -> dict[str, Any]:
+ """关键位监控页规则说明表格(Jinja key_rule_ctx)。"""
+ from false_breakout_key_monitor_lib import (
+ FALSE_BREAKOUT_OFFSET_PCT,
+ FALSE_BREAKOUT_RR,
+ FALSE_BREAKOUT_SL_PCT,
+ )
+
+ return {
+ "tf": (kline_timeframe or "5m").strip(),
+ "amp_min_pct": key_breakout_amp_min_pct,
+ "vol_ma_bars": key_volume_ma_bars,
+ "vol_ratio_min": key_volume_ratio_min,
+ "min_rr": key_auto_min_planned_rr,
+ "vol_rank_max": key_daily_volume_rank_max,
+ "breakout_bar": key_confirm_breakout_bar,
+ "confirm_bar": key_confirm_bar,
+ "alert_max": key_alert_max_times,
+ "alert_interval_min": key_alert_interval_minutes,
+ "stop_outside_pct": key_stop_outside_breakout_pct,
+ "trend_stop_outside_pct": key_trend_stop_outside_pct,
+ "fb_offset_pct": FALSE_BREAKOUT_OFFSET_PCT,
+ "fb_sl_pct": FALSE_BREAKOUT_SL_PCT,
+ "fb_rr": FALSE_BREAKOUT_RR,
+ "fb_valid_hours": false_breakout_validity_hours,
+ }
diff --git a/static/instance_theme.css b/static/instance_theme.css
index 56e3dd9..8d5cbcf 100644
--- a/static/instance_theme.css
+++ b/static/instance_theme.css
@@ -872,6 +872,36 @@ html[data-theme="light"] .tip-collapse-body.rule-tip {
color: #4a6078 !important;
}
+html[data-theme="light"] .key-rule-table th,
+html[data-theme="light"] .key-rule-table td {
+ border-color: #d0dae4 !important;
+}
+
+html[data-theme="light"] .key-rule-table th {
+ background: #eef3f8 !important;
+ color: #4a6078 !important;
+}
+
+html[data-theme="light"] .key-rule-table td {
+ color: #142232 !important;
+}
+
+html[data-theme="light"] .key-rule-table .key-rule-type {
+ color: #142232 !important;
+}
+
+html[data-theme="light"] .key-rule-table .key-rule-sub {
+ color: #006e9a !important;
+}
+
+html[data-theme="light"] .key-rule-foot {
+ color: #6a7588 !important;
+}
+
+html[data-theme="light"] .key-rule-foot code {
+ color: #006e9a !important;
+}
+
/* ── 关键位折叠行(亮色)── */
html[data-theme="light"] .key-row-collapse {
background: #f6f9fc !important;
diff --git a/strategy_templates/key_monitor_panel.html b/strategy_templates/key_monitor_panel.html
index 0ad0cce..9a66c6f 100644
--- a/strategy_templates/key_monitor_panel.html
+++ b/strategy_templates/key_monitor_panel.html
@@ -29,6 +29,17 @@
.key-row-collapse.key-history-failed{border-color:rgba(232,160,144,.4);background:rgba(36,22,24,.95)}
.key-row-collapse.key-history-failed .key-row-collapse-summary{color:#e8cfc8}
.key-row-collapse.key-history-failed .key-history-brief,.key-row-collapse.key-history-failed .key-history-outcome-badge{color:#e8a090;background:rgba(232,160,144,.1);border:1px solid rgba(232,160,144,.28)}
+.key-rule-table-wrap{overflow-x:auto;margin:0 -2px}
+.key-rule-table{width:100%;min-width:720px;border-collapse:collapse;font-size:.72rem;line-height:1.45}
+.key-rule-table th,.key-rule-table td{border:1px solid #2a3348;padding:7px 9px;vertical-align:top;text-align:left}
+.key-rule-table th{background:rgba(0,0,0,.28);color:#9ab;font-weight:600;white-space:nowrap}
+.key-rule-table td{color:#c5cde0}
+.key-rule-table .key-rule-type{color:#fff;font-weight:600;line-height:1.35}
+.key-rule-table .key-rule-sub{color:#8fc8ff;font-size:.66rem;font-weight:500}
+.key-rule-list{margin:0;padding-left:1.15em}
+.key-rule-list li{margin:3px 0}
+.key-rule-foot{margin:8px 0 0;font-size:.68rem;color:#8892b0;line-height:1.4}
+.key-rule-foot code{font-size:.66rem;color:#8fc8ff}
{% macro key_direction_label(k) -%}
@@ -115,7 +126,9 @@
关键位监控规则说明
-
| 监控类型 | +方向与填写 | +触发 / 门控条件 | +止盈止损 | +执行方式 | +
|---|---|---|---|---|
| 箱体突破 收敛突破 |
+
+
|
+
+
|
+
+
|
+
+
|
+
| 斐波回调 0.618 / 0.786 |
+
+
|
+
+
|
+
+
|
+
+
|
+
| 假突破 BTC / ETH |
+
+
|
+
+
|
+
+
|
+
+
|
+
| 关键阻力位 关键支撑位 |
+
+
|
+
+
|
+
+
|
+
+
|
+
参数来自本实例 .env(如 KEY_BREAKOUT_AMP_MIN_PCT、KEY_AUTO_MIN_PLANNED_RR 等);修改后须重启实例生效。