ff8caf7f8d
Treat naive app datetimes as local time, normalize legacy UTC-ms rows, and resolve cooloff end from stored until or last_close+duration. Co-authored-by: Cursor <cursoragent@cursor.com>
4.5 KiB
4.5 KiB
账户冷静期 / 日冻结风控
四所实例(币安 / OKX / Gate / Gate 趋势)共用 account_risk_lib.py。
仅用户主动平仓计入风控;交易所止盈/止损、空仓同步、改保本/改委托等不触发冷静期。
状态展示
实例页顶、中控监控卡片账户名旁显示风控徽章:
| 状态 | 含义 | 倒计时 |
|---|---|---|
| 正常 | 可新开仓 | 无 |
| 1h冻结 | 冷静期中(通常为复盘后缩短的 1 小时) | 剩余时间,如 1h冻结 · 52m 08s |
| 4h冻结 | 冷静期中(默认 4 小时) | 剩余时间,如 4h冻结 · 3h 12m |
| 日冻结 | 当日禁止一切新开仓 | 至下一 交易日切点(TRADING_DAY_RESET_HOUR) |
- 倒计时每秒刷新;到期后徽章自动恢复为 正常(下次轮询/API 刷新会再次对齐服务端状态)。
- 鼠标悬停徽章可见完整说明(含解除时刻,如有)。
什么算「手动平仓」(计入风控)
以下操作通过 close_source 登记为 用户主动平仓:
| 来源标识 | 操作 |
|---|---|
user_instance |
实例页删单/手动平仓(del_order) |
user_hub |
中控「平仓」「全平」「紧急全平」 |
user_trend_stop |
趋势计划 「结束计划」(手动结束) |
不算手动平仓(不触发风控):
- 趋势 「保本移交下单监控」
- 中控/实例修改委托、挂止盈止损、移动保本
- 交易所止盈/止损/条件单成交
- 后台
reconcile_external_closes空仓同步(即使记账为「外部平仓」) - 监控轮询自动止盈/止损/保本
触发规则
| 事件 | 行为 |
|---|---|
| 第 1 次用户主动平仓 | 默认 4h 冷静期 |
| 第 2 次用户主动平仓(同一交易日) | 日冻结 |
| 复盘勾选任意情绪标签 | 日冻结 |
| 复盘:离场=手动平仓 且说明非空 | 将当前冷静期降为 1h(须处于 4h 档冷静期中) |
情绪标签:怕踏空、报复开仓、盈利飘了、拿不住单、扛单、重仓违规。
复盘缩短为 1h
任选一种方式,并填写说明:
| 方式 | 必填 |
|---|---|
| 复盘表单提交 | 离场触发 = 手动平仓;离场补充 非空(不是下方「备注」) |
| 核对修改保存 | 结果 = 手动平仓;备注 非空 |
说明:
- 中控全平 / 实例手动平仓后,只要在 4h 窗口内完成上述操作即可降为 1h。
- 若超过「平仓 + 1h」才复盘,则从 保存复盘时刻 起再计 1h(不延长原 4h)。
- 代码更新后需 重启对应实例 并硬刷新页面。
环境变量
RISK_CONTROL_ENABLED=true
RISK_COOLING_HOURS_MANUAL=4
RISK_COOLING_HOURS_MANUAL_JOURNAL=1
RISK_MANUAL_CLOSE_DAILY_LIMIT=2
RISK_MOOD_ISSUES_DAILY_FREEZE=true
TRADING_DAY_RESET_HOUR=8
APP_TIMEZONE=Asia/Shanghai
RISK_COOLING_HOURS_EXTERNAL 已废弃(外部平仓不再触发风控)。
API 与 risk_status 字段
| 接口 | 说明 |
|---|---|
GET /api/account_snapshot |
实例页轮询,含 risk_status |
GET /api/account_risk_status |
hub_bridge 专用 |
GET /api/hub/monitor |
中控监控板,每账户含 risk_status |
POST /api/hub/account-risk/user-close |
中控登记用户平仓,body: { source, count } |
risk_status 主要字段:
| 字段 | 说明 |
|---|---|
status |
normal / freeze_1h / freeze_4h / freeze_daily |
status_label |
中文标签 |
can_trade |
是否允许新开仓(仅风控维度) |
reason |
悬停提示文案 |
cooloff_until_ms |
1h/4h 冷静期结束时间戳(毫秒) |
freeze_until_ms |
倒计时结束时间戳(日冻结为下一交易日切点) |
freeze_remaining_sec |
服务端计算的剩余秒数(供调试) |
前端倒计时
- 共用脚本:
static/account_risk_badge.js(实例/static/…,中控/assets/account_risk_badge.js) - 样式:
static/account_risk_badge.css - 展示格式:
4h冻结 · 3h 12m;日冻结为距下一交易日切点剩余时间 - 时间戳按
APP_TIMEZONE(默认Asia/Shanghai) 计算,与实例app_now()一致;旧版 naive-as-UTC 写入的库内毫秒会自动修正
相关代码
account_risk_lib.py— 状态机、enrich_risk_status_countdown、on_user_initiated_closehub_bridge.py—/api/hub/account-risk/user-closemanual_trading_hub/hub.py— 中控平仓成功后调用 user-closestrategy_trend_register.py—stop_trend_pullback结束计划时登记风控tests/test_account_risk_lib.py