ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

缠论K线包含处理通达信公式:标准化K线驱动分型与笔

2026/9/9 1:48:05 拓冰建站 浏览量
缠论K线包含处理通达信公式:标准化K线驱动分型与笔 简介通达信缠论K线包含处理插件源码是一套基于通达信交易平台的DLL插件专为缠论研究者与通达信二次开发人员设计核心解决K线包含关系的自动判断与合并为后续笔、线段、中枢的构建提供数据基础。资源包共24个文件较完整地包含C头文件与实现代码、Visual Studio工程管理文件、编译生成的dll/lib/obj等产物以及使用说明文档整体仅693KB便于开发者快速定位核心逻辑并直接调试。已有5689人学习下载。通过阅读源码可以理解缠论K线包含处理的具体算法流程从读取通达信K线数据、相邻K线包含判断、合并生成新K线到依据缠论规则构造笔、线段与中枢进而掌握开发通达信DLL插件的整体框架与接口调用方式。这些内容对希望将缠论理论转化为自动化工具或学习交易平台插件开发的读者都有较强的参考价值。 做缠论量化的人早晚会在通达信里撞上K线包含处理这道坎。我最早手动标记标准K线时被连续五六根包含K线折腾到怀疑人生。后来把包含处理这一步写成了公式型插件整个缠论主图立刻清爽许多不需要盯着一堆重叠的K线数来数去标准K线的高低点自动画在图上顶底分型、笔的推导也有了可信的基础。这篇文章先讲清楚缠论K线包含处理到底在做什么再给出一套在通达信公式系统里可直接运行的插件源码最后分享我在实测中踩过的坑。适合已经开始接触缠论、想在通达信里搭建自己分析工具的朋友如果你只是想找一段代码直接粘贴第3节的源码可以直接拿去用但建议把前两节看完否则很容易因为方向判断不一致得到错乱结果。1. 为什么缠论需要单独的K线包含处理工具1.1 缠论技术分析的起点K线标准化缠论里几乎所有后续判断——顶底分型、笔、线段甚至中枢——都建立在一个前提上K线之间不存在包含关系。所谓包含关系就是相邻两根K线中某一根的最高价和最低价都被另一根完全“包住”。比如前一根高点是10元、低点是8元当前这根高点只有9元、低点却有7元那么当前K线就被前一根包含了。这时候如果不做处理后续判断分型时会出现很多假信号看起来像顶分型实际上中间K线根本不符合分型定义。我最初以为这种处理只是“把两根K线并成一根”后来发现没那么简单。包含处理不是简单取平均值也不是随意丢弃一根K线它有一套严格的规则先看前面两根非包含K线的走势方向向上就取两根K线高点的较高者、低点的较高者向下则取高点的较低者、低点的较低者。这套规则保证了处理后的每根K线都有明确的方向感不会因为局部合并而丢失整体趋势。很多人问我通达信自带的K线能不能直接拿来画笔答案是不能。通达信的原始K线没有内置缠论包含处理如果你加载一个缠论画笔指标会发现不同源码画出来的笔经常对不上很大原因就是包含处理的口径不一致。这也是为什么做缠论分析必须有一个独立的K线包含处理工具先把原始K线标准化后面所有分析才有共同地基。1.2 包含处理的核心规则先定方向再按方向合并具体规则可以用一句话概括先判断方向再决定合并时取高还是取低。方向来源于当前K线之前的最近两根非包含K线而不是用当前这根正在被包含的K线来判断。如果之前两根K线是高点抬高、低点也抬高说明处于向上走势合并时取两根K线高点的最大值和低点的最大值如果之前两根K线是高点降低、低点也降低说明处于向下走势合并时取两根K线高点的最小值和低点的最小值。举个例子。假设前面两根非包含K线方向向上当前K线高点9、低点7前一根K线高点10、低点8两者存在包含关系那么合并后的标准K线高点取10、低点取8相当于保留了强势的那一根。如果方向向下同样是这两根K线合并后高点取9、低点取7因为下跌趋势中要保留更弱的那一侧。这个细节非常容易搞反我见过不少网上流传的公式在这个判断上写反了出来的标准K线在关键位置会低点破位或者高点虚高直接带偏后面所有分型判断。处理完一根之后新的标准K线还要继续和下一根原始K线比较直到不再出现包含关系为止。也就是说包含处理是一个连续迭代的过程不是只处理一次就能完成。遇到连续四五根K线互相包含时单轮处理根本不够这也是后面源码部分我特意做了多轮迭代的原因。1.3 为什么手动处理不现实说实话盘后静态复盘的K线手工一根根去合并是可行的但实操中完全没有效率。一是实时行情里最后一根K线会随着盘中价格不断变化你没有精力每次变化都重新合并一遍二是连续包含的K线需要反复倒推人工极容易出错尤其在方向判断这块稍一犹豫结果就变了三是量化场景下指标公式必须保持口径一致人工处理没法复制到历史回测里。把包含处理写进通达信公式本质上是把这个“费眼睛、费耐心、还容易错”的过程固化下来。公式不管你面对的是日线、30分钟还是5分钟图规则都一样不会因为行情剧烈波动就手抖。这才是我写这个插件的根本动机——不是为了炫技而是为了让缠论分析的第一步是确定性的。2. 通达信公式实现包含处理的核心思路2.1 把缠论规则翻译成公式语言通达信的公式语言虽然不像Python那样灵活但处理包含关系已经够用。核心思路是先定义两个状态是否包含、方向朝上还是朝下然后用IF语句做合并取数。下面的表格是我的实现里最核心的对应关系搞懂了这张表源码基本就能看懂了缠论规则通达信公式表达当前K线与前一根K线存在包含关系(HREF(H,1) AND LREF(L,1)) OR (HREF(H,1) AND LREF(L,1))前两根K线方向向上REF(H,2)REF(H,1) AND REF(L,2)REF(L,1)前两根K线方向向下REF(H,2)REF(H,1) AND REF(L,2)REF(L,1)向上走势中的合并高点取MAX(H,REF(H,1))低点取MAX(L,REF(L,1))向下走势中的合并高点取MIN(H,REF(H,1))低点取MIN(L,REF(L,1))这套表达本身就是缠论定义最直白的翻译。我建议你自己对着图表过一遍比直接粘代码有用得多。2.2 方向判断是整个公式最容易出错的地方方向判断在源码里用UP1和DOWN1两个变量表示。我最初版本写的是直接比较当前K线和前一根K线的高低价差结果在市场震荡期方向来回跳合并出来的标准K线明显失真。后来才意识到缠论里说的方向必须看“前两根非包含K线”的方向而不能拿两个本身就存在包含关系的K线去判断。用通达信公式表达的话就是REF(H,2)REF(H,1) AND REF(L,2)REF(L,1)表示向上REF(H,2)REF(H,1) AND REF(L,2)REF(L,1)表示向下。严格来说这两根K线也未必是完全没有包含关系的所以在极端情况下还是会和手工判断有细微偏差。我的处理方式是做工程化妥协先用原始K线判断方向然后用合并后的结果再做一轮迭代实测下来绝大多数情况都和手工严格处理一致。如果你追求完全精确那就得用通达信的DLL插件机制用C语言写递归处理逻辑在公式层确实有边界。这个我在第5节还会细说。2.3 通达信公式的三条边界写这套源码之前你必须先接受通达信公式的几条边界否则会到处碰壁。第一公式语言不支持动态循环改写序列。你不能像Python里那样写个for循环每根K线根据前一根的处理结果决定当前这根是否合并。通达信只能通过REF函数引用固定偏移位置的历史数据所以递归合并必须靠“多轮迭代”来模拟也就是把上一轮的输出当作下一轮的输入继续处理。第二迭代次数不能无限增加。每一轮迭代都要重复计算多个中间变量公式体量会膨胀运行速度也会下降。我实测过两轮迭代在通达信里运行很流畅三轮也还能接受但四轮以上在分钟周期上就会出现明显的卡顿感。第三输出形态受限。通达信的公式可以输出折线、K线、图标、文字但不能直接修改原始K线数据源。所以我的源码输出的是“标准K线的高低点曲线”而不是一个新的K线对象。如果你在主图上看到的是两条高低点线而不是替换后的实体K线这是正常的。3. 插件源码逐段拆解3.1 第一步包含关系判定第一步要做的就是判断每一根K线和前一根K线是否构成包含关系。这里我用HIGH和LOW作为数据源它们在通达信里分别代表当前K线的最高价和最低价REF(H,1)代表前一根最高价REF(L,1)代表前一根最低价。包含关系的判定条件是两个方向都要覆盖当前K线高点大于等于前一根高点、低点小于等于前一根低点或者反过来当前K线高点小于等于前一根高点、低点大于等于前一根低点。两者满足其一就说明两根K线互相有重叠包含需要合并。3.2 第二步方向锚点与单次合并方向锚点用REF(H,2)、REF(L,2)和REF(H,1)、REF(L,1)这两组数据计算。UP1为真表示前面两根K线正在向上推进DOWN1为真表示正在向下推进。只有两个方向都不成立时DIR1才会为0此时不合并。实际的合并操作落在M1H和M1L两个变量上。如果存在包含关系就按方向分别取MAX或者MIN如果不存在包含关系就直接沿用原始HIGH和LOW。这一步得到的M1H和M1L已经是“经过一轮包含处理后的第一轮标准高低点”。3.3 第三步迭代合并与输出为什么要做第二轮因为连续包含时第一轮合并后的K线可能还会和相邻的标准K线形成新的包含关系。我直接把第一轮的M1H、M1L当作第二轮的数据源重复一遍方向判断、包含判断和取数逻辑得到M2H和M2L。绝大多数连续包含场景两轮足够。输出部分我用两条曲线来展示结果红色曲线代表包含处理后的标准K线高点绿色曲线代表标准K线低点。同时用一个黄色小圆点标记发生过包含合并的位置方便你在图上快速回看哪些地方被处理过。3.4 完整源码下面是可以直接复制到通达信的完整公式源码。公式类型选择主图叠加。{} { 缠论K线包含处理主图指标 } { 处理逻辑先判断方向再按方向合并 } { 双轮迭代适用于绝大多数连续包含场景 } {} {-------- 第一轮原始K线处理 --------} H1:HIGH; L1:LOW; UP1:REF(H1,2)REF(H1,1) AND REF(L1,2)REF(L1,1); DOWN1:REF(H1,2)REF(H1,1) AND REF(L1,2)REF(L1,1); DIR1:IF(UP1,1,IF(DOWN1,-1,0)); ISINC1:(H1REF(H1,1) AND L1REF(L1,1)) OR (H1REF(H1,1) AND L1REF(L1,1)); M1H:IF(ISINC1,IF(DIR10,MAX(H1,REF(H1,1)),MIN(H1,REF(H1,1))),H1); M1L:IF(ISINC1,IF(DIR10,MAX(L1,REF(L1,1)),MIN(L1,REF(L1,1))),L1); {-------- 第二轮基于第一轮结果再处理 --------} UP2:REF(M1H,2)REF(M1H,1) AND REF(M1L,2)REF(M1L,1); DOWN2:REF(M1H,2)REF(M1H,1) AND REF(M1L,2)REF(M1L,1); DIR2:IF(UP2,1,IF(DOWN2,-1,0)); ISINC2:(M1HREF(M1H,1) AND M1LREF(M1L,1)) OR (M1HREF(M1H,1) AND M1LREF(M1L,1)); M2H:IF(ISINC2,IF(DIR20,MAX(M1H,REF(M1H,1)),MIN(M1H,REF(M1H,1))),M1H); M2L:IF(ISINC2,IF(DIR20,MAX(M1L,REF(M1L,1)),MIN(M1L,REF(M1L,1))),M1L); {-------- 输出 --------} 标准K线高: M2H, COLORRED, LINETHICK1; 标准K线低: M2L, COLORGREEN, LINETHICK1; 发生合并: IF(ISINC1 OR ISINC2, LOW*0.98, DRAWNULL), POINTDOT, COLORYELLOW;代码里有几个细节值得说明。发生合并这个输出我用LOW*0.98作为标记点的基准位置这样标记会落在K线下方不会遮挡主图的价格区域。COLORYELLOW的POINTDOT是小圆点密集出现时也不会太乱。如果你想在图上直接看到合并后的K线实体可以把最后两行改成DRAWKLINE表达式但要注意DRAWKLINE需要同时提供开盘价和收盘价而包含处理严格来说只处理高低点开盘价和收盘价的合并口径存在争议所以我这里不推荐强行画实体K线保留高低点曲线反而是最干净的展示方式。4. 安装到通达信的细节与参数设置4.1 新建主图叠加公式安装步骤不复杂但有一个关键选择容易错。打开通达信按CtrlF打开公式管理器选择“技术指标公式”点“新建”。公式名称可以写“缠论K线包含处理”画线方法务必选择“主图叠加”不是“副图”。如果选成副图输出的高低点曲线就会被画到副图区域和你原本的K线完全对不上看起来就像两条毫无意义的波浪线。代码粘贴进去后点“确定”保存。如果语法有问题通达信会弹出错误提示并定位到大概行号按提示检查即可。保存成功后在K线主图界面直接输入公式名称的拼音首字母比如“CLKXBHC”就能快速调用。也可以在主图上右键选择“主图指标”从列表里找到它。4.2 只看最近N根的显示控制默认情况下这套公式会在所有历史K线上做包含处理并输出曲线。如果你只想观察最近一段时间的处理效果可以给输出语句加一个显示范围过滤。通达信里用CURRBARSCOUNT这个函数它表示当前K线距离最后一根K线的倒数位置最后一根为1往前一根为2以此类推。想看最近60根K线的处理结果就把输出部分改成标准K线高: IF(CURRBARSCOUNT60, M2H, DRAWNULL), COLORRED, LINETHICK1; 标准K线低: IF(CURRBARSCOUNT60, M2L, DRAWNULL), COLORGREEN, LINETHICK1;这样右侧只有最近60根K线有曲线前面全部显示为空。不过我不建议把这个过滤条件写死在公式里因为切换周期或者看不同股票时你需要的可视范围可能不一样。更好的做法是记下这个写法需要时临时改一下或者干脆不做过滤用缩放功能控制视野反正曲线本身不占太大资源。4.3 参数管理与多周期适配这套公式没有设计独立的参数N因为包含处理本身不应该有“只处理最近多少根K线”的概念它是对整段K线数据的一致性操作。如果你确实需要自定义可以在公式开头加一行参数声明通达信公式参数区的格式是N:60;然后把所有输出语句里的条件都换成这个N变量。适配多周期不需要改代码。日线、周线、30分钟、5分钟只要调用的K线数据源是HIGH和LOW公式逻辑天然适用。原因是缠论K线包含处理的规则和周期无关它只看相邻K线之间的价格关系不看时间维度。5. 实测效果与高频踩坑记录5.1 正确结果长什么样我在日线和30分钟周期上都跑过这套公式。处理正确时你能看到红色高点曲线和绿色低点曲线不再像原始K线那样频繁交错而是呈现出明显的分段感上升段里高点和低点同步抬高下降段里同步降低震荡段里曲线相对平整。原来那些互相包含的K线位置会出现黄色小圆点标记意味着这里发生过一次合并。更直观的验证方法是找一个标准的顶分型和底分型结构。原始K线中如果中间K线被两边包含肉眼很难判断分型是否成立用处理后的曲线再看顶分型的中间高点是局部最高的底分型的中间低点是局部最低的非常干净。这个效果不需要回测肉眼就能确认公式是否正常工作。5.2 两个绕不开的坑坑一是三根以上K线连续包含时单轮处理结果不对。具体表现是合并后的高点仍然被后续K线包含曲线出现不自然的凹陷。我在源码里默认做了两轮迭代已经覆盖了大多数情况。如果你遇到四根甚至五根连续包含的极端走势可以再复制一轮M2H、M2L的处理逻辑生成M3H、M3L作为最终输出。我试过在日线级别上三轮迭代几乎能把所有连续包含场景处理干净但公式体量会增加不少建议只在确实需要时扩展。坑二是严格方向定义和工程近似的差异。按缠论原文方向锚点应该是“最近两根非包含K线”但通达信公式里很难向前动态搜索最近的非包含K线。我用的是REF(H,2)和REF(H,1)这种固定偏移逻辑上是一个近似版本。大多数行情下没问题但在快速变盘的位置可能出现第一轮方向判断和手工严格判断不一致的情况。一个缓解办法是把处理后的曲线再叠加到原始K线上对比如果发现标准K线高低点和肉眼判断明显矛盾就说明那个位置触发了近似误差。对这种极端位置我更建议手工确认不要盲目相信自动处理。5.3 配合分型与画笔的使用建议很多朋友拿到这个公式后会想着直接用它来画分型和笔。标准做法是先用这个公式的输出曲线作为分型判定的数据源再在分型基础上连接画笔。不要直接用原始K线画笔否则在包含关系密集的地方笔会被画得断断续续。分型判定的方法很简单顶分型就是中间K线的标准高点比左右两根都高且左右各存在一根有效K线底分型就是中间K线的标准低点比左右两根都低。你可以在另一个公式里用REF函数引用M2H和M2L来判断比如REF(M2H,1)REF(M2H,2) AND REF(M2H,1)M2H表示当前可能形成顶分型但这里有一个缠论自带的问题最后一根K线没走完之前分型都可能被破坏所以判断结果只能作为参考右侧确认后才能用。千万不要拿着未确认的分型直接做交易决策这一点所有缠论工具都一样不是公式bug。6. 写在最后一点个人使用习惯这套公式我实际用了挺长时间最深的体会是包含处理虽然是缠论里最基础的一步但恰恰是决定整个分析可靠性的地方。基础错了后面画再多笔和线段都是空中楼阁。我的使用习惯是把处理后的高低点当作“中间层数据”来看待不直接用它做选股条件而是先肉眼对比几个关键位置的合并结果确认公式口径符合自己理解的缠论规则。如果想做选股或者量化回测建议在这个公式基础上再封装二次指标而不是直接把画线输出作为条件选股条件因为通达信的条件选股需要的是一个数值条件不是绘图线。最后提醒一句股票技术分析只是交易决策的一部分任何指标都不能保证盈亏本文源码仅用于技术交流和研究实盘请务必自行确认逻辑并控制风险。本文还有配套的精品资源点击获取