简介:这是一份面向股票短线交易者与通达信指标开发者的分时成交量公式源码文档,围绕分时量能变化捕捉盘中涨停信号展开,适合有一定通达信公式编写基础、希望把量比、换手率与涨停提示结合使用的读者参考。压缩包内仅1个doc文件,约270KB,集中收录副图指标完整源码,涵盖成交量与流通盘比对的换手率计算、标准量与最大量统计、不同涨跌状态下的量柱着色、★涨停标记,以及均量比、昨日比等矩形图表的绘制语句,并注明无未来函数,可直接粘贴到通达信公式管理器验证效果。文件借助PFFIN、STICKLINE、DRAWTEXT、DRAWRECTREL等函数示范了量能数据的取用与图形输出思路,便于读者按自身策略改写参数或嵌入其他分析模型。目前已有2308人学习下载,可作为分时量价策略开发与公式排错的实操素材。
1. 分时量柱为什么会分出五层颜色:一份抓涨停副图源码的拆解路径
早盘 9:30 到 9:42 那十二分钟,分时量柱挤成一团,肉眼分不出哪根是正常换手、哪根是真有人在扫货。这份通达信副图源码要处理的就是这件事:把流通盘、实时换手率、当日历史峰值量三组数拧成一条判断链,按触发强度给分时量柱分层上色,触发到一定程度就在量柱下方打一个"★",再顺手把"均量比""昨日比"两条横向进度条贴在副图空白区。它面向的是已经习惯盯分时副图、并且愿意自己改阈值的那批人,不是拿来直接当买卖信号的。源码里有两处写法在通达信原生编辑器里编译不过——语句式 IF 块和带空格的变量名,另外还有颜色属性互相覆盖的硬伤。下面按数据层、染色层、绘图层、调试层逐段拆开。
2. 流通盘口径与换手率:CAPITAL、PFFIN 与 dbhs 的除数选择
换手率这条链子的入口是分母。分母取错,后面所有染色阈值都会跟着漂。原始代码里有三处跟分母相关的写法值得单独拎出来说:一是流通盘做了减法,二是dbhs做了分支,三是标准量用了一个自适应逻辑。
2.1 流通盘为什么要从 CAPITAL 里减一块
CAPITAL在通达信里返回的是流通股本,单位是手。对绝大多数标的够用,但对含限售解禁、次新股、股本表刚变更的票,本地财务数据和实际可交易盘之间会有偏差。源码试图用扩展财务字段修正:
{ 原始写法:通达信原生编辑器会报语法错误 } mm:=0; IF PFFIN(4251,0)>0 Then begin mm:=PFFIN(4251,0); end; 流通盘:=CAPITAL-mm/100;IF ... Then begin ... end是 Pascal 风格的语句块,通达信公式引擎只认IF(条件, 真值, 假值)这种函数式写法。粘贴后测试公式会直接提示语法错误,位置就在Then。改成下面这样:
{ 兼容写法:用 IF 函数替代语句式条件块 } mm:=IF(PFFIN(4251,0)>0, PFFIN(4251,0), 0); 流通盘:=CAPITAL-mm/100;从mm/100这个除法关系反推,PFFIN(4251,0)取回的值单位应该是股,除以 100 折算成手,再从CAPITAL里扣掉。mm初值给 0 是必要的——通达信里未赋值的变量直接参与运算返回无效值,不是 0。
| 变量 | 含义 | 单位 | 常见坑 |
|---|---|---|---|
| CAPITAL | 流通股本 | 手 | 解禁、次新股更新滞后 |
| PFFIN(4251,0) | 扩展财务字段 | 股(按折算推断) | 字段号在不同数据包里不通用 |
| mm | 扣减量 | 股 | 未赋值直接运算返回无效值 |
| 流通盘 | 修正后流通盘 | 手 | 为 0 时后续全部除零 |
提示:动手之前先在数值栏单独输出一次
PFFIN(4251,0),确认本机返回的是正数还是 0,别照抄字段号。
2.2 dbhs 的 2000000 阈值
dbhs:IF(CAPITAL<2000000, V/CAPITAL*100, V/流通盘*100), LINETHICK0;CAPITAL单位是手,2000000 手等于 2 亿股。源码的意图是:流通盘小于 2 亿股的标的,扩展财务字段容易缺失或者滞后,干脆直接用CAPITAL当分母;大于这个数的,才走修正后的流通盘。LINETHICK0表示不画线,只在左侧数值栏输出,避免额外一条线压住量柱。
这个分支的副作用是:同一只票在 2 亿股上下两侧,换手率数值会跳变一次。如果你要跨票横向比较,最好把两个分支统一,比如全部用流通盘,再给缺失情况加兜底。
2.3 标准量与当日累积三条线
标准量:IF(COUNT(V>流通盘/1000,0)>0, 流通盘/1000, 0), COLORff00ff, PRECIS0; 总量:SUM(V,0), LINETHICK0, PRECIS0, COLORcyan; 最大量:HHV(V,0), POINTDOT, COLORwhite, PRECIS0; 最大换手:HHV(dbhs,240), DOTLINE, COLORwhite, PRECIS2, LINETHICK0;COUNT(X,0)第二个参数写 0,表示从分时第一根累加到当前,不是"最近 0 根"。所以标准量的判断是:从现在往回看,今天是否出现过单根量超过流通盘千分之一的情况,出现过就给流通盘/1000作为参照线,没出现过给 0。这条线是自适应的,开盘头几分钟通常还是 0。
最大换手用HHV(dbhs,240),240 是 A 股一天的分时分钟数,等于把回看窗口固定成最近一个交易日,跨日也不会串。POINTDOT和DOTLINE是两种不同的点线样式,前者画点,后者画虚线,同一条副图里混用是为了区分量柱峰值和换手峰值。
PRECIS0控制显示 0 位小数,PRECIS2控制 2 位。数值栏里一堆小数点会挤在一起,这个控制项别省。
3. 分时量柱的分级染色:STICKLINE 条件栈与 TIME 时间过滤
染色层是整个公式信息量最密的部分。它把量柱拆成"基准三色 + 异动四色 + 星号"三层叠加,每层都带自己的时间窗口和换手门槛。
3.1 三色基准柱与 BGR 颜色顺序
STICKLINE(C<REF(C,1), 0, VOL, 5, 0), COLORgreen; STICKLINE(C>REF(C,1), 0, VOL, 5, 0), COLOR4040FF; STICKLINE(C=REF(C,1), 0, VOL, 5, 0), COLORwhite;STICKLINE(条件, 价1, 价2, 宽度, 空心标志),宽度 5 是相对值,空心标志 0 表示实心。三根语句的条件互斥,正常情况下每天只会命中其中一条。
COLOR4040FF这类六位十六进制颜色,通达信按 BGR 顺序解析:B=0x40、G=0x40、R=0xFF,落到屏幕上偏红。很多人以为是 RGB,写成COLORFF4040结果出来是蓝色,问题就出在这里。
注意:三根基准柱用了
REF(C,1),分时第一根 K 线取不到前值,三种条件可能同时不成立或同时成立,开盘第一根的量柱颜色不一定准。
3.2 四类异动的触发条件
| 序号 | 触发条件 | 关键阈值 | 颜色 | 过滤时间 |
|---|---|---|---|---|
| 1 | 量超前一峰值 且 下跌 | v>REF(最大量,1) | 深绿 | TIME>9:42 |
| 2 | 量超前一峰值 且 上涨 | v>REF(最大量,1) | 红 | TIME>9:42 |
| 3 | 量超前峰值 1.5 倍 且 上涨 且 高换手 | ×1.5 / 0.15% | 黄 | TIME>9:45 |
| 4 | 上涨 且 换手超 0.22% | 0.22% | 亮青 | TIME<9:42 |
对应代码:
{ 量超前一峰值:下跌/上涨/平的三种放大显示 } STICKLINE(C<REF(C,1) AND V>REF(最大量,1) AND TIME>94200, 0, VOL, 5, 0), COLOR3d, COLORgreen, LINETHICK2; STICKLINE(C>REF(C,1) AND V>REF(最大量,1) AND TIME>94200, 0, VOL, 5, 0), COLORred, COLOR3d, LINETHICK2; STICKLINE(C=REF(C,1) AND V>REF(最大量,1) AND TIME>94200, 0, VOL, 5, 0), COLORwhite, LINETHICK2; { 强异动:1.5 倍量 + 换手 0.15% 以上,开盘 15 分钟后才认 } STICKLINE(V>REF(最大量,1)*1.5 AND C>REF(C,1) AND dbhs>0.15 AND TIME>94500, 0, VOL, 5, 0), COLORyellow, COLOR3d, LINETHICK2; { 早盘脉冲:9:42 之前换手就到 0.22% } STICKLINE(C>REF(C,1) AND dbhs>0.22 AND TIME<94200, 0, VOL, 5, 0), COLOR66ffff, COLOR3d, LINETHICK2;REF(最大量,1)里的最大量是HHV(V,0),本身是当日累积最大值。前推一根之后,意思变成"上一分钟为止的当日峰值量"。用当前量跟它比,本质是在问"这根柱子是否创了今天的新高"。这么写比直接跟固定数值比要稳,因为不同票的分时量级差太多。
3.3 颜色属性互相覆盖的问题
第一条语句里同时出现了COLOR3d和COLORgreen,第二条同时出现COLORred和COLOR3d。通达信对同一条 STICKLINE 后的多个颜色关键字,最终取靠近末尾的那个生效,前面的会被吃掉。COLOR3d按 BGR 解析是 B=0x3D、G=0、R=0,接近纯黑,所以这两根放大柱实际显示的颜色是黑和绿,而不是源码作者可能想要的深绿和红。
修正办法是只保留一个颜色属性,需要更深的绿色就用COLOR006000这种六位写法,别用两位缩写。
STICKLINE(C<REF(C,1) AND V>REF(最大量,1) AND TIME>94200, 0, VOL, 5, 0), COLOR006000, LINETHICK2; STICKLINE(C>REF(C,1) AND V>REF(最大量,1) AND TIME>94200, 0, VOL, 5, 0), COLOR0000CC, LINETHICK2;3.4 TIME 函数的取值形式与前导零
TIME返回 HHMMSS 形式的数值,9:42:00 就是 94200,9:45:00 是 94500。源码在时长那一行写的是TIME>=093000,带前导零。通达信的数字字面量解析对前导零不友好,稳妥写法是去掉零:
时长:=TIME>=93000 AND TIME<=143000;这四个时间点的作用很清楚:9:42 之前只认高换手脉冲,9:42 之后开始认新峰量,9:45 之后才认 1.5 倍量加强信号。越靠后的条件越严,是因为开盘头十几分钟的量本来就大,不加时间门槛会满屏都是异动色。
3.5 lxtp 与星号标记的覆盖顺序
lxtp:=((V>REF(V,1) AND dbhs>=0.1 AND REF(V,1)>REF(最大量,2)) OR (V>REF(最大量,1) AND dbhs>=0.08 AND REF(V,2)>REF(最大量,3))) AND C>REF(C,1); lxtp1:=((V>REF(V,1)*0.9 AND dbhs>=0.1 AND REF(V,1)>REF(最大量,2)) OR (V>REF(最大量,1)*0.9 AND dbhs>=0.1 AND REF(V,2)>REF(最大量,3))) AND C>REF(C,1); DRAWTEXT(lxtp1, V*0.98, '★'), ALIGN1, VALIGN1, COLORdd22b8, LINETHICK3; DRAWTEXT(lxtp, V*0.98, '★'), ALIGN1, VALIGN1, COLORRED, LINETHICK3;两组条件的差别在两处:lxtp要求量能严格递增(V>REF(V,1)),第二种分支的换手门槛是 0.08%;lxtp1允许量能比前一根回落 10% 以内(V>REF(V,1)*0.9),但换手门槛统一提到 0.1%。所以lxtp更敏感、lxtp1更宽松但也更看重换手。
DRAWTEXT是后画覆盖先画。lxtp1先画紫色星号,lxtp后画红色星号,两者同时成立时看到的是红色。V*0.98是把标记放在量柱顶端略下方的位置,ALIGN1、VALIGN1控制对齐方式。
3.6 量数统计与那个带空格的变量名
n3:=BARSLAST(CROSS(lxtp,0)); 踪3:IF(lxtp>0, n3+1, 0), LINETHICK0; 量数:SUM(踪3,时长), LINETHICK0, PRECIS0; xxx:COUNT(量数,5);CROSS(lxtp,0)判断lxtp从 0 变 1 的那一根,BARSLAST返回距离上一次满足条件的周期数。SUM(X,N)的第二个参数是周期数,这里塞了个布尔表达式时长,真为 1、假为 0,所以只在 9:30 到 14:30 之间的分时柱上累加。
原始代码里写的是"踪 3",中间夹了空格。通达信的变量名不允许含空格,这个变量在编辑器里会被拆成两个 token,测试公式时报错。必须改成踪3或ZT3之类。
4. 均量比、昨日比与 OBVJ 叠加:DRAWTEXTREL 与 DRAWRECTREL 的坐标体系
画图层的函数和前面的指标函数是两套东西。指标函数算数值,绘图函数直接往窗口上按像素位置画,坐标单位是千分比,不是像素也不是数据值。
4.1 两个比例的算法
比例:=V/MA(V,10)*100; bl:=SUM(V,0)/"引用.v1#day"*100;比例是当前这一分钟的量相对最近 10 根均量的百分比,用来衡量瞬间放量程度。bl是今日累计量除以昨日全天量,衡量一天的进度。
"引用.v1#day"是跨周期引用的写法,格式是"指标名.变量名#周期"。它要求本机公式列表里存在一个名为"引用"的指标,里面有输出变量v1,并且日线数据已经下载完整。三个条件缺一个,这个引用就返回无效值。
注意:如果被引用的
v1定义为当日V,那盘中取回的是尚未走完的日线量,进度条会随行情跳动;如果要锁定昨日全天量,v1必须写成REF(V,1)。
4.2 千分比坐标与 2.52 这个系数
DRAWTEXTREL(2,130,'均量比:'), COLORYELLOW; DRAWTEXTREL(60,130, NUMTOSTRN(比例,2)+'%'), COLORYELLOW; DRAWRECTREL(125,150,375,225, RGB(30,30,30)), COLORYELLOW; DRAWRECTREL(125,150,125+比例*2.52,225, RGB(155,50,50)), COLORYELLOW;DRAWTEXTREL(X, Y, 文本)里 X、Y 是相对当前副图窗口宽高的千分比,取值 0 到 1000,原点在左上角。DRAWRECTREL(左, 上, 右, 下, 颜色)画的矩形同理。
槽底是从 125 到 375,宽度 250 个千分比。填充条右边界是125 + 比例*2.52。当比例等于 100 时,右边界算出来是 377,比槽底宽 2 个千分比,视觉上就是刚好填满。所以 2.52 这个系数本质是 250 ÷ 100 再留一点余量。想把量程改成 200% 才满格,系数直接改成 1.25。
RGB(R,G,B)函数的参数顺序是红、绿、蓝,和六位十六进制颜色的 BGR 顺序正好相反。同一段代码里两套颜色体系混用,是改颜色时最容易翻车的地方。
4.3 除零保护和无效值
如果"引用.v1#day"返回 0,bl会变成无效值,进度条要么消失要么画到窗口外。加一层保护:
昨量:="引用.v1#day"; bl:=IF(昨量>0, SUM(V,0)/昨量*100, 0);4.4 OBVJ 与 FILLRGN 的图层安排
OBVJ:=SUM(IF(C>REF(C,1), V, IF(C<REF(C,1), -V, 0)), 0); VAs:=OBVJ/2; H1:=HHVALL(HHV(C,0)); L1:=LLVALL(LLV(C,0)); P1:=H1-L1; F:=L1-P1*0.5; STICKLINE(OBVJ>=0, F, F+VAs, 4, 0), COLOR0599ff, LAYER6; STICKLINE(OBVJ<0, F, F-VAs, 4, 0), COLOR003900, LAYER6; FILLRGN(F, L1, F<L1, RGB(30,30,30)), LINETHICK2, LAYER7;OBVJ是能量潮的累加形式,涨加量、跌减量。VAs做 0.5 倍缩放,防止柱子太长冲出副图。F定位在当日最低价下方半个当日振幅的位置,等于把 OBV 塞进价格窗口下面的空白带。
LAYER6、LAYER7是图层序号,数值越大越靠上。FILLRGN(价1, 价2, 条件, 颜色)的参数顺序要注意,条件是第三个,不是第一个。FILLRGN放在第 7 层,会盖住第 6 层的 OBV 柱,所以只有当F低于L1时才填充,正常情况下两者不重叠。
| 绘图函数 | 坐标单位 | 参数顺序 | 易错点 |
|---|---|---|---|
| DRAWTEXTREL | 千分比 | X, Y, 文本 | Y 方向向下为正 |
| DRAWRECTREL | 千分比 | 左, 上, 右, 下, 色 | 右必须大于左 |
| FILLRGN | 数据值 | 价1, 价2, 条件, 色 | 条件在第三位 |
| STICKLINE | 数据值 | 条件, 价1, 价2, 宽, 空心 | 空心 0 实心 1 空心 |
5. 导入调试与信号复盘的实操技巧
5.1 三处硬伤的一次性替换
进公式管理器新建副图指标之前,先把这三行替换好,能省掉大半的报错排查时间:
{ 1. 语句式 IF 块改成 IF 函数 } mm:=IF(PFFIN(4251,0)>0, PFFIN(4251,0), 0); { 2. 去掉变量名里的空格 } 踪3:IF(lxtp>0, n3+1, 0), LINETHICK0; { 3. 去掉数字字面量的前导零 } 时长:=TIME>=93000 AND TIME<=143000;粘贴后点"测试公式",如果还报错,八成是颜色属性重复,把同一条语句里多余的颜色关键字删掉即可。测试通过再保存,起个能认出来的名字,画线方法选"副图"。
5.2 用 REF 偏移做一次前视验证
源码注释里写了"无未来"。要验证这句话,把lxtp的定义复制到一个临时指标里,把其中所有REF(X,N)的 N 各加 1,再对比两个版本的星号出现位置:
{ 验证版:所有偏移量 +1,若星号位置不变,说明信号不依赖未来数据 } lxtp_v:=((V>REF(V,2) AND dbhs>=0.1 AND REF(V,2)>REF(最大量,3)) OR (V>REF(最大量,2) AND dbhs>=0.08 AND REF(V,3)>REF(最大量,4))) AND C>REF(C,1);位置整体后移一根,说明信号建立在已完成的 K 线上,没有前视。如果位置完全不动,说明公式里有累积类函数在起作用,得逐个检查HHV(V,0)、SUM(...,0)这类当日内累积项。
5.3 把三个阈值抽成外置参数
0.15、0.22、0.08这三个换手门槛散在四根 STICKLINE 里,调一次要改四五个地方。把它们提成参数,在公式管理器的参数列表里填上:
| 参数名 | 默认值 | 最小 | 最大 | 调大的后果 | 调小的后果 |
|---|---|---|---|---|---|
| 强异动换手 | 0.15 | 0.05 | 0.50 | 黄柱变少,只留极端放量 | 黄柱变多,噪声上升 |
| 早盘换手 | 0.22 | 0.10 | 0.60 | 早盘亮青柱稀少 | 开盘十分钟满屏亮青 |
| 宽口径换手 | 0.08 | 0.03 | 0.30 | 红色星号变少 | 星号密集,参考价值下降 |
调用时直接把参数名写进条件:
{ 参数化后的强异动条件,改阈值不用再进代码 } STICKLINE(V>REF(最大量,1)*1.5 AND C>REF(C,1) AND dbhs>强异动换手 AND TIME>94500, 0, VOL, 5, 0), COLORyellow, LINETHICK2;调参的时候建议固定一只票、固定一天,在分时回放里把三个参数各扫一遍,看星号落点和当日实际分时量峰是否对得上。同一组参数换到流通盘差十倍的另一只票上,通常要重调,因为dbhs的分母口径和正常换手中枢完全不同。
本文还有配套的精品资源,点击获取