简介:这份通达信主图叠加指标源码文档面向股票技术分析爱好者与公式编写初学者,解决在K线主图上集中查看个股所属行业、地区、概念与主营业务等基本面标签的需求。压缩包内仅1个doc文件,约197KB,内容以指标公式源码、知识点总结与代码片段为主,便于边看边复制到通达信公式管理器调试。文档围绕DRAWTEXT_FIX、EXTERNSTR、STICKLINE等常用函数展开,示范如何用固定位置文字输出行业、地区、概念和主营信息,并通过EXTERNSTR读取外部字符串补充概念与主营业务;同时给出多组STICKLINE柱线控制上涨下跌K线颜色与宽度的写法。已有1877人浏览学习,适合希望快速搭建主图信息面板、理解通达信公式结构并复用代码的读者参考。
1. 主图叠加公式里,行业和地区刷得出来,概念和主营为什么是空白
把这份 .doc 里的源码整段复制进公式管理器,编译通过,主图左上角立刻出现「所属行业:银行」「所属地区:深圳」,但紧接着的「所属概念」和「主营业务」后面干干净净,什么都没有。同一份代码换台电脑又能显示,这种「半截生效」最容易让人怀疑语法写错了,其实问题不在语法,在于两条取数路径完全不同。HYBLOCK、DYBLOCK 读的是客户端本地自带的板块归属数据,装完软件下载一次板块文件就有;而 EXTERNSTR(0,3)、EXTERNSTR(0,2) 读的是外部字符串数据,必须你自己先准备一张能被客户端认出来的数据表并导入,公式才有东西可读。下面按「文字怎么定位、板块数据从哪来、K 线怎么重绘、报错怎么查」把这份源码拆开,顺手把原作者注释里标反的几处颜色编码纠回来。
2. DRAWTEXT_FIX 的参数与颜色编码:把四行标签钉在主图左上角
2.1 函数签名与五个参数的实际含义
这份源码的骨架全部由 DRAWTEXT_FIX 撑起来,八条语句两两一组,一条画标签、一条画取值。先把签名拆干净:
DRAWTEXT_FIX(COND, X, Y, TYPE, TEXT),COLORxxxxxx;| 参数 | 类型 | 取值范围 | 说明 |
|---|---|---|---|
| COND | 逻辑值 | 0 / 1 | 为真时绘制。写常量 1 表示常驻显示 |
| X | 数值 | 0 ~ 1 | 横向位置,相对当前窗口宽度的比例 |
| Y | 数值 | 0 ~ 1 | 纵向位置,相对主图窗高的比例,0 在顶部 |
| TYPE | 整数 | 0 / 1 | 0 时 X 是文字左边界,1 时 X 是文字右边界 |
| TEXT | 字符串 | 常量或函数 | 要显示的文本,可以是板块函数返回值 |
它和 DRAWTEXT 最大的差别是坐标系。DRAWTEXT 的锚点挂在某根 K 线上,图一缩放、一平移,文字就跟着跑;DRAWTEXT_FIX 用的是窗口坐标,跟 K 线无关,所以才能做「常驻的板块标签」。源码里 COND 全写成 1,就是让文字一直挂着,这处写法没问题。
需要留意的是后半截的,COLORxxxxxx。颜色修饰符必须紧跟在同一条语句的右括号后面、分号前面,位置写错就整句失效。更稳妥的写法是每个 DRAWTEXT_FIX 单独占一行,避免一行里塞太多语句导致看错边界。
2.2 百分比坐标:为什么 Y 要按 0.04 递增
源码的四行标签分别是 Y=0.00、0.04、0.08、0.12,X 用两段式:标签固定在 0.00,取值固定在 0.14 或 0.20。这样排版的好处是标签列对齐、数值列对齐,视觉上不散。
{最小可跑骨架:先不要取数,用常量验证定位} DRAWTEXT_FIX(1,0.00,0.00,0,'所属行业:'),COLORFF60FF; DRAWTEXT_FIX(1,0.14,0.00,0,'测试值'),COLORFF60FF; DRAWTEXT_FIX(1,0.00,0.04,0,'所属地区:'),COLOR6F59FF; DRAWTEXT_FIX(1,0.14,0.04,0,'测试值'),COLOR6F59FF;逻辑上,Y 的每个 0.04 代表窗高的 4%,四行排下来正好占顶部 16% 的空间。这里藏着第一个坑:0.04 是相对值,不是像素。1080p 全屏时主图区大约 800 像素高,0.04 折合 32 像素,默认字号 12 到 14 像素,四行间距充足;一旦把窗口压扁到 400 像素高,0.04 只剩 16 像素,几行字立刻叠成一团墨。这就是「我这儿好好的,同事那儿糊成一片」的根源。
X 方向的 0.14 同理。宽窗口下 14% 是很长一段留白,窄窗口下数值列可能直接压在 K 线实体上。更麻烦的是概念和主营业务这类长文本,通达信不会自动换行,字符越过窗口右边界就被裁掉,看不到任何提示。遇到长主营描述,常见做法是把标签行和数值行拆成上下两行,而不是硬挤在同一行的两个 X 上。
TYPE 参数用来处理对齐。取 0 时 (X,Y) 是文字的左上角锚点,向右伸展;取 1 时 (X,Y) 是右上角锚点,文字向左伸展。想让四行取值右对齐成一条竖线,可以把数值那几条改成 TYPE=1,并把 X 统一挪到 0.35 附近。
2.3 COLORxxxxxx 是 BGR 顺序,不是 RGB
源码里所有颜色的注释基本都标错了方向,原因只有一个:通达信的颜色值是0xBBGGRR,高两位是蓝、中间两位是绿、低两位才是红,和网页上习惯的 RGB 正好倒过来。验证方法很简单,内置常量 COLORRED 展开就是 COLOR0000FF,低两位 FF 落在红通道上,结论成立。
按这个规则还原源码里的几个颜色:
| 公式中写的 | 解出的 RGB | 实际观感 | 源码注释 |
|---|---|---|---|
| COLORFF60FF | 255, 96, 255 | 品红 / 紫红 | 所属行业(对上了) |
| COLOR6F59FF | 255, 89, 111 | 桃红 | 注释写「紫」,实际偏红 |
| COLORFF972F | 47, 151, 255 | 天蓝 | 注释写「橙」,实际是蓝 |
| COLOR34A6FA | 250, 166, 52 | 橙黄 | 注释写「蓝」,实际是橙 |
| COLOR00FFFF | 255, 255, 0 | 亮黄 | 注释写「青」,实际是黄 |
也就是说,源码里「主营业务」那一行显示出来其实是橙黄色,「主题概念」是亮黄色。要真正拿到注释里标称的颜色,把 RGB 三元组倒过来写就行:
{目标色:橙 RGB(255,151,47) -> COLOR2F97FF;天蓝 RGB(52,166,250) -> COLORFAA634} DRAWTEXT_FIX(1,0.00,0.08,0,'主营业务:'),COLOR2F97FF; DRAWTEXT_FIX(1,0.14,0.08,0,EXTERNSTR(0,2)),COLOR2F97FF; DRAWTEXT_FIX(1,0.00,0.12,0,'主题概念:'),COLORFAA634; DRAWTEXT_FIX(1,0.20,0.12,0,EXTERNSTR(0,4)),COLORFAA634;调色时建议先在纸上把 RGB 写出来,再按「蓝绿红」三段倒排成六位十六进制,比反复编译试色快得多。深色主图上,亮度低于 0x66 的颜色几乎看不清,选色时把三个通道里最大的那个值往 0xAA 以上靠。
3. HYBLOCK、DYBLOCK 与 EXTERNSTR:板块数据的两种取数路径
3.1 内置板块函数能取到什么、取不到什么
HYBLOCK 返回当前品种所属行业板块的名称,DYBLOCK 返回所属地域。这两个是无参函数,直接写在 DRAWTEXT_FIX 的 TEXT 位置就能用,数据来自客户端本地的板块归属文件,所以断网也能显示——只要能保证板块数据是新的。
它们的边界很清楚:
一是唯一性。通达信按一级行业给每只股票归档,一只票只对应一个行业、一个地域,所以单值函数够用。但概念完全不是这个概念——一只票可能同时挂着十几个概念,用返回单个字符串的函数根本没法表达,这才是源码作者绕道 EXTERNSTR 的真正原因。
二是空值。上市首日的次新股、指数、ETF、部分退市整理品种,板块归属字段是空的,函数返回空串,主图上表现为标签后面直接跟下一行。这不是公式坏了,是数据本身没有。如果一定想在这种情况显示占位符,可以用字符串判空逻辑包一层,不过相关函数在不同版本里支持程度不一,先在公式编辑器里编译试一次再决定用哪种写法。
三是刷新时机。板块归属会随行业调整、地域调整而变,客户端里下载一次完整的板块数据之后,跨版本升级或者长期不开机,字段可能对不上,表现出来就是「某只票以前有行业,现在空了」。
3.2 EXTERNSTR(N,M) 的两个参数怎么理解
EXTERNSTR 是这份源码里唯一读外部数据的地方,语法是:
EXTERNSTR(N, M);第一个参数 N 一般写 0,表示取当前品种所在的扩展数据组;第二个参数 M 是字段序号,对应你在客户端自定义数据里定义的列顺序。它的匹配键是品种代码,也就是按股票代码去外部数据表里查这一行,然后把第 M 列取出来。
这里有两个硬性前提。第一,外部数据的类型必须是字符串,如果导入时选了数值型,EXTERNSTR 取不到任何东西,返回空串,主图上就是一片空白。第二,M 必须和你的数据表列顺序严格对齐。源码作者用了 M=2 读主营、M=3 读概念、M=4 读主题概念,这套编号只对「他自己那张表」成立。换一张别人整理的表,列顺序一变,M=2 可能取出来的是概念,主营被挤到 M=3 去。这是这份源码移植后最常翻车的地方,比语法错误隐蔽得多。
3.3 给概念和主营准备一份能被引用的外部数据
常见做法是走客户端自带的数据导入入口,把一份文本表加载成字符串型自定义数据。表的结构按「代码 + 若干字符串列」组织,字段之间用空格或制表符分隔:
{external.txt:第一列代码,后面依次为概念、主营、主题概念} 600519 白酒 茅台酒及系列酒的生产与销售 消费升级 000858 白酒 白酒的生产与销售 高端消费 300750 锂电池 动力电池系统研发制造 新能源车 002594 新能源车 汽车及电池业务 整车出口导入之后有一步必须做的校验:把 1 到 4 号字段全部打印出来,看哪一列落在哪个位置,再回填到正式公式里。校验代码临时贴进主图叠加指标就行,看完删掉。
{字段探针:一次性把 1~4 号外部字段打在右侧空白区} DRAWTEXT_FIX(1,0.62,0.00,0,EXTERNSTR(0,1)),COLORWHITE; DRAWTEXT_FIX(1,0.62,0.04,0,EXTERNSTR(0,2)),COLORWHITE; DRAWTEXT_FIX(1,0.62,0.08,0,EXTERNSTR(0,3)),COLORWHITE; DRAWTEXT_FIX(1,0.62,0.12,0,EXTERNSTR(0,4)),COLORWHITE;参数说明上,X=0.62 是故意把探针放到右侧,避免和左上角正排标签撞位;四条都用 COLORWHITE,先排除颜色干扰,只看文本内容。跑完之后对照:哪一号位置出现「茅台酒及系列酒的生产与销售」,主营就该用哪个 M;哪一号出现「白酒」,概念就用哪个 M。整个替换过程只动数字,不动结构。
外部数据还有个维护节奏的问题。概念和主营业务不是每天变的,但新股上市、资产重组、更名会带来增删,比较省事的做法是保持一个自己的主表,按月更新一次再整体导入,而不是每天增量补。导入前把重复代码去重,重复行会让取值结果不确定。
4. STICKLINE 重绘 K 线:多层描边做出渐变实体
4.1 STICKLINE 的六个参数
源码后半段用二十来条 STICKLINE 重新画了一遍 K 线,这是主图叠加类指标里很典型的做法——不用系统自带的红绿柱,自己控制宽度和颜色。签名如下:
STICKLINE(COND, PRICE1, PRICE2, WIDTH, EMPTY);| 参数 | 含义 | 源码中的用法 |
|---|---|---|
| COND | 绘制条件 | C>=O画阳线,C<=O画阴线 |
| PRICE1 | 一端价格 | 阳线用 C 到 O,影线用 H 到 L |
| PRICE2 | 另一端价格 | 同上 |
| WIDTH | 柱体宽度 | 3.4 / 3.0 / 2.4 … 0.6,逐级递减 |
| EMPTY | 填充方式 | 0 实心,1 空心 |
WIDTH 取 0 时画的是细线,不产生柱体宽度,源码里画上下影线的那两条就用了 0。这个参数支持小数,不同版本的像素换算不完全一样,所以 3.4 在有的人机器上看起来偏粗,在有的人机器上刚刚好,按自己的分辨率微调即可。
4.2 宽度递减加亮度递增,形成边缘深、中心亮的描边
阳线部分的写法值得细看:宽度从 3.4 一路收到 0.6,颜色从 COLOR0000AA 走到 COLOR0000FF。按第 2 章说的 BGR 规则解一下,COLOR0000AA 是红通道 0xAA=170 的暗蓝,COLOR0000FF 是红通道 255 的亮蓝,也就是说这七层不是七种颜色,而是同一色相由暗到亮的七级台阶。
{阳线实体:先画宽的暗色打底,再逐层用更窄更亮的条覆盖} STICKLINE(C>=O,C,O,3.4,0),COLOR0000AA; STICKLINE(C>=O,C,O,3.0,0),COLOR0000BB; STICKLINE(C>=O,C,O,2.4,0),COLOR0000CC; STICKLINE(C>=O,C,O,2.0,0),COLOR0000DD; STICKLINE(C>=O,C,O,1.6,0),COLOR0000EE; STICKLINE(C>=O,C,O,1.2,0),COLOR0000FF; STICKLINE(C>=O,C,O,0.6,0),COLOR0000FF; STICKLINE(C>=O,H,L,0,0),COLORRED;逻辑说明:通达信按语句先后顺序绘制,后写的盖在先写的上面。最宽最暗的 3.4 在底层,被后面一层层更窄更亮的柱体压住,最后只在左右两侧露出一圈暗边,中间留给最亮的 0.6,视觉上就是一根带立体描边的实体。影线放在最后单独画,宽度 0,不参与这套叠加。
参数怎么改:宽度之间的差值保持在 0.4 左右最舒服,差太大会变成一圈圈同心环,看着脏;差太小则各层几乎重合,看不出渐变。颜色步长控制在 0x11 上下,跨度再大就会给人「两种颜色拼起来」的感觉。阴线那组同理,COLORAAAA00 到 COLORFFFF00 是青通道和绿通道同步递增,最终落到 COLORFFFF00,按 BGR 解出来是 R=0、G=255、B=255 的青色,并不是很多人以为的黄色——想要黄色应该写 COLOR00FFFF。
| 现象 | 原因 | 处理 |
|---|---|---|
| K 线两侧露出一条系统色细边 | 自绘宽度小于系统 K 线宽度 | 隐藏系统 K 线,或加大整组宽度 |
| 实体看不出渐变 | 宽度差或颜色步长太小 | 宽度差保持 0.4,颜色步长 0x11 |
| 阴线显示成青色而非黄色 | BGR 编码下 COLORFFFF00 是青 | 改写成 COLOR00FFFF |
4.3 主图叠加的图层顺序与系统 K 线冲突
把公式属性设成「主图叠加」之后,通达信并不会自动把系统 K 线撤掉,它是画在你自绘 K 线的底层。只要自绘宽度比系统 K 线略窄,两侧就会各露出一条原始颜色的边,看起来像描边错位。常见做法是进入主图设置把系统 K 线隐藏,让自绘的 STICKLINE 独自承担显示;想省事也可以在公式里用 DRAWKLINE 自己画一套,宽度完全可控。
还有一处层级关系需要注意:DRAWTEXT_FIX 用的是窗口坐标,属于独立图层,一般不会被 K 线实体盖住;但如果把 FIX 换成了 DRAWTEXT,文字锚在 K 线上,宽幅自绘实体会直接压上去。这份源码全程用 FIX,在这点上是对的,不要为了「跟着 K 线走」去改函数。
5. 参数微调与报错对照:把这份主图指标改到能用
5.1 行距、锚点和分辨率漂移
Y 值 0.04 的问题是随窗口高度缩水,改成 0.055 之后,即使在 500 像素高的窗口里也能保证四行不叠字。X 方向建议把标签列和取值列的间距拉到 0.10 以上,长主营文本宁可换行也不要横向溢出。改完的版本如下:
{调优版:行距 0.055,颜色按 BGR 校正,标签与取值间隔 0.10} DRAWTEXT_FIX(1,0.00,0.000,0,'行业:'),COLOR2F97FF; DRAWTEXT_FIX(1,0.10,0.000,0,HYBLOCK),COLOR2F97FF; DRAWTEXT_FIX(1,0.00,0.055,0,'地区:'),COLORFAA634; DRAWTEXT_FIX(1,0.10,0.055,0,DYBLOCK),COLORFAA634; DRAWTEXT_FIX(1,0.00,0.110,0,'概念:'),COLOR00FFFF; DRAWTEXT_FIX(1,0.10,0.110,0,EXTERNSTR(0,3)),COLOR00FFFF; DRAWTEXT_FIX(1,0.00,0.165,0,'主营:'),COLORFF60FF; DRAWTEXT_FIX(1,0.10,0.165,0,EXTERNSTR(0,2)),COLORFF60FF;顺手提一个判空的变通写法:某些版本支持直接对字符串做相等比较,把 HYBLOCK 和空串比对之后用 IF 输出「--」,不支持的话编译会报错,删掉这一段即可,别在判空上耗太多时间。
5.2 高频报错与定位顺序
| 报错或现象 | 定位方向 | 处理 |
|---|---|---|
| 未知的标识符,指向概念类函数 | 客户端版本不支持该内置函数 | 回落成 EXTERNSTR 读外部数据 |
| EXTERNSTR 全部返回空 | 数据没导入 / 类型不是字符串 / 代码不匹配 | 用探针代码把 1~4 号字段全打一遍 |
| 编译通过但主图没有文字 | 公式属性没设成主图叠加 | 在公式管理器里改属性后重新加载 |
| 文字只在部分股票出现 | 该品种本身没有板块归属 | 次新股、指数、ETF 属正常 |
| 颜色和注释对不上 | BGR 与 RGB 顺序写反 | 按蓝绿红三段倒排重写六位值 |
| 概念一栏取出的是主营 | 外部数据列顺序与公式 M 不对应 | 调整导入表的列顺序或改 M |
排查顺序建议从外到内:先看公式属性是不是主图叠加,再看 EXTERNSTR 有没有数据,最后才怀疑颜色和坐标。这三步能覆盖九成以上的「不显示」问题。另外,整段公式调好之后,记得在公式管理器里保存成主图叠加类型,并把当前画面存成版面文件,切换股票时就不用每次重新设置图层和系统 K 线的显示状态。不同行业想用不同颜色区分时,可以用条件判断包一层 IF 给 COLOR 分支,具体字符串比较函数的支持情况各版本不一,先在编辑器里编译验证一次再铺开写。
本文还有配套的精品资源,点击获取