阶段 3·线段·4 / 4·12 分钟

线段的取消与回收

说清线段取消时结构如何回退,并理解为什么这一步不能省略。

这是阶段 3 的最后一课,讲的是「画错了怎么擦」。

取消是什么

上一课讲了确认失败。取消就是确认失败后的处理动作: 把已经认定的线段终点撤销,让线段恢复到未结束的状态。

听起来简单,但有个连带问题:在这个候选终点之后, 你可能已经开始构造新的线段了。 取消候选终点, 意味着那个新线段也不存在了——它的要还回去。

这个「还回去」的过程就是回收

为什么会积累出要回收的东西

因为线段的判定是流式的:K 线一根根来,笔一笔笔形成, 算法必须在每一步给出当前的最佳判断,不能等到所有数据都有了再算。

所以流程是这样的:

  1. 认定线段 A 在某点结束
  2. 从这一点开始构造线段 B
  3. 线段 B 走了几笔
  4. 走势创新高,判定第 1 步的认定错误
  5. 撤销:线段 B 不存在,它的那几笔回到线段 A 里,线段 A 继续

第 5 步就是回收。如果实现时只做了「撤销终点」而没有把 B 的笔还给 A, 结构就残缺了——会出现笔归属不明、线段之间有空隙。

回收的规则

回收本身的规则不复杂:

  1. 确定回退点:回到被取消的那个候选终点
  2. 丢弃之后的所有线段判定:候选终点之后建立的线段、 为确认建立的反向特征序列,全部作废
  3. 笔归还:这些笔重新算作原线段的组成部分
  4. 重建特征序列:用归还后的完整笔序列,重新计算原线段的特征序列
  5. 重新找候选:在新的特征序列上重新寻找结束点

第 4 步容易被忽略:特征序列必须重算,不能在原来的基础上追加。 因为归还的笔里可能有反向笔,它们要加入特征序列, 而加入之后包含处理的结果可能和之前完全不同。

一个具体场景

假设一个向上线段 A,走到某处特征序列形成带缺口的顶分型, 候选终点定在 15.0。

之后走势下跌,你开始按向下线段 B 处理,B 走了三笔到 13.0。 然后走势反转向上,直接突破 15.0 创出 15.8。

处理:

  • 候选终点 15.0 作废
  • 线段 B 的三笔归还给 A
  • A 的特征序列加入 B 里的那些向上笔(A 是向上线段,特征序列取向下笔—— 所以实际上归还的向下笔进入特征序列,向上笔不进)
  • 重算包含处理,重新找分型
  • A 现在延伸到了 15.8,继续寻找新的结束点

回收会连锁吗

会。回收之后重算特征序列,可能立刻又找到一个新的候选终点, 这个新候选终点后面又可能被取消……

理论上可以连锁很多层。实际数据里连锁两层以上已经很少见, 但实现上必须支持任意深度,否则在极端行情下会出错。

本站的口径是完整回退:每次取消都退回到候选点重新算一遍, 不走捷径。这样能保证连锁多少层都不出错。

这一阶结束了

线段是缠论最难的部分,你已经走完了。回顾一下这四课:

  1. 特征序列:只取反向笔,当作伪 K 线,做包含处理,找分型
  2. 两种情况:有无缺口决定是否需要反向确认
  3. 破坏与确认:破坏不等于结束,中间有未定状态
  4. 取消与回收:确认失败时完整回退,笔归还,特征序列重算

如果这四条你都能不看笔记说出来,可以进入阶段 4。 如果第 1 条还需要想一下,建议回去重看——后面全都建立在它上面。

这一课的要点

  • 取消 = 撤销候选终点;回收 = 把之后建立的结构还给原线段
  • 回收后特征序列必须重算,不能在原基础上追加
  • 归还的笔进不进特征序列,看原线段的方向,笔的身份会转换
  • 不做回收的实现,在震荡行情里会画出大量碎线段
  • 回收可以连锁,实现上必须支持任意深度

试一道

刚学的东西趁热做一道,比读第二遍有用。答错可以重试,也可以直接看解析。