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 @@
关键位监控规则说明 -
{{ key_gate_rule_text }}
+
+ {% include 'key_monitor_rule_tips.html' %} +
{% for k in key %} diff --git a/strategy_templates/key_monitor_rule_tips.html b/strategy_templates/key_monitor_rule_tips.html new file mode 100644 index 0000000..537b4ed --- /dev/null +++ b/strategy_templates/key_monitor_rule_tips.html @@ -0,0 +1,140 @@ +{% set r = key_rule_ctx %} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
监控类型方向与填写触发 / 门控条件止盈止损执行方式
箱体突破
收敛突破
+
    +
  • 方向:必选做多 / 做空
  • +
  • 上沿 H / 下沿 L:箱体或收敛结构上下界(H > L)
  • +
  • 方案:标准突破 / 箱体1R·止盈1.5H / 趋势单(自填止盈)
  • +
  • 移动保本:添加时可勾选
  • +
+
+
    +
  • 周期 {{ r.tf }},取两根已闭合 K(突破棒索引 {{ r.breakout_bar }}、确认棒 {{ r.confirm_bar }})
  • +
  • 突破棒收盘越过关键位幅度 > {{ r.amp_min_pct }}%
  • +
  • 确认棒收盘须收于箱外(不得回到 [L, H] 内)
  • +
  • 突破棒成交量 > 前 {{ r.vol_ma_bars }} 根均量 × {{ r.vol_ratio_min }}
  • +
  • 24h 成交额排名 ≤ {{ r.vol_rank_max }}
  • +
  • 按确认收盘 E 计算计划盈亏比 > {{ r.min_rr }} : 1
  • +
+
+
    +
  • 标准突破:SL = 突破 K 极值外 {{ r.stop_outside_pct }}%;TP = E ± 1×箱体高度 H
  • +
  • 箱体1R·止盈1.5H:SL = E ∓ 1×H;TP = E ∓ 1.5×H
  • +
  • 趋势单:SL = 突破 K 极值外 {{ r.trend_stop_outside_pct }}%;TP = 表单自填价
  • +
+
+
    +
  • 门控全部通过 → 自动市价开仓(须开启实盘、持仓未达上限)
  • +
  • 开仓后写入「下单监控」,本条从关键位列表移除
  • +
  • 持仓已满时不可再添加箱体 / 收敛类型
  • +
+
斐波回调
0.618 / 0.786
+
    +
  • 方向:必选做多 / 做空
  • +
  • 上沿 H / 下沿 L:斐波波段高低点
  • +
  • 系统按比率自动计算挂单价 E、止损 SL、止盈 TP
  • +
+
+
    +
  • 做多:E = H − ratio×(H−L),SL = L,TP = H
  • +
  • 做空:E = L + ratio×(H−L),SL = H,TP = L
  • +
  • 计划 RR 须 > {{ r.min_rr }} : 1 方可挂单
  • +
  • 标记价先触达止盈侧(多:≥H;空:≤L)→ 计划失效撤单
  • +
+
+
    +
  • SL / TP 由斐波公式固定,见左列
  • +
  • 成交后按仓位挂交易所 TP/SL
  • +
+
+
    +
  • 添加后挂限价单,等待成交
  • +
  • 成交 → 写入下单监控;未成交可手动删除
  • +
+
假突破
BTC / ETH
+
    +
  • 币种:仅 BTC、ETH
  • +
  • 做空:关键价位填高点
  • +
  • 做多:关键价位填低点
  • +
  • 同币种同时仅允许一条假突破监控
  • +
+
+
    +
  • 限价挂在关键价外侧 {{ r.fb_offset_pct }}%
  • +
  • 止损幅度 {{ r.fb_sl_pct }}%,计划 RR = {{ r.fb_rr }} : 1
  • +
  • 挂单有效期 {{ r.fb_valid_hours }} 小时,过期自动结案
  • +
+
+
    +
  • 系统按方向自动算 E / SL / TP(RR {{ r.fb_rr }})
  • +
  • 可勾选移动保本
  • +
+
+
    +
  • 添加后立即挂限价单
  • +
  • 成交 → 下单监控;过期 / 手动删除 → 关键位历史
  • +
+
关键阻力位
关键支撑位
+
    +
  • 方向:自动「双向」,无需选择
  • +
  • 上沿:阻力 / 箱体上界
  • +
  • 下沿:支撑 / 箱体下界
  • +
+
+
    +
  • {{ r.tf }} 最近一根已闭合 K 收盘严格突破上沿(>)或下沿(<)
  • +
  • 上沿优先:同一根 K 不会双向同时触发
  • +
+
+
    +
  • 无自动止盈止损(仅提醒,不开仓)
  • +
+
+
    +
  • 企业微信提醒,最多 {{ r.alert_max }}
  • +
  • 两次提醒间隔 ≥ {{ r.alert_interval_min }} 分钟
  • +
  • 提醒完成或手动删除后记入历史
  • +
+
+
+

参数来自本实例 .env(如 KEY_BREAKOUT_AMP_MIN_PCTKEY_AUTO_MIN_PLANNED_RR 等);修改后须重启实例生效。