乐于分享
好东西不私藏

FqChan05缠论插件(均线笔:把缠论最复杂的部分变简单)

FqChan05缠论插件(均线笔:把缠论最复杂的部分变简单)

一条 10 日均线如何替代复杂的分型系统,实现无歧义的笔划分

「量化实战手记」— 记录从想法到落地的真实开发历程

引言:缠论笔的"千人千缠"困境

缠论体系里,是最基础的构建单元。线段由笔组成,中枢由笔界定,买卖点由笔推导。笔划对了,后面的一切才成立。

但现实中,笔的划分恰恰是争议最大的部分。

传统缠论用分型来定义笔——相邻三根 K 线构成顶分型或底分型,再用 K 线包含处理、合并规则、最少 5 根 K 线等一整套约束来判定。规则层层叠加,条件环环相扣,结果是:

  • 不同人对同一段走势画出的笔经常不一样
  • 遇到复杂走势时,笔的划分存在多种"合法"解
  • 程序化实现时,边界条件多达十几种,代码复杂度极高

这就是缠论圈常说的"千人千缠"。而笔的歧义,是所有歧义的根源。

问题
:能否找到一种比传统分型更简洁、更无歧义的方式来划分笔?

第一章:传统分型系统为什么复杂

先看看传统缠论画一笔需要经过哪些步骤:

K线包含处理合并方向判断识别分型顶分型/底分型笔的连接顶底交替+最少5K特殊处理新笔/旧笔/K型歧义来源包含处理的方向判断 → 分型位置不同 → 笔的划分不同新旧笔规则、K型处理、未完备笔合并 → 每多一条规则就多一个分歧点

完整的缠论笔判定还涉及独立 K 线(结合律)、上升/下降笔方向、笔的延伸确认等多条规则——每一步都可能产生分歧。Coding 狂人在其 MACD 系列教程中直言:

缠论的笔过于复杂,且并不合理,并不能对所有走势合理划分。缠师在笔和线段的定义上,忽略了很多东西,歧义性非常大,必定导致千人千缠。

这不是贬低缠论。恰恰相反,正是因为缠论体系本身有价值,才值得去解决它最薄弱的环节。

问题的核心在于:分型系统是几何判定,需要多步规则叠加,每一步都可能引入歧义。而我们需要的是一种一步到位的判定方式。

原则
:好的判定规则应该是单条件的——一次判断直接得出结论,而不是多层规则叠加后依然存在灰色地带。

第二章:均线笔的核心思想

Coding 狂人提出了一个替代方案:用 10 周期均线替代分型系统

他把自己定义的"浪"(本质上就是笔)与缠论的笔做了大量实盘对比,发现效果几乎一致,但规则却简单了一个数量级。他的核心定义是:

有效突破 10 周期线
:连续 3 根 K 线不碰 10 周期线,即为有效突破。
有效突破:连续 3 根 K 线站在均线上方MA10突破1233 根 K 线最低价均 > MA10,确认成功 ✓← 均线下方,下跌追踪中无效突破:第 3 根 K 线跌回均线下方MA10突破12跌回均线下方✗ 确认失败,回滚至上一追踪状态← 均线下方,下跌追踪中

这个定义同时兼顾了空间(价格确实越过了均线)和时间(不是一闪而过,而是持续了 3 根 K 线)。而且,突破 10 周期线的过程,本质上就是 MACD 金叉或死叉的过程——它和经典技术指标天然对应。

传统缠论的笔对空间力度是"无感"的——只要满足分型+间隔条件就成笔,无论这根笔的价格跨度大还是小。而均线笔天然内置了空间维度:价格穿越均线的幅度越大,确认越快。

fqchan05 的笔算法正是基于这一思想实现的。它把整个判定过程简化为一个清晰的状态机:

上涨追踪记最高点跌破确认向下累计 3 根确认成功失败回滚下跌追踪记最低点突破确认向上累计 3 根确认成功上涨追踪记最高点失败回滚确认成功确认失败回滚

整个算法只有一个判定条件:K 线与均线的位置关系。不需要分型识别,不需要包含处理,不需要新旧笔规则。一条均线,三个状态,清晰无歧义。

原则
:用统计指标(均线)替代几何判定(分型),将多步规则压缩为单步判定,从根源上消除歧义。

第三章:算法核心——五阶段状态机

算法从第一根 K 线开始,逐根扫描到最后一根,维护一个状态机。整个过程就像一辆列车沿着 K 线图行驶,经过五个"站"。

第 1 站:找方向(INIT)

列车刚出发时,不知道该往哪走。算法耐心等待——直到出现连续 3 根 K 线站在均线的同一侧

如果 3 根 K 线的最低价都高于均线,认定方向为"上"。这 3 根之前的最低点标记为笔底,3 根之内的最高点开始追踪。

如果 3 根 K 线的最高价都低于均线,认定方向为"下"。对称处理。

// 核心判定:K线与均线的关系if (low > ma)  → 站在均线上方(看涨)if (high < ma) → 站在均线下方(看跌)else           → 穿越均线,不算任何一方

这里的"站在上方"不是收盘价大于均线,而是整根 K 线的最低价都高于均线。要求更严格,过滤掉频繁穿越均线的噪声。

第 2 站:追踪上涨(IN_UP_STROKE)

方向确定为"上"之后,算法做两件事:

  1. 记最高点
    :每出一根新高,就把笔顶的位置更新过去。端点不是固定的,而是一直跟着价格走。
  2. 盯着均线
    :一旦某根 K 线的最高价跌到均线下方,意味着"可能有变",进入确认阶段。

第 3 站:确认向下突破(CONFIRMING_DOWN)

这是最关键的阶段。触发突破的那根 K 线算第 1 根,后续每出一根最高价低于均线的 K 线,计数 +1。

累计 3 根 → 确认成功,上一笔的笔顶锁死,转入下跌笔追踪。

如果中间某根 K 线又回到均线上方 → 确认失败,退回上涨笔追踪。而且失败的那根 K 线如果创了新高,笔顶还会随之更新——假跌破反而可能把笔顶推得更高。

1追踪上涨不断更新最高点,直到某根K线跌破均线2触发确认跌破均线的那根K线 = 第1根确认K线3累计 3 根连续3根K线最高价 < 均线 → 确认成功4切换方向笔顶锁定,转入下跌笔追踪,开始记最低点

第 4、5 站:追踪下跌 & 确认向上

和第 2、3 站完全镜像对称——记最低点,等突破均线,累计 3 根确认。

五个状态循环往复,一笔接一笔,直到 K 线数据走完。

原则
:好的状态机应该是镜像对称的。上涨和下跌的处理逻辑完全对称,区别只在方向。如果你发现自己在写两套不同的逻辑,大概率是设计有问题。

第四章:实战中的三个关键细节

细节一:端点迁移

传统缠论里,笔的端点在分型确定后就固定了。但均线笔的端点是活的——在追踪阶段,只要出了新高或新低,端点就跟着移动。

这意味着笔的端点永远是当前这段走势的最优极值。只有当方向确认切换后,端点才被锁死。这个设计让每一笔的起止点更精确。

细节二:安全回滚

确认失败时,算法不是简单地退回上一状态。它还会检查"导致确认失败的那根 K 线"是否创造了新的极值:

// 确认失败 → 回滚,但失败K线可能创新高extreme_pos = saved_pos;extreme_val = saved_val;if (high > extreme_val) {        // 失败K线创新高    extreme_pos = i;             // 更新笔顶位置    extreme_val = high;}state = IN_UP_STROKE;            // 退回上涨追踪

这个细节很关键。一个假跌破被否定后,反弹的那根 K 线可能恰好是新的最高点。如果不处理这种情况,笔顶的位置就会偏低,后续分析会失真。

细节三:尾部补录

K 线数据总有走完的时候。算法结束时可能处于任何状态,需要正确处理:

结束时的状态
处理方式
追踪上涨笔
当前最高点确认为笔顶
追踪下跌笔
当前最低点确认为笔底
确认向下突破中
上一笔顶补录为确认态
确认向上突破中
上一笔底补录为确认态

这确保了最后一笔的端点不会因为数据结束而丢失。

原则
:算法的鲁棒性体现在边界条件上。好的算法不仅在正常流程中正确,在启动阶段、异常中断、数据结束时都能给出合理结果。

第五章:效果对比与实测

Coding 狂人做了大量实盘对比测试。他用程序自动在通达信上画出了均线"浪"(即笔),与缠论手动画的笔进行逐一比对,效果几乎一致。他的结论是:

比起缠论无比复杂的笔来说,我的浪定义是极其简单的,且最后的效果跟缠论的笔误差极少

fqchan05 的实现中,均线笔算法输出的信号值有清晰的层级:

信号值
含义
说明
1
 / -1
已确认笔顶/笔底
被后续笔确认过的端点
0.5
 / -0.5
潜在笔顶/笔底
当前追踪中的端点,尚未确认
11
 / -11
分型确认(普通)
标准化K线分型确认信号
12
 / -12
分型确认(强)
收盘价突破前一根合并K线的极值

这个层级设计让下游系统(线段识别、中枢计算、买卖点判定)可以根据需要选择使用确认态还是潜在态的端点——做实时预警用 0.5,做历史分析用 1

总结:从复杂到简单的设计哲学

均线笔算法的精髓不在于"用均线",而在于用一条统计规律替代一套几何规则

传统分型系统试图用形式化的几何规则精确描述"走势的转折",但规则越多,灰色地带越多,最终导致千人千缠。均线笔反其道而行——不追求几何上的精确,而是用一个统计上成立的代理指标(10 日均线)来判定方向。

两者的效果几乎一致,但实现复杂度差了一个数量级。

三条可复用的设计原则

1. 单条件判定优于多规则叠加一条均线判定方向,比五步分型规则更不容易产生歧义。

2. 统计指标优于几何判定均线自带平滑噪声的能力,比分型更适合处理真实市场的毛刺。

3. 对称设计消除特殊情况上涨和下跌的处理逻辑完全镜像,不需要额外的分支来处理"特殊形态"。


附录:算法流程速查

给想深入了解的技术读者,以下是算法的完整流程伪代码:

初始化: state = INIT, 端点列表 = []逐根扫描 K 线 i:  INIT:    连续3根K线站在均线上方 → 找最低点标记笔底, 切换到 上涨追踪    连续3根K线站在均线下方 → 找最高点标记笔顶, 切换到 下跌追踪  上涨追踪:    出新高 → 更新笔顶位置    某根K线跌破均线 → 保存当前笔顶, 切换到 确认向下  确认向下:    累计3根K线(最高价 < 均线) → 锁死笔顶, 切换到 下跌追踪    中间回到均线上方 → 回滚到 上涨追踪(检查是否创新高)  下跌追踪:    出新低 → 更新笔底位置    某根K线突破均线 → 保存当前笔底, 切换到 确认向上  确认向上:    累计3根K线(最低价 > 均线) → 锁死笔底, 切换到 上涨追踪    中间回到均线下方 → 回滚到 下跌追踪(检查是否创新低)尾部处理: 补录未确认的端点

性能特征:单次线性扫描,时间复杂度 O(n),空间复杂度 O(n)。139 页的 MACD 教程帖子里,几千只股票的日线数据在毫秒级完成计算。

参数选择:默认 10 周期 SMA。周期越短对短期波动越敏感,周期越长过滤效果越好但滞后增加。10 是经过大量实盘验证的平衡点。

量化实战手记

本系列记录作者用代码理解市场的真实历程——每个想法如何变成设计,每个设计如何变成可运行的系统。不谈理论,只聊实战。

加入量化探索之旅

FqChan05的公式包已经上传到纷传圈子:纷传圈子