手把手把缠论画到通达信主图: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.cppBi 列表 / 端点标记
线段连接Duan.cpp线段端点标记
中枢识别ZhongShu.cppPivot 列表(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/2H、L顶底端点 ±1画简笔/标准笔
3/4FRAC、H、L线段端点 ±1画标准线段/1+1线段
5FRAC、H、L中枢高点数组画中枢上沿
6FRAC、H、L中枢低点数组画中枢下沿
7FRAC、H、L起点=1、终点=2标记中枢边界
8FRAC、H、L方向数组区分上/下中枢
9FRAC、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 Release

CMakeLists.txt 中有个值得注意的设计:算法核心chanlunx_core编译为静态库并与 DLL 一起使用/MT(静态链接 CRT),让插件自包含、不依赖宿主程序运行时;而测试程序单独用/MD配合 GoogleTest 的动态 CRT,两条链路互不干扰。

第三步:部署到通达信

  1. 把编译产物ChanlunX.dll复制到通达信安装目录的T0002\dlls\
  2. 在通达信公式系统里把该 DLL 绑定为2 号插件函数
  3. 新建主图公式,粘贴下一节的公式代码即可。

提醒: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),仅供参考