手把手把缠论画到通达信主图:3步编译ChanlunX插件并跑通笔线段中枢
手把手把缠论画到通达信主图:3步编译ChanlunX插件并跑通笔线段中枢
【免费下载链接】ChanlunX缠中说禅炒股缠论可视化插件项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX
ChanlunX 是一款面向通达信金融终端的缠论可视化插件,它通过 DLL 扩展机制把"笔、线段、中枢"这三层缠论结构直接画在主图上。本文不空谈理论,而是沿着"痛点→原理→编译→部署→扩展"的路径,带你从零跑通这个开源项目,并理解其算法与工程设计的取舍。
1. 为什么需要"机器画的缠论"
缠中说禅理论的核心是把价格走势拆解为可重复验证的结构:K线包含关系、笔、线段、中枢。理论上谁都能画,但实操中问题不少。
手工画缠论的三个痛点
- 主观性:同一段走势,不同人画的笔和中枢常有出入,"千人千缠"。
- 滞后性:靠肉眼盯盘,等确认中枢成立往往已经错过最佳观察窗口。
- 低效率:A股全市场几千只标的,逐只手工标注不现实。
一条DLL如何"背书"缠论
ChanlunX 把缠论判定规则固化成 C++ 算法,编译为通达信可加载的 DLL 插件。公式只需一行TDXDLL2(...)调用,就能拿到标准化的笔端点、线段端点和中枢区间。规则统一、结果可复现,这是手工画法难以替代的价值。
2. 先看效果:主图上的四层结构
安装并绑定插件后,缠论主图公式会输出四类元素:黄色虚线是笔、橙色实线是线段、橙色矩形是线段中枢、黄色矩形是笔中枢。
图1:ChanlunX 缠论可视化插件效果图,矩形框标注中枢结构,虚线标注笔的划分
图2:ChanlunX 缠论可视化插件笔段划分效果图,线条连接关键高低点,展示笔与线段走势
从上图能直观看到:行情在左边形成笔与中枢,右侧延续处笔被重新修正,这正是增量数据处理的结果——后面我们会讲到算法如何做到这一点。
3. 核心流水线拆解:从K线到中枢的四级递进
缠论分析不是单个算法,而是一条四级流水线。ChanlunX 把每一级拆成独立模块,对应四个源文件。
| 流水线级别 | 源文件 | 输出结构 |
|---|---|---|
| K线包含处理 | KxianChuLi.cpp | 合并后的 Kxian 序列 |
| 笔识别 | Bi.cpp、BiChuLi.cpp | Bi 列表 / 端点标记 |
| 线段连接 | Duan.cpp | 线段端点标记 |
| 中枢识别 | ZhongShu.cpp | Pivot 列表(zg/zd/direction) |
第一级:K线包含关系处理
包含关系指相邻两根K线高低点互相覆盖。处理规则取决于当前走势方向:向上时取"高高",向下时取"低低"。KxianChuLi 的add方法逐根吞入K线,边处理边维护方向:
// KxianChuLi.cpp:逐根K线做包含处理 if (gao > this->kxianList.back().gao && di > this->kxianList.back().di) { // 向上:记录为方向1 kxian.fangXiang = 1; } else if (gao < this->kxianList.back().gao && di < this->kxianList.back().di) { // 向下:记录为方向-1 kxian.fangXiang = -1; } else if (gao <= this->kxianList.back().gao && di >= this->kxianList.back().di) { // 前包含:按方向吞并高低点,jieShu 向后延伸 this->kxianList.back().jieShu += 1; }注意每个合并后的 Kxian 都会记录kaiShi(起点坐标)与jieShu(终点坐标),坐标信息在后续输出端点标记时至关重要。
第二级:成笔判定
笔是相邻顶底分型之间的走势段。BiChuLi 用ifChengbi判断一段K线能否成笔:先要求至少4根合并后K线,再验证是否出现突破前低的更低价(向下笔)或突破前高的更高价(向上笔)。
// BiChuLi.cpp:向下成笔的核心判断 if (tempKxianList.size() < 4) return false; // K线数不足,不成笔 float zuiDiJia = tempKxianList.at(i).di; // 记录当前最低价 for (unsigned int j = i + 1; j < tempKxianList.size(); j++) { if (tempKxianList.at(j).di < zuiDiJia) return true; // 出现更低价,笔成立 }成笔后,Bi结构体记录方向、起止坐标与最高最低价;若后续K线继续创新高(向上笔),则笔延续、终点后移,这就是"走势未走完、笔会不断修正"的原因。
第三级与第四级:线段与中枢
Duan.cpp 在笔序列之上做标准化连接,提供标准画法与"1+1终结"两种画法;ZhongShu.cpp 统计连续三笔的重叠区间,输出Pivot(含 zg 中枢高、zd 中枢低、direction 方向),并支持识别同方向第 N 个中枢。
4. 九个DLL函数:公式与C++算法之间的桥
通达信通过固定的回调约定调用插件。ChanlunX 在 Main.cpp 中注册了9个计算函数,每个函数接收(nCount, pOut, a, b, c)形式的裸指针数组。
函数注册表
// Main.cpp:注册函数表,nFuncMark 对应公式中的函数编号 static PluginTCalcFuncInfo Info[] = { {1, &Func1}, // 简笔顶底端点 {2, &Func2}, // 标准笔顶底端点 {3, &Func3}, // 线段端点(标准画法) {4, &Func4}, // 线段端点(1+1终结画法) {5, &Func5}, // 中枢高点 {6, &Func6}, // 中枢低点 {7, &Func7}, // 中枢起点(1)/终点(2) {8, &Func8}, // 中枢方向 {9, &Func9}, // 同方向第 N 个中枢 {0, NULL}}; BOOL RegisterTdxFunc(PluginTCalcFuncInfo **pInfo) { if (*pInfo == NULL) { *pInfo = Info; return TRUE; } return FALSE; }数据如何流转
以中枢输出为例:公式先调用函数2得到笔端点序列 FRAC,再把 FRAC、H、L 传给函数5/6/7。Main.cpp 内部把 float 指针拷贝进std::vector,调用ZS()得到Pivot列表,再把 zg、zd、起止信号逐位写回输出缓冲区。整个链路全是值语义的数组搬运,不涉及共享内存,隔离干净。
| 编号 | 输入参数 | 输出内容 | 典型用途 |
|---|---|---|---|
| 1/2 | H、L | 顶底端点 ±1 | 画简笔/标准笔 |
| 3/4 | FRAC、H、L | 线段端点 ±1 | 画标准线段/1+1线段 |
| 5 | FRAC、H、L | 中枢高点数组 | 画中枢上沿 |
| 6 | FRAC、H、L | 中枢低点数组 | 画中枢下沿 |
| 7 | FRAC、H、L | 起点=1、终点=2 | 标记中枢边界 |
| 8 | FRAC、H、L | 方向数组 | 区分上/下中枢 |
| 9 | FRAC、H、L | 同向第 N 序号 | 计数同向中枢 |
5. 三步完成环境搭建与编译部署
ChanlunX 使用 CMake 构建,算法部分编译为静态库,插件本体是共享库。整个流程只需三个步骤。
第一步:准备环境
- CMake 3.20 或更高版本
- Visual Studio 2019+(需支持 C++17)
- 通达信金融终端(用于部署验证)
第二步:CMake 编译
按通达信位数选择架构参数,32位选Win32,64位选x64:
mkdir build && cd build cmake -A Win32 .. cmake --build . --config ReleaseCMakeLists.txt 中有个值得注意的设计:算法核心chanlunx_core编译为静态库并与 DLL 一起使用/MT(静态链接 CRT),让插件自包含、不依赖宿主程序运行时;而测试程序单独用/MD配合 GoogleTest 的动态 CRT,两条链路互不干扰。
第三步:部署到通达信
- 把编译产物
ChanlunX.dll复制到通达信安装目录的T0002\dlls\。 - 在通达信公式系统里把该 DLL 绑定为2 号插件函数。
- 新建主图公式,粘贴下一节的公式代码即可。
提醒:DLL 位数必须与通达信一致,混用会导致加载失败。
6. 主图公式实战:三行代码画出缠论全貌
绑定2号插件后,公式里用TDXDLL2(函数号, 参数...)调用。以下公式完整画出了笔、线段及两级中枢:
{标准笔端点} FRAC:=TDXDLL2(2,H,L,0); {画上升/下降笔:黄色虚线} DRAWLINE(FRAC=-1,L,FRAC=+1,H,0), DOTLINE,COLORYELLOW; DRAWLINE(FRAC=+1,H,FRAC=-1,L,0), DOTLINE,COLORYELLOW; {笔中枢的高、低与起止} BIZG:=TDXDLL2(5,FRAC,H,L); BIZD:=TDXDLL2(6,FRAC,H,L); BISE:=TDXDLL2(7,FRAC,H,L); {画笔中枢:黄色矩形} STICKLINE(BISE,BIZD,BIZG,0,0),COLORYELLOW; {线段端点(改4为1+1终结画法)} DUAN1:=TDXDLL2(3,FRAC,H,L); {画线段:橙色实线} DRAWLINE(DUAN1=-1,L,DUAN1=+1,H,0), COLORFF8000; DRAWLINE(DUAN1=+1,H,DUAN1=-1,L,0), COLORFF8000;公式思路值得拆解:DRAWLINE以 ±1 为条件把相邻顶底连成直线;STICKLINE用中枢区间绘制矩形;函数5/6/7 的返回值只在中枢内部非零,配合IF(BIZG,BIZG,DRAWNULL)即可在非中枢区段留白。你还可以把函数4换成函数3验证两种线段画法的差异。
7. 质量保障:GoogleTest 与双链路构建
算法类项目最怕"看着对、一测就错"。ChanlunX 用 Google Test 覆盖核心函数的边界情况。
测试用例设计
// tests/chanlunx_test.cpp:边界与正常场景并重 TEST_F(Bi1Test, 空数据返回全零) { std::vector<float> out = Bi1(0, {}, {}); EXPECT_EQ(out.size(), 0ul); // 空输入不崩溃 } TEST_F(Bi1Test, 正常笔划分) { std::vector<float> h = {10.0f, 12.0f, 11.0f, 7.0f}; std::vector<float> l = {9.0f, 8.0f, 7.0f, 6.0f}; std::vector<float> out = Bi1(4, h, l); EXPECT_EQ(out.size(), 4ul); // 输出长度与输入一致 }测试覆盖空输入、单根K线、两根K线不成笔、正常成笔等场景,直接规避了数组越界和异常输入崩溃这两类插件高危问题。
双链路构建的意义
测试程序直接编译算法源文件(chanlunx_test链接CORE_SRCS),而不是链接/MT的静态库,因此可以用/MD与 GoogleTest 的动态 CRT 正常配合。这种"插件与测试各走各的运行时"的做法,避免了两套 CRT 混用导致的崩溃,是值得借鉴的工程细节。
8. 二次开发与进阶玩法
模块化让扩展门槛很低:算法层加函数、接口层注册编号、公式层调用,三步即可上线一个新指标。
扩展一个"笔中枢个数"函数
在 ZhongShu.cpp 里基于ZS()的结果写一个计数函数,在 Main.cpp 中照抄 Func9 的注册方式加为 10 号函数,然后公式里TDXDLL2(10,FRAC,H,L)即可。整个流程不需要改动任何既有接口。
与常用指标联动
缠论结构适合与其他指标互相验证,这里给出不同周期下的参考配置思路:
| 应用场景 | 适用周期 | 观察重点 | 联动指标 |
|---|---|---|---|
| 短线 | 1/5分钟 | 笔的快速转折 | MACD 背驰 |
| 波段 | 30/60分钟 | 线段方向 | 均线多空排列 |
| 中线 | 日线 | 中枢突破 | 成交量配合 |
| 长线 | 周/月线 | 大级别中枢 | 波动率过滤 |
9. 对比与取舍:为什么选"DLL + 公式"这条路
缠论分析实现方式不少,ChanlunX 的选择有其明确理由:
| 对比维度 | ChanlunX | 独立行情软件 | 量化平台脚本 |
|---|---|---|---|
| 落地成本 | 复制一个DLL即可 | 需要切换软件 | 依赖平台环境 |
| 计算性能 | C++ 原生、毫秒级 | 一般 | 取决于解释器 |
| 规则透明度 | 开源可审计 | 黑盒 | 可查看 |
| 与看盘流程集成 | 直接画在主图上 | 需来回切换 | 通常无图形化主图 |
| 开发门槛 | 需编译 C++ | 无扩展能力 | 脚本语言门槛低 |
它的主要代价是编译环境要求(Windows + MSVC)和通达信平台绑定。但如果你日常就在通达信里看盘,这种"零切换成本"的收益通常大于迁移成本。
10. 小结与下一步
ChanlunX 的价值在于把缠论从"主观经验"变成"可执行、可复现、可验证"的代码:K线包含、成笔、线段、中枢四级流水线职责清晰,9个 DLL 函数与通达信公式无缝对接,GoogleTest 与双链路构建为质量兜底。
它适合三类人:想统一缠论画法的技术分析爱好者、需要快速验证缠论结构的中级开发者、以及想在通达信生态里做指标创新的量化实践者。下一步建议:先按本文三步跑通部署,再用测试用例库做边界回归,最后在公式层尝试你自己的画法组合——算法的边界,往往就是你对缠论理解的边界。
【免费下载链接】ChanlunX缠中说禅炒股缠论可视化插件项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
