阶段 3·线段·第 4 / 4 节·约 12 分钟
线段的取消与回收
说清线段取消时结构如何回退,并理解为什么这一步不能省略。
这是阶段 3 的最后一课,讲的是「画错了怎么擦」。
取消是什么
上一课讲了确认失败。取消就是确认失败后的处理动作: 把已经认定的线段终点撤销,让线段恢复到未结束的状态。
听起来简单,但有个连带问题:在这个候选终点之后, 你可能已经开始构造新的线段了。 取消候选终点, 意味着那个新线段也不存在了——它的笔要还回去。
这个「还回去」的过程就是回收。
为什么会积累出要回收的东西
因为线段的判定是流式的:K 线一根根来,笔一笔笔形成, 算法必须在每一步给出当前的最佳判断,不能等到所有数据都有了再算。
所以流程是这样的:
- 认定线段 A 在某点结束
- 从这一点开始构造线段 B
- 线段 B 走了几笔
- 走势创新高,判定第 1 步的认定错误
- 撤销:线段 B 不存在,它的那几笔回到线段 A 里,线段 A 继续
第 5 步就是回收。如果实现时只做了「撤销终点」而没有把 B 的笔还给 A, 结构就残缺了——会出现笔归属不明、线段之间有空隙。
回收的规则
回收本身的规则不复杂:
- 确定回退点:回到被取消的那个候选终点
- 丢弃之后的所有线段判定:候选终点之后建立的线段、 为确认建立的反向特征序列,全部作废
- 笔归还:这些笔重新算作原线段的组成部分
- 重建特征序列:用归还后的完整笔序列,重新计算原线段的特征序列
- 重新找候选:在新的特征序列上重新寻找结束点
第 4 步容易被忽略:特征序列必须重算,不能在原来的基础上追加。 因为归还的笔里可能有反向笔,它们要加入特征序列, 而加入之后包含处理的结果可能和之前完全不同。
一个具体场景
假设一个向上线段 A,走到某处特征序列形成带缺口的顶分型, 候选终点定在 15.0。
之后走势下跌,你开始按向下线段 B 处理,B 走了三笔到 13.0。 然后走势反转向上,直接突破 15.0 创出 15.8。
处理:
- 候选终点 15.0 作废
- 线段 B 的三笔归还给 A
- A 的特征序列加入 B 里的那些向上笔(A 是向上线段,特征序列取向下笔—— 所以实际上归还的向下笔进入特征序列,向上笔不进)
- 重算包含处理,重新找分型
- A 现在延伸到了 15.8,继续寻找新的结束点
回收会连锁吗
会。回收之后重算特征序列,可能立刻又找到一个新的候选终点, 这个新候选终点后面又可能被取消……
理论上可以连锁很多层。实际数据里连锁两层以上已经很少见, 但实现上必须支持任意深度,否则在极端行情下会出错。
本站的口径是完整回退:每次取消都退回到候选点重新算一遍, 不走捷径。这样能保证连锁多少层都不出错。
这一阶结束了
线段是缠论最难的部分,你已经走完了。回顾一下这四课:
- 特征序列:只取反向笔,当作伪 K 线,做包含处理,找分型
- 两种情况:有无缺口决定是否需要反向确认
- 破坏与确认:破坏不等于结束,中间有未定状态
- 取消与回收:确认失败时完整回退,笔归还,特征序列重算
如果这四条你都能不看笔记说出来,可以进入阶段 4。 如果第 1 条还需要想一下,建议回去重看——后面全都建立在它上面。
这一课的要点
- 取消 = 撤销候选终点;回收 = 把之后建立的结构还给原线段
- 回收后特征序列必须重算,不能在原基础上追加
- 归还的笔进不进特征序列,看原线段的方向,笔的身份会转换
- 不做回收的实现,在震荡行情里会画出大量碎线段
- 回收可以连锁,实现上必须支持任意深度
试一道
刚学的东西趁热做一道,比读第二遍有用。答错可以重试,也可以直接看解析。