动态止盈 V2 · 技术实现详注版

面向研发与测试:解释每一条规则“为什么存在 / 怎么算 / 怎么落地 / 怎么测”。
适用:跨市场对冲套利利润轨迹(profit(t))的动态止盈管理,不依赖价格预测。

快速导航 1. 数据与变量定义(profit / maxProfit / StopProfit) 2. V2 基础止盈线(maxProfit 锚点 + MinLockProfit) 3. 规则 A:确认窗口 ConfirmWindow(N 连续样本) 4. 规则 B:回撤速度 drawdownSpeed(斜率过滤) 5. 规则 C:新高后容错 tolerance(反“假触发”) 6. 组合判定顺序(推荐工程实现) 7. 参数建议区间(工程默认) 8. 测试用例清单(关键边界)

1. 数据与变量定义(研发统一口径)

变量 类型/单位 说明 工程落地建议
profit(t) number(点/美元/RMB) 实时对冲组合利润(两腿合成后的“当前可平仓利润”) 统一单位;确保 profit 计算口径一致(含/不含手续费要固定)
StartProfit number 启动阈值:profit≥StartProfit 后才进入动态止盈 ACTIVE 状态 用户可配置;建议也支持系统推荐/AI建议
maxProfit number ACTIVE 状态下记录的历史最高 profit(最大浮盈 / MFE) 仅在 ACTIVE 更新:maxProfit=max(maxProfit,profit)
DrawdownPct number(0~1) 允许回撤比例,如 0.20 表示允许从 maxProfit 回撤 20% 可手动固定/自适应/AI建议;落地时要记录“最终使用值”
StopProfit number 动态止盈线:profit 回撤到该线以下,满足触发条件则退出 StopProfit 会随 maxProfit 上移(核心)
MinLockProfit(可选) number 最小锁定利润:即使回撤计算很低,也不允许止盈线低于此值 用于“保底锁利”;可取 0 / 固定值 / 与 StartProfit 相关
sampleInterval ms 利润采样间隔 Δt(用于确认窗口与回撤速度计算) 建议 200ms~1000ms;展示可更频繁,触发逻辑建议更稳健
重要约束:
触发逻辑必须使用“稳定采样”的 profit(可做轻微平滑/去极值),否则 ConfirmWindow 与 drawdownSpeed 会被行情跳点/延迟污染。

2. V2 基础止盈线(maxProfit 锚点 + MinLockProfit)

2.1 核心计算公式

// ACTIVE 状态下每次采样更新:
maxProfit = max(maxProfit, profit)

// 动态止盈线(原始)
StopProfit_raw = maxProfit * (1 - DrawdownPct)

// 最小锁定利润保护(可选,但建议默认开启)
StopProfit = max(StopProfit_raw, MinLockProfit)

2.2 MinLockProfit(最小锁定利润)的设计目的与取值

取值策略 示例 适用 备注
固定值 MinLockProfit = 80 你提到的典型需求:“≥80 才允许平” 最直观、最好解释
跟随启动阈值 MinLockProfit = StartProfit * 0.8 不同品种/手数下利润单位差异较大 更泛化,但要保证用户可理解
二者取大 max(80, StartProfit*0.7) 兼顾“保底”与“自适应” 推荐给默认参数

3. 规则 A:确认窗口 ConfirmWindow(N 连续样本)

目标:防止因为瞬时跳点单次噪声造成误触发。 逻辑上就是:不是“碰一下线就退出”,而是“持续低于线一段时间/若干采样点才退出”。

3.1 伪代码(含详细注释)

// 参数:N = ConfirmWindow(连续样本数)
// 运行变量:belowCount(连续低于止盈线计数)
//
// 每次采样执行:

if (profit <= StopProfit) {
    belowCount += 1
} else {
    // 只要价格恢复到止盈线之上,就认为“这次回撤未确认”
    // 计数清零,等待下一次回撤
    belowCount = 0
}

if (belowCount >= N) {
    // 连续 N 次都低于止盈线
    // 认为回撤已“确认”,进入退出流程
    triggerExit("CONFIRM_WINDOW")
}

3.2 设计解释(研发/测试要点)

3.3 推荐默认值

ConfirmWindow 建议:
sampleInterval = 300ms~500ms 时,N=3~5(约 0.9s~2.5s 确认)。
若你们链路延迟大/抖动大,可适当增加 N,或降低采样频率并增加确认时间。

4. 规则 B:回撤速度 drawdownSpeed(斜率过滤)

目标:区分两类回撤:
慢回撤(正常震荡) vs ② 快回撤(结构性恶化/突发冲击)
仅当回撤“足够快”,才认为应该果断退出。

4.1 定义与计算方式

// drawdownSpeed:回撤速度(单位:利润/秒 或 利润/ms)
// 直觉:maxProfit 到当前 profit 的“掉落”发生得有多快

drawdown = maxProfit - profit
drawdownSpeed = drawdown / deltaTime   // deltaTime = 当前时间 - 参考时间(见下)

// 工程建议:使用固定时间窗口计算速度更稳定,例如过去 K 秒:
// drawdownSpeed = (profit(t-K) - profit(t)) / K

4.2 为什么要引入“速度阈值”?

4.3 伪代码(含详细注释)

// 参数:speedThreshold(回撤速度阈值)
// 注意:速度阈值必须与利润单位匹配(点/秒 或 美元/秒)

if (profit <= StopProfit) {

    // 计算回撤速度(推荐用滚动窗口而非单点差分)
    drawdownSpeed = computeDrawdownSpeed()

    if (drawdownSpeed >= speedThreshold) {
        // 回撤足够“快”:更可能是结构性变化
        // 可以触发退出(或进入更严格确认)
        triggerExit("DRAWDOWN_SPEED")
    } else {
        // 回撤很慢:更可能是正常震荡
        // 不直接退出,而是继续观察(交给 ConfirmWindow 或 tolerance 机制)
        continueObserve()
    }
}
工程落地建议:
drawdownSpeed 建议用“固定窗口 K 秒”计算(如 K=2s~5s),抗噪声更强。
单点 (maxProfit - profit)/Δt 对采样抖动敏感,不推荐直接用。

5. 规则 C:新高后容错 tolerance(反“假触发”)

目标:解决你说的典型场景:
利润刚到 150(新高)→ 回撤到 120(触发线)→ 但很可能马上又冲到 150/190。 这类场景往往是高波动下的“洗盘式回撤”,适合给予一次容错。

5.1 “recentNewHigh”的定义(必须可量化)

定义方式 示例 优点 注意
时间窗口 在过去 T 秒内出现 maxProfit 刷新 简单可控 T 需要按品种波动调参
新高次数 过去 N 秒内刷新新高次数 ≥ M 能识别“趋势式拉升” 需要维护计数器
幅度阈值 maxProfit 相比上一个峰值提升 ≥ X 过滤小噪声新高 X 要与利润单位匹配

5.2 容错策略(extend StopProfit)解释

当第一次触发止盈线时,如果判断属于“新高刚发生不久”的回撤, 则不立即退出,而是临时放宽一次止盈线,让系统给利润一个“再冲”的机会。

5.3 伪代码(含详细注释)

// 参数:tolerancePct(容错放宽比例,如 0.05 表示再放宽 5%)
// 运行变量:toleranceUsed(是否已经用过一次容错)
// 运行变量:recentNewHigh(近期是否刷新过新高)

if (profit <= StopProfit) {

    if (recentNewHigh == true && toleranceUsed == false) {

        // 1) 计算“放宽后的止盈线”
        //    直觉:原本 maxProfit*(1-dd) 太紧,暂时多给一点回撤空间
        //
        //    一种实现方式:把 DrawdownPct 临时增加 tolerancePct
        //    即允许回撤变大(止盈线更低一点)
        adjustedDrawdown = DrawdownPct + tolerancePct

        extendedStop = maxProfit * (1 - adjustedDrawdown)

        // 2) 仍然应用最小锁定利润下限
        extendedStop = max(extendedStop, MinLockProfit)

        // 3) 生效一次,标记已使用
        StopProfit = extendedStop
        toleranceUsed = true

        // 4) 继续观察,不触发退出
        //    之后如果再次跌破(且确认窗口通过 / 回撤速度满足),才退出
        continueObserve("TOLERANCE_EXTENDED")

    } else {
        // 不满足“新高容错”条件 → 进入正常退出判定流程
        triggerExit("STOP_HIT_NO_TOLERANCE")
    }
}
容错机制的关键限制:
1) 必须只允许“有限次数”(通常 1 次)
2) 必须有时间窗口(recentNewHigh)
否则会导致系统“无限放宽、永不退出”。

6. 组合判定顺序(推荐工程实现)

建议把退出判定拆为“硬条件 + 过滤器 + 容错器”,实现更清晰:


// Step 0: 必须已经 ACTIVE(profit ≥ StartProfit)

// Step 1: 更新 maxProfit,计算 StopProfit(含 MinLockProfit)
updateMaxProfit()
computeStopProfit()

// Step 2: 只有 profit <= StopProfit 才进入触发判定
if (profit <= StopProfit) {

    // Step 2.1: 先尝试容错(仅第一次、且 recentNewHigh)
    if (canTolerance()) {
        extendStopOnce()
        return
    }

    // Step 2.2: 再进行确认窗口(过滤掉瞬时穿越)
    if (!passConfirmWindow()) return

    // Step 2.3: 再进行回撤速度过滤(区分慢回撤 vs 快回撤)
    if (!passDrawdownSpeed()) return

    // Step 2.4: 条件满足,触发退出
    triggerExit("TPV2_TRIGGERED")
}
为何按这个顺序?
容错:解决“刚创新高被洗出”的收益问题(最符合你提出的痛点)。
确认:解决“瞬时噪声/跳点”的误触发问题。
速度:解决“慢震荡 vs 快崩坏”的决策问题。
三者组合后,触发会更稳定、更科学。

7. 参数建议区间(工程默认,可后续 AI 化)

参数 建议默认 范围 备注
ConfirmWindow(N) 3 3~5 采样 300~500ms 时,对应确认 0.9~2.5s
tolerancePct 0.05 0.03~0.10 只允许一次;仅 recentNewHigh 时启用
recentNewHighWindow(T) 8s 5s~20s 按品种/时段波动调整
drawdownSpeedWindow(K) 3s 2s~5s 固定窗口计算速度,抗噪声更强
MinLockProfit 80 0 / 固定值 / 与 StartProfit 相关 你提出的“≥80 才允许平”可直接设为 80

8. 测试用例清单(关键边界)

建议:测试时把 profit(t) 序列人工构造出来(离线回放),不依赖真实行情,能快速验证规则正确性与边界行为。
返回首页