面向研发与测试:解释每一条规则“为什么存在 / 怎么算 / 怎么落地 / 怎么测”。
适用:跨市场对冲套利利润轨迹(profit(t))的动态止盈管理,不依赖价格预测。
| 变量 | 类型/单位 | 说明 | 工程落地建议 |
|---|---|---|---|
| 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;展示可更频繁,触发逻辑建议更稳健 |
// ACTIVE 状态下每次采样更新:
maxProfit = max(maxProfit, profit)
// 动态止盈线(原始)
StopProfit_raw = maxProfit * (1 - DrawdownPct)
// 最小锁定利润保护(可选,但建议默认开启)
StopProfit = max(StopProfit_raw, MinLockProfit)
| 取值策略 | 示例 | 适用 | 备注 |
|---|---|---|---|
| 固定值 | MinLockProfit = 80 | 你提到的典型需求:“≥80 才允许平” | 最直观、最好解释 |
| 跟随启动阈值 | MinLockProfit = StartProfit * 0.8 | 不同品种/手数下利润单位差异较大 | 更泛化,但要保证用户可理解 |
| 二者取大 | max(80, StartProfit*0.7) | 兼顾“保底”与“自适应” | 推荐给默认参数 |
目标:防止因为瞬时跳点或单次噪声造成误触发。 逻辑上就是:不是“碰一下线就退出”,而是“持续低于线一段时间/若干采样点才退出”。
// 参数:N = ConfirmWindow(连续样本数)
// 运行变量:belowCount(连续低于止盈线计数)
//
// 每次采样执行:
if (profit <= StopProfit) {
belowCount += 1
} else {
// 只要价格恢复到止盈线之上,就认为“这次回撤未确认”
// 计数清零,等待下一次回撤
belowCount = 0
}
if (belowCount >= N) {
// 连续 N 次都低于止盈线
// 认为回撤已“确认”,进入退出流程
triggerExit("CONFIRM_WINDOW")
}
目标:区分两类回撤:
① 慢回撤(正常震荡) vs ② 快回撤(结构性恶化/突发冲击)
仅当回撤“足够快”,才认为应该果断退出。
// drawdownSpeed:回撤速度(单位:利润/秒 或 利润/ms)
// 直觉:maxProfit 到当前 profit 的“掉落”发生得有多快
drawdown = maxProfit - profit
drawdownSpeed = drawdown / deltaTime // deltaTime = 当前时间 - 参考时间(见下)
// 工程建议:使用固定时间窗口计算速度更稳定,例如过去 K 秒:
// drawdownSpeed = (profit(t-K) - profit(t)) / K
// 参数:speedThreshold(回撤速度阈值)
// 注意:速度阈值必须与利润单位匹配(点/秒 或 美元/秒)
if (profit <= StopProfit) {
// 计算回撤速度(推荐用滚动窗口而非单点差分)
drawdownSpeed = computeDrawdownSpeed()
if (drawdownSpeed >= speedThreshold) {
// 回撤足够“快”:更可能是结构性变化
// 可以触发退出(或进入更严格确认)
triggerExit("DRAWDOWN_SPEED")
} else {
// 回撤很慢:更可能是正常震荡
// 不直接退出,而是继续观察(交给 ConfirmWindow 或 tolerance 机制)
continueObserve()
}
}
目标:解决你说的典型场景:
利润刚到 150(新高)→ 回撤到 120(触发线)→ 但很可能马上又冲到 150/190。
这类场景往往是高波动下的“洗盘式回撤”,适合给予一次容错。
| 定义方式 | 示例 | 优点 | 注意 |
|---|---|---|---|
| 时间窗口 | 在过去 T 秒内出现 maxProfit 刷新 | 简单可控 | T 需要按品种波动调参 |
| 新高次数 | 过去 N 秒内刷新新高次数 ≥ M | 能识别“趋势式拉升” | 需要维护计数器 |
| 幅度阈值 | maxProfit 相比上一个峰值提升 ≥ X | 过滤小噪声新高 | X 要与利润单位匹配 |
当第一次触发止盈线时,如果判断属于“新高刚发生不久”的回撤, 则不立即退出,而是临时放宽一次止盈线,让系统给利润一个“再冲”的机会。
// 参数: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")
}
}
建议把退出判定拆为“硬条件 + 过滤器 + 容错器”,实现更清晰:
// 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")
}
| 参数 | 建议默认 | 范围 | 备注 |
|---|---|---|---|
| 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 |