diff --git a/app.py b/app.py index 5172f41..7f56cb8 100644 --- a/app.py +++ b/app.py @@ -49,6 +49,7 @@ from lib.key_monitor.key_monitor_lib import ( is_fib_key_monitor_type, is_false_breakout_key_monitor_type, is_limit_key_monitor_type, + is_rs_key_monitor_type, is_trigger_entry_key_monitor_type, key_monitor_rule_template_context, key_signal_type_for_trade_record, @@ -5118,6 +5119,12 @@ def render_main_page(page="options", embed_mode=None): key_list = ( conn.execute("SELECT * FROM key_monitors").fetchall() if plan.key_list else [] ) + if key_list: + key_list = [ + r + for r in key_list + if is_rs_key_monitor_type((r["monitor_type"] or "").strip()) + ] key_history = ( conn.execute( "SELECT * FROM key_monitor_history WHERE closed_at >= ? AND closed_at <= ? ORDER BY id DESC LIMIT 500", diff --git a/lib/common/static/instance_settings_prefs.js b/lib/common/static/instance_settings_prefs.js index 1d93e73..e8d15e6 100644 --- a/lib/common/static/instance_settings_prefs.js +++ b/lib/common/static/instance_settings_prefs.js @@ -24,6 +24,7 @@ show_nav_dashboard: true, show_nav_account_ledger: true, show_nav_system_guide: true, + show_settings_transfer: true, }; function navPrefShow(display, key) { diff --git a/lib/env/env_schema.py b/lib/env/env_schema.py index 5f660cd..7812ae4 100644 --- a/lib/env/env_schema.py +++ b/lib/env/env_schema.py @@ -165,7 +165,6 @@ SELECT_OPTIONS: dict[str, tuple[tuple[str, str], ...]] = { ), "OKX_TRADE_MODE": ( ("options", "单独期权"), - ("perp_options", "永期对冲"), ("options_options", "期期对冲"), ), "OKX_OPTIONS_MARGIN_MODE": ( diff --git a/lib/env/env_ui_manifest.py b/lib/env/env_ui_manifest.py index 7e8c5ac..9804e56 100644 --- a/lib/env/env_ui_manifest.py +++ b/lib/env/env_ui_manifest.py @@ -17,20 +17,18 @@ from lib.env.env_schema import ( ) # 各所「交易所与实盘」字段(顺序即页面顺序) +# 合约计仓/杠杆/自动单等已从 env UI 移除;永续划转等见系统设置开关(默认关) _EXCHANGE_LIVE_FIELDS: dict[str, list[tuple[str, str, str]]] = { "okx": [ - ("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"), - ("OKX_API_KEY", "API Key", "账户 API(永续+期权共用)"), - ("OKX_API_SECRET", "API Secret", "账户 API(永续+期权共用)"), + ("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单(期权/对冲共用)"), + ("OKX_API_KEY", "API Key", "账户 API(永续腿+期权共用)"), + ("OKX_API_SECRET", "API Secret", "账户 API(永续腿+期权共用)"), ("OKX_API_PASSPHRASE", "API Passphrase", "OKX 必填"), - ("OKX_TD_MODE", "保证金模式", ""), - ("OKX_POS_MODE", "持仓模式", ""), - ("OKX_POSITION_INST_TYPE", "仓位查询类型", "如 SWAP"), ("OKX_ACCOUNT_LABEL", "账户备注", "企业微信推送中显示"), ( "OKX_SHOW_PERP_FUNDS", "显示永续资金", - "默认开启;关闭后顶栏隐藏 USDT 资金账户与交易账户,总资金仅计期权 USDC 侧", + "默认关闭;开启后顶栏显示 USDT 资金/交易账户。币本位期权仍会显示交易账户以便买币", ), ], "binance": [ @@ -51,6 +49,7 @@ _EXCHANGE_LIVE_FIELDS: dict[str, list[tuple[str, str, str]]] = { ], } +# 仅保留与期权/对冲产品相关的共享区块(永续执行/风控/冷静期/划转/当日资金已从 UI 移除) _SHARED_SECTIONS: list[dict[str, Any]] = [ { "title": "企业微信", @@ -59,70 +58,6 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [ ("WECHAT_TIMEOUT_SECONDS", "推送超时(秒)", "默认 10"), ], }, - { - "title": "交易执行", - "fields": [ - ("POSITION_SIZING_MODE", "计仓模式", "切换须无仓后重启"), - ("RISK_PERCENT", "以损定仓风险%", "单笔风险占资金比例"), - ("FULL_MARGIN_BUFFER_RATIO", "全仓资金缓冲比例", "如 0.98"), - ("BTC_LEVERAGE", "BTC 默认杠杆", ""), - ("ALT_LEVERAGE", "山寨默认杠杆", ""), - ("TRADE_DIRECTION_RESTRICT_ENABLED", "方向限制开关", ""), - ("TRADE_DIRECTION", "允许方向", "需同时开启「方向限制开关」才生效"), - ("TRADE_SYMBOL_RESTRICT_ENABLED", "币种白名单开关", ""), - ("TRADE_SYMBOL_WHITELIST", "白名单币种", "逗号分隔,如 BTC,ETH"), - ("TRADING_DAY_RESET_HOUR", "交易日切点(北京时间)", "整点,默认 8"), - ( - "TRADING_DAY_RESET_OPEN_GUARD_ENABLED", - "切点前禁止新开仓", - "默认 true;开启则北京时间切点前禁止斐波登记与人工开仓;说明见风控说明·交易执行", - ), - ("MAX_ACTIVE_POSITIONS", "最大同时持仓", ""), - ("MANUAL_MIN_PLANNED_RR", "人工最低盈亏比", "如 1.4"), - ("KEY_AUTO_ORDER_ENABLED", "关键位自动单", "关闭后箱体/收敛/斐波等不自动开仓;支撑阻力提醒仍可用"), - ("KEY_AUTO_MIN_PLANNED_RR", "关键位最低盈亏比", "自动单计划 RR 须严格大于该值,默认 1.5"), - ("FORCE_CLOSE_ENABLED", "强制清仓开关", ""), - ("FORCE_CLOSE_BJ_HOUR", "强制清仓整点(北京)", ""), - ("FORCE_CLOSE_GRACE_MINUTES", "强制清仓窗口(分钟)", "默认 5;整点起该分钟内执行并禁止开仓"), - ], - }, - { - "title": "交易风控", - "fields": [ - ("DAILY_OPEN_ALERT_THRESHOLD", "单日开仓提醒阈值", "达次数后 AI 提醒,不拦单"), - ("DAILY_OPEN_HARD_LIMIT", "单日开仓硬上限", "0=不启用"), - ], - }, - { - "title": "账户冷静期", - "fields": [ - ("RISK_CONTROL_ENABLED", "冷静期总开关", ""), - ("RISK_COOLING_HOURS_MANUAL", "手动平仓冷静(小时)", ""), - ("RISK_COOLING_HOURS_MANUAL_JOURNAL", "复盘情绪冷静(小时)", ""), - ("RISK_MANUAL_CLOSE_DAILY_LIMIT", "日手动平仓次数上限", ""), - ("RISK_DAILY_LOSS_LIMIT", "日亏损次数上限", "默认2;达限当日冻结开仓;0=不因亏损次数冻结"), - ("RISK_MOOD_ISSUES_DAILY_FREEZE", "情绪标签日冻结", ""), - ], - }, - { - "title": "自动划转", - "fields": [ - ("AUTO_TRANSFER_ENABLED", "启用自动划转", ""), - ("AUTO_TRANSFER_AMOUNT", "目标余额(U)", "交易账户目标 USDT"), - ("AUTO_TRANSFER_FROM", "划出账户", "余额不足时从此账户划入交易账户"), - ("AUTO_TRANSFER_TO", "划入账户", "目标余额所在账户,一般为 swap"), - ("AUTO_TRANSFER_BJ_HOUR", "执行整点(北京时间)", ""), - ("TRANSFER_CCY", "划转币种", ""), - ], - }, - { - "title": "当日资金", - "fields": [ - ("DAILY_START_CAPITAL", "日起始基数(U)", ""), - ("DAILY_LOSS_CAPITAL", "回撤后基数(U)", ""), - ("DAILY_PROFIT_CAPITAL", "盈利后基数(U)", ""), - ], - }, ] _MODE_SECTION: dict[str, Any] = { @@ -132,7 +67,7 @@ _MODE_SECTION: dict[str, Any] = { ( "OKX_TRADE_MODE", "交易模式", - "三选一:单独期权 / 永期对冲 / 期期对冲.选单独期权时隐藏对冲导航与对冲配置;选对冲时不可单独开期权", + "二选一:单独期权 / 期期对冲。选单独期权时隐藏对冲导航与对冲配置;选期期对冲时不可单独开期权。永期对冲(含合约腿)已从配置页移除", ), ], } @@ -318,7 +253,7 @@ _RUNTIME_ENV_DEFAULTS: dict[str, str] = { "TRANSFER_CCY": "USDT", "HEDGE_PLAN_SHOW_PERP_OPTIONS": "true", "HEDGE_PLAN_SHOW_OPTIONS_OPTIONS": "true", - "OKX_SHOW_PERP_FUNDS": "true", + "OKX_SHOW_PERP_FUNDS": "false", "OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED": "true", "OKX_OPTIONS_CHAIN_MAX_DTE_DAYS": "14", "OKX_OPTIONS_MAX_DTE_DAYS": "2", @@ -414,6 +349,15 @@ def _build_field( if options: cur = (out["current"] or out["default"] or "").strip() opt_vals = {o["value"] for o in options} + # 永期对冲不再作为可选模式;已选历史值也不塞回下拉,避免继续强化合约 UI + if key == "OKX_TRADE_MODE" and cur == "perp_options": + cur = "" + out["current"] = "options" + out["default"] = "options" + out["note"] = ( + (out.get("note") or "") + + "(当前 .env 仍为永期对冲:请改选「单独期权」或「期期对冲」后保存并重启)" + ).strip() if cur and cur not in opt_vals: options = [{"value": cur, "label": cur}] + options out["options"] = options @@ -462,10 +406,12 @@ def ui_sections_for_exchange( m = _okx_mode_for_env_ui() sections.append(_MODE_SECTION) sections.append({"title": "期权账户", "fields": _options_fields_for_mode(m)}) - hedge_fields = _hedge_fields_for_mode(m) - if hedge_fields: - title = "对冲计划·永期" if m == "perp_options" else "对冲计划·期期" - sections.append({"title": title, "fields": hedge_fields}) + # 永期对冲配置块不再展示(含合约腿);期期仍展示 + if m != "perp_options": + hedge_fields = _hedge_fields_for_mode(m) + if hedge_fields: + title = "对冲计划·期期" + sections.append({"title": title, "fields": hedge_fields}) return sections diff --git a/lib/hedge_plan/okx_trade_mode_lib.py b/lib/hedge_plan/okx_trade_mode_lib.py index 2da692c..2467134 100644 --- a/lib/hedge_plan/okx_trade_mode_lib.py +++ b/lib/hedge_plan/okx_trade_mode_lib.py @@ -1,8 +1,8 @@ -"""OKX 期权/对冲三选一模式(env: OKX_TRADE_MODE). +"""OKX 期权/对冲模式(env: OKX_TRADE_MODE). options → 仅单独期权(隐藏对冲导航与对冲 env 配置) -perp_options → 仅永期对冲(不可单独开期权;对冲组数上限 MAX_ACTIVE_HEDGE_PLANS) -options_options → 仅期期对冲(同上) +options_options → 仅期期对冲(不可单独开期权) +perp_options → 永期对冲(含合约腿);产品 UI 已隐藏,仅兼容旧 .env / 历史计划 """ from __future__ import annotations @@ -13,6 +13,8 @@ MODE_OPTIONS = "options" MODE_PERP = "perp_options" MODE_OO = "options_options" VALID_MODES = frozenset({MODE_OPTIONS, MODE_PERP, MODE_OO}) +# 配置页可选模式(不含永期) +UI_MODES = frozenset({MODE_OPTIONS, MODE_OO}) _ALIASES = { "option": MODE_OPTIONS, diff --git a/lib/instance/instance_display_prefs_lib.py b/lib/instance/instance_display_prefs_lib.py index 734e246..9d9afd0 100644 --- a/lib/instance/instance_display_prefs_lib.py +++ b/lib/instance/instance_display_prefs_lib.py @@ -22,7 +22,7 @@ DEFAULT_INSTANCE_DISPLAY: dict[str, bool] = { "show_nav_options": True, "show_nav_options_review": True, "show_nav_hedge_plan": True, - "show_settings_transfer": True, + "show_settings_transfer": False, # 永续资金划转默认隐藏 "show_settings_export": True, "show_settings_password": True, "show_settings_options_swap": True, @@ -44,7 +44,7 @@ DISPLAY_LABELS: dict[str, str] = { "show_nav_options": "期权", "show_nav_options_review": "期权复盘", "show_nav_hedge_plan": "对冲计划", - "show_settings_transfer": "资金划转", + "show_settings_transfer": "永续资金划转", "show_settings_export": "数据导出", "show_settings_password": "账户密码修改", "show_settings_options_swap": "期权币种兑换", diff --git a/lib/instance/instance_embed_context_lib.py b/lib/instance/instance_embed_context_lib.py index 3962ed3..773d546 100644 --- a/lib/instance/instance_embed_context_lib.py +++ b/lib/instance/instance_embed_context_lib.py @@ -22,7 +22,8 @@ def show_perp_funds_enabled(*, exchange_key: str | None = None) -> bool: ex = (exchange_key or "").strip().lower() if ex and ex != "okx": return True - return env_truthy(os.getenv("OKX_SHOW_PERP_FUNDS"), default=True) + # 默认关闭:产品以期权/期期对冲为主;币本位买币时由调用方另或 True + return env_truthy(os.getenv("OKX_SHOW_PERP_FUNDS"), default=False) @dataclass(frozen=True) diff --git a/lib/instance/instance_settings_lib.py b/lib/instance/instance_settings_lib.py index 694906a..921c66c 100644 --- a/lib/instance/instance_settings_lib.py +++ b/lib/instance/instance_settings_lib.py @@ -127,7 +127,7 @@ def build_settings_tabs(display: dict[str, Any] | None, instance_settings: dict[ tabs.append({"key": "sim_funds", "title": "模拟资金"}) if disp.get("show_settings_password", True): tabs.append({"key": "password", "title": "账户密码"}) - if inst.get("show_transfer") and disp.get("show_settings_transfer", True): + if inst.get("show_transfer") and disp.get("show_settings_transfer", False): tabs.append({"key": "transfer", "title": "永续划转"}) if disp.get("show_settings_export", True): tabs.append({"key": "export", "title": "数据导出"}) diff --git a/lib/instance/templates/display_prefs_panel.html b/lib/instance/templates/display_prefs_panel.html index edcbecc..0702e0e 100644 --- a/lib/instance/templates/display_prefs_panel.html +++ b/lib/instance/templates/display_prefs_panel.html @@ -10,7 +10,7 @@