Indicator算法深度解析(一):精准捕捉每个顶底的Parse1状态机代码全走读
【免费下载链接】Indicator通达信缠论可视化分析插件项目地址: https://gitcode.com/gh_mirrors/ind/Indicator
Indicator 是一款免费的通达信缠论可视化分析插件,核心算法全部写在约 600 行的 Main.cpp 中。本文带你完整走读其中最底层的Parse1函数——一个仅用两个状态就能精准捕捉每一根顶底 K 线的状态机。即使你没有缠论背景,也能看懂它是如何一步步"画"出高低点的。
一、先认识这个项目:缠论可视化插件是怎么跑起来的 📊
Indicator 的工作方式非常轻量:
- 编译生成
CZSC.dll(源码见 Main.cpp、CCentroid.h); - 把 dll 放入通达信
T0002\dlls目录并加载到 1 号 dll 插件; - 在通达信公式里用
TDXDLL1(编号, H, L)调用不同编号的输出函数。
安装与调用示例可直接参考 README.md。一次调用(编号 1)内部会依次执行:
- Parse1:扫描出全部"原始"顶底 K 线;
- Parse2:按缠论"至少 5 根 K 线才构成一笔"的规则反复化简;
- 输出标记值:
1= 顶,-1= 底,0= 无。
后续的中枢、三类买卖点等高级功能(Func2~Func5,核心结构体见 CCentroid.h)都依赖 Parse1 的正确输出,所以它是整个算法体系的"地基"。
二、Parse1 函数签名:4 个参数定乾坤
函数定义位于 Main.cpp,签名如下:
void Parse1(int nCount, float *pOut, float *pHigh, float *pLow)| 参数 | 含义 |
|---|---|
nCount | K 线总数(本次要扫描的数据长度) |
pOut | 输出数组:0=无,1=顶,-1=底 |
pHigh | 每根 K 线的最高价序列 |
pLow | 每根 K 线的最低价序列 |
真正驱动整个状态机的,是函数内部的 3 个变量(见 Main.cpp):
int nState = -1; // 当前状态:-1 找底,1 找顶 int nHigh = 0; // 当前跟踪的"最高点"K 线索引 int nLow = 0; // 当前跟踪的"最低点"K 线索引🔑核心思想:nState就是状态机。它只有两个取值——"正在找顶"和"正在找底",并且永远在两者之间交替切换。初始为-1,意味着算法默认市场从"寻底"开始。
三、状态一(nState == 1):高点追踪模式 🔺
当状态机处于"找顶"状态时,对每一根新 K 线i,Parse1只关心两件事:
① 创新高 → 顶"搬家"
如果当前 K 线的最高价pHigh[i]大于等于此前认定的最高点pHigh[nHigh],说明真正的顶还没出现:
- 先把旧顶点的标记抹掉(
pOut[nHigh] = 0); - 把
nHigh更新到当前 K 线,并打上临时顶标记(pOut[nHigh] = 1)。
这就是"顶底跟随创新高的实时搬家"机制——顶永远落在当前最高点那根 K 线上,行情每创新高,顶就跟着往前走一步。
② 确认转向 → 锁定顶
一旦同时满足:
- 当前最高价低于顶 K 线的最高价;
- 当前最低价低于顶 K 线的最低价;
即当前 K 线的实体完全跌到顶 K 线之下,顶底结构成立:
- 确认
pOut[nHigh] = 1(锁定这个顶); - 状态翻转:
nState = -1,并把当前 K 线作为新的"跟踪最低点"(nLow = i)。
四、状态二(nState == -1):低点追踪模式 🔻
与找顶完全对称,只是方向相反:
① 创新低 → 底"搬家"
当前最低价pLow[i]不高于此前认定的最低点时,旧底标记清零,nLow前移到当前 K 线,打临时底标记pOut[nLow] = -1。
② 确认转向 → 锁定底
当当前 K 线的最高价高于底 K 线最高价、且最低价高于底 K 线最低价(整根 K 线站在底 K 线之上)时:
- 确认
pOut[nLow] = -1; - 状态翻转:
nState = 1,当前 K 线成为新的"跟踪最高点"(nHigh = i)。
五、为什么它能"精准捕捉"每个顶底?
把两种状态连起来看,你会发现这套逻辑正好对应缠论的分型思想:
- 顶的判定不依赖"猜":顶 = 一段上涨后,出现一根最高价被随后 K 线整体压回的 K 线;
- 允许延后确认:在顶最终确认之前,它可以随新高不断右移,因此不会把中间的小高点点成顶;
- 双向互斥:顶底由
nState交替产生,天然保证输出序列是"顶、底、顶、底……"严格交替的,为下游 Parse2 的线段化简提供了干净输入。
💡 一个容易忽略的细节:转向确认用的是"当前最高价、当前最低价同时"满足条件(K 线整体越过参照 K 线),而不是只看收盘价,这正是它对跳空、长影线依然稳健的原因。
六、Parse1 之后发生了什么?
Parse1的输出会被 Func1 交给Parse2,按公式参数(TDXDLL1(1,H,L,5)中的5)循环化简——把不足"一笔"要求的短波段合并掉,最终得到符合缠师原文的线段顶底,再叠加绘制在 K 线图上(公式写法见 README.md)。
后续章节还会继续拆解:
Parse2的化简规则如何执行;- CCentroid.h 中的中枢(Hub)结构体如何由顶底序列推导出三类买卖点(Func5)。
七、总结
| 要点 | 说明 |
|---|---|
| 状态机只有 2 个状态 | -1找底、1找顶,交替切换 |
| 顶底可"搬家" | 创新高/新低时标记实时右移,确认后才锁定 |
| 转向需整体越过 | 最高、最低价双条件同时满足,过滤假信号 |
| 输出格式极简 | 1顶 /-1底 /0无,直接驱动通达信绘图 |
Parse1用不到 60 行代码(Main.cpp)就完成了缠论顶底识别中最核心的一步,是典型的"小状态机解决大问题"的工程范例,值得所有做量化与信号处理的读者细读。
【免费下载链接】Indicator通达信缠论可视化分析插件项目地址: https://gitcode.com/gh_mirrors/ind/Indicator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考