diff --git a/backend/api/routes/system.py b/backend/api/routes/system.py index 3a82d1d..9d5a776 100644 --- a/backend/api/routes/system.py +++ b/backend/api/routes/system.py @@ -240,6 +240,35 @@ async def logs_test_write( } +@router.post("/trading/trigger-scan") +async def trigger_scan( + _admin: Dict[str, Any] = Depends(require_system_admin), +) -> Dict[str, Any]: + """ + 触发手动扫描: + 通过设置 Redis 信号(ats:trigger-scan),通知所有运行中的 strategy 进程立即执行扫描。 + """ + client = _get_redis_client_for_logs() + if client is None: + raise HTTPException(status_code=503, detail="Redis 不可用,无法触发扫描") + + try: + # 设置触发信号(当前时间戳),让 strategy 检测到变化 + import time + ts = int(time.time()) + # 使用 setex 设置 60秒过期,防止永久残留(虽然 strategy 只关心变化,但过期是个好习惯) + # 注意:strategy 端比较的是时间戳大小,所以只要比上一次大即可 + client.setex("ats:trigger-scan", 600, str(ts)) + + return { + "message": "已发送扫描触发信号", + "timestamp": ts + } + except Exception as e: + logger.error(f"触发扫描失败: {e}") + raise HTTPException(status_code=500, detail=f"触发扫描失败: {e}") + + def _get_redis_client_for_logs(): """ 获取 Redis 客户端(优先复用 config_manager 的连接;失败则自行创建)。 diff --git a/backend/sync_global_config_defaults.py b/backend/sync_global_config_defaults.py index 21eb1aa..285590b 100644 --- a/backend/sync_global_config_defaults.py +++ b/backend/sync_global_config_defaults.py @@ -30,7 +30,7 @@ DEFAULTS_TO_SYNC = [ "description": "做空时 RSI 低于此值则不做空(避免深超卖反弹)。2026-01-31新增。"}, {"config_key": "MAX_CHANGE_PERCENT_FOR_SHORT", "config_value": "10", "config_type": "number", "category": "strategy", "description": "做空时 24h 涨跌幅超过此值则不做空(24h 仍大涨时不做空)。单位:百分比数值。2026-01-31新增。"}, - {"config_key": "TAKE_PROFIT_1_PERCENT", "config_value": "0.2", "config_type": "number", "category": "strategy", + {"config_key": "TAKE_PROFIT_1_PERCENT", "config_value": "0.3", "config_type": "number", "category": "strategy", "description": "分步止盈第一目标(保证金百分比,如 0.2=20%)。2026-02-12 提高以改善盈亏比。"}, {"config_key": "MIN_RR_FOR_TP1", "config_value": "1.5", "config_type": "number", "category": "strategy", "description": "第一目标止盈相对止损的最小盈亏比(TP1 至少为止损距离的 1.5 倍)。2026-02-12 新增。"}, @@ -44,10 +44,10 @@ DEFAULTS_TO_SYNC = [ "description": "仓位放大系数:1.0=正常,1.2=+20%,上限2.0。盈利时适度调高可扩大收益。"}, {"config_key": "USE_FIXED_RISK_SIZING", "config_value": "true", "config_type": "boolean", "category": "risk", "description": "是否启用固定风险仓位计算(推荐)。若启用,则忽略 MAX_POSITION_PERCENT,改用 FIXED_RISK_PERCENT 计算仓位。"}, - {"config_key": "FIXED_RISK_PERCENT", "config_value": "0.025", "config_type": "number", "category": "risk", + {"config_key": "FIXED_RISK_PERCENT", "config_value": "0.03", "config_type": "number", "category": "risk", "description": "每笔交易风险占总账户的百分比(如 0.025=2.5%)。配合止损距离计算仓位,风险可控。"}, - {"config_key": "MIN_MARGIN_USDT", "config_value": "2.0", "config_type": "number", "category": "risk", - "description": "最小保证金(USDT)。2026-02-13 提高到 2.0 USDT 以避免无效小单。"}, + {"config_key": "MIN_MARGIN_USDT", "config_value": "10.0", "config_type": "number", "category": "risk", + "description": "最小保证金(USDT)。2026-02-13 提高到 10.0 USDT 以避免无效小单。"}, ] diff --git a/config-snapshot-2026-02-13T07-58-50-449Z.json b/config-snapshot-2026-02-13T07-58-50-449Z.json deleted file mode 100644 index 0d8f2f8..0000000 --- a/config-snapshot-2026-02-13T07-58-50-449Z.json +++ /dev/null @@ -1,643 +0,0 @@ -{ - "fetched_at": "2026-02-13T07:58:47.687Z", - "note": "display_value 对 PERCENT/PCT 做了百分比换算;敏感字段可选择脱敏/明文。", - "preset_detected": null, - "system_status": { - "running": true, - "pid": 4103975, - "program": "auto_sys", - "state": "RUNNING" - }, - "configs": [ - { - "key": "MAX_POSITION_PERCENT", - "category": "position", - "category_label": "仓位控制", - "type": "number", - "value": 0.002, - "display_value": 0.2, - "description": "预设方案配置项:MAX_POSITION_PERCENT" - }, - { - "key": "MAX_TOTAL_POSITION_PERCENT", - "category": "position", - "category_label": "仓位控制", - "type": "number", - "value": 0.008, - "display_value": 0.8, - "description": "预设方案配置项:MAX_TOTAL_POSITION_PERCENT" - }, - { - "key": "MIN_POSITION_PERCENT", - "category": "position", - "category_label": "仓位控制", - "type": "number", - "value": 0, - "display_value": 0, - "description": "预设方案配置项:MIN_POSITION_PERCENT" - }, - { - "key": "AUTO_TRADE_ALLOW_4H_NEUTRAL", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": false, - "display_value": false, - "description": "AUTO_TRADE_ALLOW_4H_NEUTRAL配置" - }, - { - "key": "AUTO_TRADE_ONLY_TRENDING", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "AUTO_TRADE_ONLY_TRENDING配置" - }, - { - "key": "BETA_FILTER_ENABLED", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "大盘共振过滤:BTC/ETH 下跌时屏蔽多单。" - }, - { - "key": "BETA_FILTER_THRESHOLD", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": -0.005, - "display_value": -0.005, - "description": "大盘共振阈值(比例,如 -0.005 表示 -0.5%)。" - }, - { - "key": "ENTRY_CHASE_MAX_STEPS", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 2, - "display_value": 2, - "description": "最大追价步数(逐步减小限价回调幅度,靠近当前价)。" - }, - { - "key": "ENTRY_CONFIRM_TIMEOUT_SEC", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 120, - "display_value": 120, - "description": "下单后确认成交等待时间(秒)。" - }, - { - "key": "ENTRY_MARKET_FALLBACK_AFTER_SEC", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 60, - "display_value": 60, - "description": "趋势强时:超过该时间仍未成交,会在偏离不超过上限时转市价兜底(减少错过)。" - }, - { - "key": "ENTRY_MAX_DRIFT_PCT_RANGING", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.3, - "display_value": 0.3, - "description": "震荡/弱趋势最大追价偏离(%)。例如 0.3 表示 0.3%。越小越保守。" - }, - { - "key": "ENTRY_MAX_DRIFT_PCT_TRENDING", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.8, - "display_value": 0.8, - "description": "趋势强时最大追价偏离(%)。例如 0.6 表示 0.6%。越小越保守。" - }, - { - "key": "ENTRY_SHORT_TREND_FILTER_ENABLED", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "预设方案配置项:ENTRY_SHORT_TREND_FILTER_ENABLED" - }, - { - "key": "ENTRY_STEP_WAIT_SEC", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 20, - "display_value": 20, - "description": "每次追价/调整前等待成交时间(秒)。" - }, - { - "key": "ENTRY_SYMBOL_COOLDOWN_SEC", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 1800, - "display_value": 1800, - "description": "预设方案配置项:ENTRY_SYMBOL_COOLDOWN_SEC" - }, - { - "key": "LEVERAGE", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 10, - "display_value": 10, - "description": "基础杠杆倍数" - }, - { - "key": "MAX_CHANGE_PERCENT_FOR_LONG", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.25, - "display_value": 25, - "description": "做多时 24h 涨跌幅超过此值则不开多(避免追大涨)。单位:百分比数值,如 25 表示 25%。2026-01-31新增。" - }, - { - "key": "MAX_CHANGE_PERCENT_FOR_SHORT", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.1, - "display_value": 10, - "description": "做空时 24h 涨跌幅超过此值则不做空(24h 仍大涨时不做空)。单位:百分比数值。2026-01-31新增。" - }, - { - "key": "MAX_LEVERAGE", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 20, - "display_value": 20, - "description": "最大杠杆倍数(动态杠杆上限,降低到15更保守)" - }, - { - "key": "MAX_RSI_FOR_LONG", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 65, - "display_value": 65, - "description": "做多时 RSI 超过此值则不开多(避免超买区追多)。2026-01-31新增。" - }, - { - "key": "MIN_RR_FOR_TP1", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 1.2, - "display_value": 1.2, - "description": "第一目标止盈相对止损的最小盈亏比(如 1.5 表示 TP1 至少为止损距离的 1.5 倍)。2026-02-12 新增。" - }, - { - "key": "MIN_RSI_FOR_SHORT", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 30, - "display_value": 30, - "description": "做空时 RSI 低于此值则不做空(避免深超卖反弹)。2026-01-31新增。" - }, - { - "key": "RSI_EXTREME_REVERSE_ONLY_NEUTRAL_4H", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": false, - "display_value": false, - "description": "建议开启:仅在 4H 趋势为中性时允许 RSI 反向单,避免在强趋势里逆势抄底/摸顶,降低风险。关闭则反向可与 4H 同向(仍受“禁止逆4H趋势”约束)。" - }, - { - "key": "SMART_ENTRY_ENABLED", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "预设方案配置项:SMART_ENTRY_ENABLED" - }, - { - "key": "SYMBOL_LOSS_COOLDOWN_ENABLED", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "是否启用同一交易对连续亏损后的冷却(避免连续亏损后继续交易)。2026-01-29新增。" - }, - { - "key": "SYMBOL_LOSS_COOLDOWN_SEC", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 3600, - "display_value": 3600, - "description": "连续亏损后的冷却时间(秒),默认1小时。2026-01-29新增。" - }, - { - "key": "SYMBOL_MAX_CONSECUTIVE_LOSSES", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 2, - "display_value": 2, - "description": "最大允许连续亏损次数(超过则禁止交易该交易对一段时间)。2026-01-29新增。" - }, - { - "key": "TAKE_PROFIT_1_PERCENT", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.2, - "display_value": 20, - "description": "分步止盈第一目标(保证金百分比,如 0.15=15%)。第一目标触发后了结50%仓位,剩余追求第二目标。" - }, - { - "key": "TRADING_PROFILE", - "category": "strategy", - "category_label": "策略参数", - "type": "string", - "value": "conservative", - "display_value": "conservative", - "description": "交易预设:conservative(稳健,低频+高门槛) / fast(快速验证,高频+宽松过滤)。仅作为默认值,具体参数仍可单独调整。" - }, - { - "key": "TRAILING_STOP_ACTIVATION", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.15, - "display_value": 0.15, - "description": "移动止损激活阈值(盈利10%后激活,给趋势更多空间)" - }, - { - "key": "TRAILING_STOP_PROTECT", - "category": "strategy", - "category_label": "策略参数", - "type": "number", - "value": 0.05, - "display_value": 0.05, - "description": "移动止损保护利润(保护5%利润,更合理)" - }, - { - "key": "USE_DYNAMIC_LEVERAGE", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "是否启用动态杠杆(根据信号强度调整杠杆倍数)" - }, - { - "key": "USE_TRAILING_STOP", - "category": "strategy", - "category_label": "策略参数", - "type": "boolean", - "value": true, - "display_value": true, - "description": "预设方案配置项:USE_TRAILING_STOP" - }, - { - "key": "ATR_MULTIPLIER_MAX", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.5, - "display_value": 0.5, - "description": "动态ATR倍数最大值0.5" - }, - { - "key": "ATR_MULTIPLIER_MIN", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.5, - "display_value": 0.5, - "description": "动态ATR倍数最小值0.5" - }, - { - "key": "ATR_PERIOD", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 7, - "display_value": 7, - "description": "ATR计算周期(默认7)" - }, - { - "key": "ATR_STOP_LOSS_MULTIPLIER", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 2.5, - "display_value": 2.5, - "description": "ATR止损倍数(0.4 - 0.6倍ATR,信号强 → 倍数低 (0.4);信号弱 → 倍数高 (0.6))" - }, - { - "key": "FIXED_RISK_PERCENT", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.02, - "display_value": 2, - "description": "每笔单子承受的风险百分比(相对于总资金)。例如 0.02 表示 2%。启用固定风险后,每笔亏损限制在该百分比内。" - }, - { - "key": "MAX_LEVERAGE_SMALL_CAP", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 8, - "display_value": 8, - "description": "高波动/小众币最大允许杠杆(与之前盈利阶段一致)。" - }, - { - "key": "MIN_LEVERAGE", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 8, - "display_value": 8, - "description": "动态杠杆下限(如 8 表示不低于 8 倍)。之前盈利阶段多为 8x,避免被压到 2–4x 导致单笔盈利过少。" - }, - { - "key": "MIN_STOP_LOSS_PRICE_PCT", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.025, - "display_value": 2.5, - "description": "最小止损价格变动:2%(防止止损过紧)" - }, - { - "key": "MIN_TAKE_PROFIT_PRICE_PCT", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.03, - "display_value": 3, - "description": "最小止盈价格变动:3%(防止止盈过紧)" - }, - { - "key": "POSITION_SCALE_FACTOR", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 1.25, - "display_value": 1.25, - "description": "仓位放大系数:1.0=正常,1.2=+20% 仓位,1.5=+50%,上限 2.0。盈利时适度调高可扩大收益,仍受单笔上限约束。" - }, - { - "key": "RISK_REWARD_RATIO", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 2, - "display_value": 2, - "description": "盈亏比(止损距离的倍数,用于计算止盈)" - }, - { - "key": "STOP_LOSS_PERCENT", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.1, - "display_value": 10, - "description": "止损:10%(相对于保证金)" - }, - { - "key": "TAKE_PROFIT_PERCENT", - "category": "risk", - "category_label": "风险控制", - "type": "number", - "value": 0.2, - "display_value": 20, - "description": "预设方案配置项:TAKE_PROFIT_PERCENT" - }, - { - "key": "USE_ATR_STOP_LOSS", - "category": "risk", - "category_label": "风险控制", - "type": "boolean", - "value": true, - "display_value": true, - "description": "是否使用ATR动态止损(优先于固定百分比)" - }, - { - "key": "USE_DYNAMIC_ATR_MULTIPLIER", - "category": "risk", - "category_label": "风险控制", - "type": "boolean", - "value": false, - "display_value": false, - "description": "是否根据波动率动态调整ATR倍数" - }, - { - "key": "USE_FIXED_RISK_SIZING", - "category": "risk", - "category_label": "风险控制", - "type": "boolean", - "value": true, - "display_value": true, - "description": "使用固定风险百分比计算仓位(凯利公式)。启用后,每笔单子承受的风险固定为 FIXED_RISK_PERCENT,避免大额亏损。" - }, - { - "key": "ATR_TAKE_PROFIT_MULTIPLIER", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 2, - "display_value": 2, - "description": "预设方案配置项:ATR_TAKE_PROFIT_MULTIPLIER" - }, - { - "key": "CONFIRM_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "string", - "value": "4h", - "display_value": "4h", - "description": "确认周期:4小时" - }, - { - "key": "ENTRY_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "string", - "value": "15m", - "display_value": "15m", - "description": "入场周期:15分钟" - }, - { - "key": "EXCLUDE_MAJOR_COINS", - "category": "scan", - "category_label": "市场扫描", - "type": "boolean", - "value": true, - "display_value": true, - "description": "是否排除主流币(BTC、ETH、BNB等),专注于山寨币。山寨币策略建议开启。" - }, - { - "key": "KLINE_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "string", - "value": "1h", - "display_value": "1h", - "description": "K线周期:1小时" - }, - { - "key": "LIMIT_ORDER_OFFSET_PCT", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 0.1, - "display_value": 0.1, - "description": "预设方案配置项:LIMIT_ORDER_OFFSET_PCT" - }, - { - "key": "MAX_DAILY_ENTRIES", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 10, - "display_value": 10, - "description": "预设方案配置项:MAX_DAILY_ENTRIES" - }, - { - "key": "MAX_OPEN_POSITIONS", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 5, - "display_value": 5, - "description": "预设方案配置项:MAX_OPEN_POSITIONS" - }, - { - "key": "MAX_SCAN_SYMBOLS", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 500, - "display_value": 500, - "description": "扫描的最大交易对数量(0表示扫描所有,建议100-500)" - }, - { - "key": "MAX_TREND_MOVE_BEFORE_ENTRY", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 0.05, - "display_value": 0.05, - "description": "预设方案配置项:MAX_TREND_MOVE_BEFORE_ENTRY" - }, - { - "key": "MIN_CHANGE_PERCENT", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 0.02, - "display_value": 2, - "description": "最小涨跌幅阈值:2%" - }, - { - "key": "MIN_HOLD_TIME_SEC", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 1800, - "display_value": 1800, - "description": "预设方案配置项:MIN_HOLD_TIME_SEC" - }, - { - "key": "MIN_SIGNAL_STRENGTH", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 8, - "display_value": 8, - "description": "预设方案配置项:MIN_SIGNAL_STRENGTH" - }, - { - "key": "MIN_VOLATILITY", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 0.02, - "display_value": 0.02, - "description": "最小波动率:2%" - }, - { - "key": "MIN_VOLUME_24H", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 10000000, - "display_value": 10000000, - "description": "最小24小时成交量:1000万USDT" - }, - { - "key": "MIN_VOLUME_24H_STRICT", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 50000000, - "display_value": 50000000, - "description": "严格成交量过滤,24H Volume低于此值(USD)直接剔除" - }, - { - "key": "POSITION_SYNC_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 60, - "display_value": 60, - "description": "持仓状态同步间隔(秒),默认1分钟,用于同步币安实际持仓与数据库状态" - }, - { - "key": "PRIMARY_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "string", - "value": "1h", - "display_value": "1h", - "description": "主周期:1小时" - }, - { - "key": "SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 15, - "display_value": 15, - "description": "智能补单:多返回的候选数量。当前 TOP_N 中部分因冷却等被跳过时,仍会尝试这批额外候选,避免无单可下。" - }, - { - "key": "SCAN_INTERVAL", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 1800, - "display_value": 1800, - "description": "预设方案配置项:SCAN_INTERVAL" - }, - { - "key": "TOP_N_SYMBOLS", - "category": "scan", - "category_label": "市场扫描", - "type": "number", - "value": 20, - "display_value": 20, - "description": "预设方案配置项:TOP_N_SYMBOLS" - } - ] -} \ No newline at end of file diff --git a/frontend/src/components/ConfigPanel.jsx b/frontend/src/components/ConfigPanel.jsx index fff0316..7e0ee71 100644 --- a/frontend/src/components/ConfigPanel.jsx +++ b/frontend/src/components/ConfigPanel.jsx @@ -416,6 +416,19 @@ const ConfigPanel = () => { } } + const handleTriggerScan = async () => { + setSystemBusy(true) + setMessage('') + try { + const res = await api.triggerScan() + setMessage(res.message || '已触发手动扫描') + } catch (e) { + setMessage('触发扫描失败: ' + (e?.message || '未知错误')) + } finally { + setSystemBusy(false) + } + } + const handleRestartTrading = async () => { setSystemBusy(true) setMessage('') @@ -908,6 +921,9 @@ const ConfigPanel = () => {