简介:这份压缩包提供了一套基于缠论理论的DLL源码实现,面向股票、期货等市场的量化分析开发者,覆盖笔、段、中枢三大核心概念,包含笔的分型处理与方向判断、段的划分规则以及中枢区间的识别逻辑,可直接编译生成动态链接库并在交易软件中调用。源码基于Visual Studio工程编写,C++头文件与源文件完整,支持按需修改和二次开发;包内另附缠论插件使用说明V2.1.pdf及必读txt文档,帮助用户理解接口参数与安装流程,降低上手门槛。整个工程完全开源,也便于深入研读算法实现。资源共36个文件,以.h、.cpp源码为核心,同时包含obj、pch等编译中间文件和.sln、.vcproj工程配置,压缩包整体大小约4.11MB。目前已有6496人学习浏览,对于希望将缠论分析逻辑程序化、提升市场研判效率的开发者来说,这是一份结构清晰、可直接编译运行的宝贵参考资料。 最近在重新整理自己那套缠论交易辅助工具时,把很早以前写的缠论dll源码翻了出来。这套代码是我在行情软件里用C/C++封装的笔、段、中枢识别核心,配合通达信的公式调用,用来在K线图上自动标注笔、线段和中枢区间。当时写这套东西的动机很直接:手工画线段和中枢实在费眼睛,而且不同人画出来的结果经常对不上,索性把缠论规则写成代码,让机器来干这件事。
本文核心关键字:缠论dll、源码、笔段中枢。如果你正在做缠论自动识别的技术验证,或者正准备给行情软件写指标dll,这篇内容会比较对胃口。我会从识别逻辑、代码结构、集成方式和踩坑记录几个角度完整拆解这套方案,既能让你理解缠论算法落地的关键路径,也能给自定义指标dll开发提供一个可参考的模板。
1. 缠论笔段中枢自动识别,到底在解决什么问题
1.1 手工画线的三个痛点
先说一个真实场景。缠论分析里,笔是基础构件,线段由笔构成,中枢由线段重叠形成。很多人在软件里画线段时,会先找分型,再一笔一笔连起来,然后靠肉眼判断特征序列是否被破坏,最后才能画出中枢区间。这个过程至少有三个问题:
第一,不同软件、不同数据源,除权和复权方式不一致,导致同样的K线在不同软件里高低点有出入,画出来的笔就完全对不上。第二,缠论规则里有大量“包含关系处理”,这步需要逐根K线做递归合并,手工操作极其容易出错,尤其是遇到连续包含的复杂形态。第三,笔的破坏、线段的破坏、中枢的延伸与扩展,这些规则在实际K线上经常产生边界歧义,不同人理解不同,画出来的结果就五花八门。
把缠论规则固化成dll源码,本质上就是把这套模糊的人工程序化,用统一的规则去处理每一根K线,让输出结果具备可重复性和可验证性。这也是我认为缠论dll源码最有价值的点:它不是帮你判断未来涨跌,而是帮你把当前图表状态稳定、准确地描述出来。
1.2 dll源码的定位与整体工作方式
这套dll源码的整体定位是:行情软件的外部计算插件。它接收K线数据数组,经过内部缠论算法处理后,把分型、笔、段、中枢的坐标结果输出给软件端绘图。
整个工作流可以拆成四段:
- 数据准备:把K线数据(开盘、最高、最低、收盘、成交量)按时间顺序传入dll。
- 包含处理与分型识别:先合并包含关系,再识别顶底分型。
- 笔和线段的递归构建:基于分型生成笔,基于笔的特征序列生成线段。
- 中枢识别与买卖点标记:在线段级别上寻找重叠区间,输出中枢范围,并进一步计算背驰点供辅助参考。
在通达信里,这类dll通过外部函数插件方式被公式调用,函数接受参数数组,返回计算后的数组。这样做的好处是计算逻辑与软件主程序隔离,日后维护算法时只需要替换dll,不用动公式代码。缺点也很明显:dll是二进制文件,调试不方便,一旦遇到崩溃或错误结果,排查成本比普通公式高很多。
2. 核心算法:从K线到中枢的完整识别链路
2.1 包含处理:第一步也是坑最多的一步
缠论中最基础、也最容易被写错的环节,就是K线的包含关系处理。两根相邻K线,如果一根的高低点完全被另一根的高低价区间覆盖,就认为它们存在包含关系,需要合并成一根新的K线,再继续与后续K线比较。
实际代码里我采用的是递归合并方式,核心逻辑是:
- 确认当前方向。如果前面是上升趋势,包含时取高高点和高低点中的较高值;如果前面是下降趋势,包含时取低低点和低高点中的较低值。
- 使用一根临时K线作为合并结果,不断与下一根K线比较,直到不再存在包含关系。
这段逻辑看似简短,但最容易出错的地方在于方向判定。很多初版实现会在合并后忘记更新方向标记,导致后续分型判断错乱。我建议在写这部分代码时单独封装一个函数,返回合并后的K线以及当前方向状态,以便单元测试时逐根验证。
补充一点:新旧笔规则对包含处理后的K线数量要求不同。老笔规则要求顶底之间至少有5根处理后的K线,新笔规则允许4根。我在dll中把这做成可配置参数,默认走老笔逻辑,因为老笔对分型的确认更严格,误判率低一些,适合自动化场景。
2.2 分型与笔:靠规则确认方向
分型识别是整个算法的分水岭。顶分型的定义是:中间K线的最高价最高,同时最低价也最高;底分型相反。但仅凭三根K线还不足以确认分型,因为后续K线可能破坏这个形态。所以在源码中我没有简单地在三根K线出现时就打标记,而是等待下一根K线确认后再输出结果。
方向上,笔的构建规则是:从一个分型开始,必须经过一个相反方向的有效分型,并且它们之间要满足最低K线数要求,才构成一笔。这一笔的起始点是分型的极值点,不是分型中间K线的收盘价。
实现时我使用了状态机模式。整个笔构建过程,状态在“寻找底分型”和“寻找顶分型”之间切换。每当找到新的反向分型且满足K线数约束时,就形成一笔,并把状态切换回去。这个状态机的好处是逻辑清晰,只要有新的K线数据流入,就可以增量更新笔的末端,很适合盘中动态刷新。
2.3 线段划分与中枢识别
笔形成后,下一步是线段。线段至少由三笔组成,且要求线段的方向和内部笔的整体方向一致。线段的破坏判断,使用的是特征序列法,这是缠论里公认最难标准化的部分。特征序列是线段方向上笔的顶或底分型形成的序列,当特征序列出现反向分型,并且对应的笔破坏了原线段的最后一个特征序列时,线段宣告结束。
在dll源码里,我采用了一种比较工程化的实现方案:维护一个线段池,每次新增一笔时,先判断它是否延伸现有线段,还是触发线段破坏。判据上我不只依赖分型形态,还会额外校验新线段的幅度和内部笔数。经验告诉我,纯按分型形态判断,在震荡市里很容易连续误判线段破坏,加上幅度阈值后,划分结果稳定很多。
中枢识别在线段之后进行。线段级别中枢的严格定义是至少三个连续次级别走势类型的重叠区间。在实际编码时,我会在线段列表上寻找连续三个线段的重叠价格区域,记录中枢的起点、终点以及高低区间。如果后续线段始终与中枢区间有重叠,则中枢延伸;当出现突破且回抽不进入中枢区间的线段时,标记中枢结束,并把该线段视为离开段。
2.4 源码结构与关键数据结构
这套dll源码的模块划分大致如下:
| 模块文件 | 职责 |
|---|---|
| kline.h / kline.cpp | K线数据接口与包含处理 |
| fenxing.h / fenxing.cpp | 分型识别与确认 |
| bi.h / bi.cpp | 笔的状态机构建与更新 |
| duan.h / duan.cpp | 线段划分与破坏判断 |
| zhongshu.h / zhongshu.cpp | 中枢识别、延伸与离开判断 |
| plugin_export.cpp | Dll对外导出函数层 |
关键数据结构方面,我会用两个vector分别保存K线列表和笔列表,再用一个自定义结构体保存中枢信息:
struct ChanZhongshu { int startIndex; // 中枢起始K线序号 int endIndex; // 中枢结束K线序号 double zsHigh; // 中枢上沿 double zsLow; // 中枢下沿 bool isExtended; // 是否发生延伸 int extendCount; // 延伸段数量 };这个结构体在计算买卖点时会反复用到,比如第三类买点,本质上就是价格向上突破中枢上沿后,回踩低点不进入中枢区间,这个判断完全依赖zsHigh和zsLow。
3. 把dll接到行情软件里的实操路径
3.1 编译与注册:x86版本不能忘
通达信系列软件目前大部分仍是32位程序,即使系统是64位的,它加载的外部dll也要求是32位版本。我用Visual Studio编译时,会把目标平台明确设为x86,而不是x64或AnyCPU。这个坑我踩过不止一次:第一次写好的dll在64位Debug下能正常生成,一放到行情软件里就加载失败,后来才反应过来是位数不匹配。
另外,运行时库建议选择多线程(/MT),避免依赖系统上的VC运行库。很多人的电脑没有安装对应版本的Visual C++ Redistributable,如果dll动态依赖msvcr120.dll之类的库,拿到别的机器上就报dll加载错误。选/MT后,运行库直接静态链接进dll,兼容性好很多。
注册环节相对简单,通达信的dll不需要在系统里执行regsvr32,只需要把dll文件放到指定文件夹,然后在公式管理器里通过外部函数引用。具体路径不同版本略有差异,一般在安装目录的T0002或根目录下找dll相关文件夹,或者直接在公式编辑器的“插入函数”里选择dll插件,再定位到文件路径。
3.2 公式侧调用方式
在通达信公式里调用dll函数,通常使用这种格式:
指标名称.DLL函数名(参数1, 参数2, ...)比如我导出的核心函数是ChanBiAndZS,公式里定义一个输出序列:
笔起点: 缠论DLL.ChanBiAndZS(1, HIGH, LOW, CLOSE); 笔终点: 缠论DLL.ChanBiAndZS(2, HIGH, LOW, CLOSE); 中枢上沿: 缠论DLL.ChanBiAndZS(3, HIGH, LOW, CLOSE); 中枢下沿: 缠论DLL.ChanBiAndZS(4, HIGH, LOW, CLOSE);注意,通达信调用dll传数组时,方式比较特殊,有的版本直接传数组名,有的版本需要传数据长度。我在dll导出函数里统一做了一层封装,对外函数签名保持一致,根据函数类型参数决定返回的是笔数据还是中枢数据。
公式侧参数设置里,尽量把不常用的参数写死,只把关键阈值(比如包含处理开关、笔的最小K线数、线段幅度阈值)暴露出来,方便后期调整而不重新编译dll。我实际暴露的参数有6个,日常使用真正频繁调整的只有2个:笔最小K线数和线段破坏幅度系数。
3.3 参数设计建议
参数这块我多说几句。缠论自动识别最忌讳的是参数过度拟合。把参数调得刚好适配某段历史行情,换一段行情就完全变形,这是很多人在量化里反复踩的坑。
我的做法是:固定大多数规则型参数(比如分型必须等待下一根K线确认、顶底分型中间K线必须最高或最低这类结构参数),只开放少量阈值型参数(比如线段破坏的幅度比例)。结构参数是缠论的骨架,应该保持稳定;阈值参数是缓冲,用来适应不同品种的波动特征。比如波动大的品种,线段破坏幅度系数可以设高一些,减少无效翻转。
如果你打算把这套源码扩展到其他品种上,建议先在一个品种上做完完整回测和目视检查,确认笔、段、中枢的位置和人工判断基本一致后,再微调阈值参数。每次只调一个参数,观察它对后续笔段结构的影响,而不是一次性把多个参数全改掉。
4. 常见问题与调试实录
4.1 dll加载失败的几种典型原因
结合我自己和社区里的经验,行情软件加载自定义dll失败,频率最高的原因有这么几类,整理成表方便排查:
| 现象 | 常见原因 | 处理方法 |
|---|---|---|
| 公式引用dll函数时提示找不到函数 | dll位数不对,64位dll被32位软件调用 | 重新用x86平台编译,确保Release版本 |
| dll文件放进目录后没有任何反应 | 文件没有被加载,或者目录不对 | 确认软件实际读取的dll路径,必要时用依赖工具查看dll导出函数名 |
| 调一次公式就让软件崩溃 | 内存越界,最常见是数组传入长度不对 | 在dll内部增加长度校验,对传入数组做边界检查 |
| 在不同电脑上加载结果不一致 | 依赖的VC运行库缺失 | 编译时选/MT静态链接,发布时附上必要运行库 |
特别要强调数组长度问题。通达信传入K线数组时,不同周期、不同股票的数据量不一样,如果dll里按固定长度读取,很容易越界。我的做法是在每次函数入口处,用传入的长度参数动态分配临时数组,所有中间结果都存储在局部容器里,返回结果时再拷贝到输出缓冲区。调试时可以用一个极小的数据量(比如30根K线)做输入,通过内存检测工具检查是否有越界写入。
4.2 识别结果异常的处理思路
如果dll能正常加载,但画出来的笔和线段跟你手画的不一样,问题一般出在两个环节:包含处理顺序不一致,或者分型确认时机不一致。
包含处理顺序不一致,通常是你处理包含关系的合并方向和缠论原文描述不一致导致的。建议先写一个单元测试:从某一段历史行情中手工挑出20根K线,把包含合并后的结果打印出来,和手工推演的结果逐根对比,一般很快就能定位到方向判定问题。
分型确认时机不一致更隐蔽。有的实现是“看到顶分型三根K线就标记”,有的实现是“等第四根K线出现后才确认”。这两种实现会在连续震荡行情里产生完全不同的笔划分,因为快速反转时可能一笔还没成立就被反向分型破坏了。我的dll里默认采用后者,也就是延迟确认,会减少很多无效笔,但代价是最后一笔的识别会有滞后,这在盘中实时显示时需要注意。
4.3 性能与稳定性调优
缠论dll计算的耗时主要集中在包含处理和线段划分上。包含处理虽然是递归逻辑,但每根K线实际参与合并的次数通常只有1到3次,总体计算量并不高。真正耗时的是线段划分中,每新增一笔都要回溯前面若干笔来判断特征序列是否破坏,K线数量多了之后,这个回溯操作会累积成明显的性能瓶颈。
我做了两个优化:
- 第一,在线段划分时记录每个线段的起始和终止索引,当新笔到来时,只需要检查最后一笔与最近一个线段的末端,不必从头遍历全部线段。
- 第二,对中枢识别使用增量更新。当中枢区间已经确定,后续K线不断进入时,只需要判断新K线是否落在区间内,不需要重新计算所有历史重叠。
稳定性方面,我还加了一个防御逻辑:如果输入K线数量少于50根,直接返回空数组而不是报错,避免在数据不足时计算出不可靠的笔段结构。盘中动态刷新时,最后一笔可能处于未完成状态,我返回的数据里会带一个状态标识,公式端可以根据标识决定是否显示当前未确认的笔。
最后分享一点个人心得
这套缠论dll源码我反复改了很多遍,最大的体会是:缠论自动识别,难点从来不在代码量,而在规则边界的定义。你写代码时多思考一步“这根K线到底应该归到哪一笔”,比多写一千行逻辑都管用。刚开始做的时候,我也会迷信网上流传的各类指标源码,后来发现最靠谱的还是自己一步步验证过的规则。哪位朋友也在写类似的指标dll,欢迎多交流,特别是线段特征序列破坏的那一段,每个品种的适配参数都不一样,这个坑只有自己踩过才记得牢。
本文还有配套的精品资源,点击获取