From e2c37e6d62c7d5254518e606b1a160beaf6a3875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sun, 1 Mar 2026 17:40:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=A8=E6=97=A5=E5=BC=80=E4=BB=93=E9=99=90?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/routes/config.py | 7 ++++++- frontend/src/components/GlobalConfig.jsx | 21 +++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 4d124d4..a37dd96 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -431,7 +431,12 @@ async def get_global_configs( for k, meta in FIXED_RISK_CONFIG_DEFAULTS.items(): if k not in result: result[k] = meta - + + # 周日/晚间控制(周六 21 点~周日 06 点等),确保全局配置页可见可改 + for k, meta in RISK_KNOBS_DEFAULTS.items(): + if k not in result: + result[k] = meta + # 添加更多核心策略配置的默认值(确保前端能显示所有重要配置) ADDITIONAL_STRATEGY_DEFAULTS = { "BETA_FILTER_ENABLED": { diff --git a/frontend/src/components/GlobalConfig.jsx b/frontend/src/components/GlobalConfig.jsx index 2633777..942f3ab 100644 --- a/frontend/src/components/GlobalConfig.jsx +++ b/frontend/src/components/GlobalConfig.jsx @@ -40,6 +40,12 @@ const KEY_LABELS = { SYNC_RECOVER_MISSING_POSITIONS: '同步时补建缺失持仓', SYNC_RECOVER_ONLY_WHEN_HAS_SLTP: '仅当有止损/止盈单时补建', SYSTEM_ORDER_ID_PREFIX: '系统单 clientOrderId 前缀', + SUNDAY_MAX_OPENS: '周日开仓上限', + SUNDAY_MIN_SIGNAL_STRENGTH: '周日最低信号强度', + NIGHT_HOURS_NO_OPEN_ENABLED: '晚间禁止开新仓', + NIGHT_HOURS_START: '禁止开仓开始(时)', + NIGHT_HOURS_END: '禁止开仓结束(时)', + NIGHT_HOURS_ONLY_SUNDAY: '仅周六21点~周日06点', SCAN_STAGGER_BY_ACCOUNT: '多账号错峰扫描', SCAN_STAGGER_RANDOM: '错峰随机模式', SCAN_STAGGER_MIN_SEC: '错峰最小延迟(秒)', @@ -614,6 +620,13 @@ const GlobalConfig = () => { SCAN_STAGGER_MIN_SEC: { value: 10, type: 'number', category: 'scan', description: '随机错峰模式下的最小延迟秒数。例如 10 表示至少延迟 10 秒。' }, SCAN_STAGGER_MAX_SEC: { value: 120, type: 'number', category: 'scan', description: '随机错峰模式下的最大延迟秒数。例如 120 表示至多延迟 120 秒。' }, SCAN_STAGGER_SEC: { value: 60, type: 'number', category: 'scan', description: '固定错峰模式下每个账号之间的步长(秒)。延迟 = (account_id-1)*SCAN_STAGGER_SEC。' }, + // 周日/晚间控制(周六 21 点~周日 06 点禁止开仓等),全局配置中可见 + SUNDAY_MAX_OPENS: { value: 3, type: 'number', category: 'risk', description: '周日最多开仓次数,0=不限制;2-3 可降低周日亏损。' }, + SUNDAY_MIN_SIGNAL_STRENGTH: { value: 8, type: 'number', category: 'risk', description: '周日最低信号强度(0-10),仅当>=此值才开仓,0=不提高。' }, + NIGHT_HOURS_NO_OPEN_ENABLED: { value: true, type: 'boolean', category: 'risk', description: '晚间/凌晨禁止开新仓。开启后 21:00~06:00(北京)不开新仓。' }, + NIGHT_HOURS_START: { value: 21, type: 'number', category: 'risk', description: '禁止开仓开始小时(北京),含。从周六晚 21 点开始控制。' }, + NIGHT_HOURS_END: { value: 6, type: 'number', category: 'risk', description: '禁止开仓结束小时(北京),不含。' }, + NIGHT_HOURS_ONLY_SUNDAY: { value: true, type: 'boolean', category: 'risk', description: 'True=仅周六21:00~周日06:00禁止;False=每天21:00~06:00禁止。' }, } const loadConfigs = async () => { @@ -1922,11 +1935,11 @@ const GlobalConfig = () => { // 过滤逻辑 const filteredConfigs = Object.entries(configs).filter(([key, config]) => { - // 1. 基础过滤(排除非对象、风险旋钮、API Key) + // 1. 基础过滤(排除非对象、仅排除部分风险旋钮与 API Key;周日/晚间控制在全局配置中展示) if (!config || typeof config !== 'object') return false - const RISK_KNOBS_KEYS = ['MIN_MARGIN_USDT', 'MIN_POSITION_PERCENT', 'MAX_POSITION_PERCENT', - 'MAX_TOTAL_POSITION_PERCENT', 'AUTO_TRADE_ENABLED', 'MAX_OPEN_POSITIONS', 'MAX_DAILY_ENTRIES', 'SUNDAY_MAX_OPENS', 'SUNDAY_MIN_SIGNAL_STRENGTH', 'NIGHT_HOURS_NO_OPEN_ENABLED', 'NIGHT_HOURS_START', 'NIGHT_HOURS_END', 'NIGHT_HOURS_ONLY_SUNDAY'] - if (RISK_KNOBS_KEYS.includes(key)) return false + const HIDDEN_RISK_KNOBS = ['MIN_MARGIN_USDT', 'MIN_POSITION_PERCENT', 'MAX_POSITION_PERCENT', + 'MAX_TOTAL_POSITION_PERCENT', 'AUTO_TRADE_ENABLED', 'MAX_OPEN_POSITIONS', 'MAX_DAILY_ENTRIES'] + if (HIDDEN_RISK_KNOBS.includes(key)) return false if (key === 'BINANCE_API_KEY' || key === 'BINANCE_API_SECRET' || key === 'USE_TESTNET') return false // 2. Tab 过滤