简介:这是一份面向A股短线交易者、通达信软件用户的副图指标公式源码文档,侧重游资风格的波段与趋势捕捉。文档围绕价格数据的数学处理展开,涵盖多周期简单与指数移动平均线、中间价与标准差通道、趋势强弱比值、金叉死叉过滤以及成交量配合等模块,并用DRAWTEXT标注买入、卖出与抄底提示,辅以STICKLINE柱体区分升降趋势。资源包内含1个doc文件,约161KB,可直接复制公式到通达信公式管理器中新建副图指标,对照源码逐段理解各变量的计算逻辑与信号触发条件。目前已有335人学习下载,适合希望研究游资操盘思路、完善自选指标体系的投资者参考。需要留意的是,任何技术指标都应结合市场环境与个人交易策略综合使用,不宜单独依赖信号决策。
1. 一份打着「游资专用」的副图 .doc,真正值钱的是可复现的公式结构
群里转来的文件名通常长这样:通达信指标公式源码游资专用 副图源码.doc。双击打开,里面是彩色加粗的中文公式,还带章节编号和「内部资料」字样,看着像回事;把内容复制进通达信公式管理器,点测试,第一行就弹出语法错误。这个落差不是你的操作问题,而是载体问题——Word 文档不是通达信的公式格式,它只是一份带排版的文本。
剥开「游资专用」这层包装,文件里装的是一段技术指标公式:读的是行情软件本地已有的开高低收、成交量、成交额和分时数据,算出几条曲线画在 K 线下方。所谓游资痕迹,本质是用量比、主动买占比、均价偏离这些可观测量去近似推断,没有哪条公式能直接看到席位。它能不能用,取决于参数怎么设、信号会不会漂、以及你是否知道它什么时候失效。
后面按一条完整链路走:从 .doc 里把公式抠出来并洗干净,落到公式管理器里编译成副图指标,再讲资金强度、量能饱和度这类核心算法怎么写,然后是参数表、报错定位、未来函数排查,最后是 tn6 互转与批量校验。手上有源码文件却导不进去的人,可以照着一步步做。
2. .doc 里的通达信副图源码怎么落到公式管理器:提取、清洗、编译
2.1 先分清 doc、txt、tn6 三种载体能不能直接导入
拿到文件先看扩展名,这一步决定了后面要走多少弯路。通达信公式管理器认的导入格式是它自己的打包文件,Word 文档不在其中,任何「把 doc 拖进公式管理器」的尝试都会失败。常见载体的差异如下。
| 载体 | 扩展名 | 内容形态 | 能否直接导入 | 典型来源 |
|---|---|---|---|---|
| Word 文档 | .doc / .docx | 排版文本,含全角标点、批注、图片 | 不能 | 论坛附件、群文件转发 |
| 纯文本 | .txt | 一行行公式,半角符号 | 可以,导入公式时选文本文件 | 手工整理、从公式管理器导出 |
| 公式包 | .tn6 | 通达信自有打包格式,含公式名、参数、多条公式 | 可以,导入公式时选 tn6 | 公式管理器导出 |
| 早期公式包 | .tne | 老版本导出格式 | 部分版本可以 | 老资源 |
| 其它软件公式 | 各自格式 | 语法体系不同 | 不能 | 跨平台搬运 |
.doc 是二进制复合文档,Word 保存时会顺手把中文输入法打出的全角冒号、全角分号原样写进去,还会插入软回车(垂直制表符)和不间断空格。这三类字符在通达信编译器眼里都是非法字符,所以流程上必然要过一遍「抽取 + 清洗」,direct 粘贴是没有出路的。
提示:如果文档里的公式是截图贴进去的,先做 OCR 再清洗;OCR 对
:=、;、()的识别率很低,必须人工核对赋值符号。
2.2 用 python 把 .doc/.docx 里的公式正文抽成纯文本
python-docx 只认 .docx,遇到老 .doc 要先转换。LibreOffice 命令行转换不需要打开界面,适合批量处理,转换完目录里就有了可读的 docx。
# 老版 .doc 先转成 docx,headless 模式批量跑 libreoffice --headless --convert-to docx --outdir ./docx ./游资专用副图源码.doc # 目录里若有多个文档,用通配符一次转完 ls ./docx转换完成后抽取正文。这里有个容易漏的点:很多分享文档把公式塞在表格里做「分栏」,只读doc.paragraphs会得到空字符串。
from docx import Document import pathlib SRC = pathlib.Path("./docx") DST = pathlib.Path("./txt") DST.mkdir(exist_ok=True) for f in SRC.glob("*.docx"): doc = Document(str(f)) lines = [p.text for p in doc.paragraphs] # 普通段落 for t in doc.tables: # 表格里的公式段落 for row in t.rows: for cell in row.cells: lines.extend(cell.text.splitlines()) text = "\n".join(lines) (DST / (f.stem + ".txt")).write_text(text, encoding="utf-8") print(f.name, len(text))逻辑说明:doc.paragraphs按文档顺序返回段落对象,p.text取纯文本不带样式;doc.tables单独遍历,因为表格单元格里的文字不属于顶层段落。输出统一用 UTF-8,避免后续读写出现乱码。参数上没有可调项,唯一要改的是SRC和DST两个路径。如果打印出来的字符数只有几十,说明公式是以图片形式存在的,得回到 OCR 流程。
2.3 全角符号与 Word 隐形字符的清洗规则
抽取出来的文本不能直接粘贴,得先做字符级替换。下面这张表是踩过坑之后总结的高频字符,左边是 Word 里的原样,右边是通达信能接受的形式。
| 现象 | 原始字符 | 替换为 | 不替换的后果 |
|---|---|---|---|
| 中文冒号 | : | : | 变量:=...被当成整行,报未知变量 |
| 中文分号 | ; | ; | 语句不结束,最后一行合并报错 |
| 中文逗号 | , | , | 函数参数解析失败 |
| 全角括号 | () | () | 函数名无法识别 |
| 中文引号 | “ ” | " | DRAWTEXT 的文字参数报错 |
| 软回车 | \x0b | \n | 多行挤成一行 |
| 不间断空格 | \xa0 | 普通空格 | 变量名中混入不可见字符 |
import re, pathlib FULL2HALF = str.maketrans({ ":": ":", ";": ";", ",": ",", "(": "(", ")": ")", "“": '"', "”": '"', "‘": "'", "’": "'", "<": "<", ">": ">", "=": "=", "+": "+", "-": "-", "*": "*", }) def clean(src: str) -> str: s = src.replace("\u00a0", " ").replace("\x0b", "\n") # 隐形字符 s = s.translate(FULL2HALF) # 全角转半角 s = re.sub(r"[ \t]+$", "", s, flags=re.M) # 去掉行尾空格 s = re.sub(r"\n{3,}", "\n\n", s) # 压缩空行 s = re.sub(r"^(第\s*\d+\s*[章节].*)$", r"{\1}", s, flags=re.M) # 中文小标题转注释 return s for f in pathlib.Path("./txt").glob("*.txt"): out = pathlib.Path("./clean") / f.name out.parent.mkdir(exist_ok=True) out.write_text(clean(f.read_text(encoding="utf-8")), encoding="utf-8")逐条说明:translate用映射表一次替换全部全角符号,比链式replace快且不会互相干扰;re.M让^和$按行匹配,行尾空格和中文小标题都是逐行处理;最后一条把「第三章 资金强度」这类标题包进{},通达信把花括号内容当注释,不会参与编译。改造过的源码如果要发出去,先确认里面没有个人备注。
2.4 在公式管理器 6.06 里新建副图指标并完成第一次编译
清洗完就可以落地了。通达信打开公式管理器是 Ctrl+F,也可以走「功能 → 公式系统 → 公式管理器」。展开左侧的「技术指标」,选中一个自定义分组,点「新建」。公式名称用英文或拼音,别用空格和中文标点,避免调用时输入困难。
关键一步是「画线方法」下拉框,必须选「副图」,选成主图会导致坐标体系和 K 线冲突,曲线画不出来。切到「参数」标签页填参数名和区间,参数名要和源码里用的一致,比如 N、M、P。粘贴清洗后的源码,点「测试公式」。
编译器会返回第一个错误所在的行号,改完再测,重复到提示「测试通过」为止。点「确定」保存,回到 K 线图,输入公式名的首字母就能调出。常见做法是先拿几只走势差异大的票对照看,确认曲线没有压在 0 轴不动、也没有跑到坐标框外面,再考虑挂预警。
3. 游资专用副图源码的核心结构:资金强度、量能饱和度、情绪线怎么算
3.1 副图能拿到的数据边界:为什么「游资痕迹」只能做近似
通达信普通版本地数据里能直接用的,是每根 K 线的开高低收、成交量、成交额,以及分时序列。逐笔委托队列、大单标记、席位信息属于更高等级的数据服务,普通公式取不到。所以市面上的资金类副图,走的都是代理变量路线:用收盘价在当日振幅中的位置拆分主动性成交,用成交量与均量的比值衡量放量程度,用成交额除以成交量还原当日均价,再和收盘价比较。
理解这一点很重要,它决定了你该怎么用这些指标。代理变量的噪声不小,一根大阳线里的主动买占比可能被振幅放大得离谱,所以看趋势变化比看绝对值更有意义。谁要是把某条资金线当成真实资金流,很容易在震荡市里被反复打脸。
| 可观测量 | 常见代理含义 | 稳定性 |
|---|---|---|
| 收盘价在振幅中的位置 | 主动性成交占比的近似 | 中,日线尾盘拉升会失真 |
| 成交量 / 均量 | 放量倍数、量能饱和度 | 较高,跨周期都能用 |
| 成交额 / 成交量 | 当日均价,用于偏离度计算 | 高 |
| 分时均价与现价之差 | 日内强弱 | 中,受开盘跳空影响 |
3.2 量能饱和度归一化与 1.00 圆圈的三种画法
量能饱和度的思路是把放量程度压到 0 到 1 之间,1.00 表示「放量到顶」。做法是先算量比,再除以一个放大倍数,最后用 MIN 截断,避免极端行情把坐标撑变形。参数 M 就是放大倍数,M 越小越容易触顶,M 越大越难触顶,通常取 3 左右。
到顶那一下怎么画,有三种写法,兼容性和效果各不相同。柱状填充最直观,用 STICKLINE 从 0 画到饱和值;图标法用 DRAWICON,但图标编号在不同版本里对应关系不一致,移植性差;文字法用 DRAWTEXT 直接在 1.00 位置写字符串,跨版本最省心,缺点是只能看到点,看不到柱子。
{量能饱和度 副图 —— 三种到顶标记写法} N:=20; M:=3; 量均:=MA(VOL,N); 量比:=VOL/IF(量均=0,1,量均); 饱和:MIN(1,量比/M),COLORYELLOW,LINETHICK2; {主曲线,0~1} {写法一:柱状填充,最直观} STICKLINE(饱和>0,0,饱和,2,0),COLORYELLOW; {写法二:图标,编号依版本而定} DRAWICON(饱和>=0.999,1.00,1); {写法三:文字标 1.00,移植性最好} DRAWTEXT(饱和>=0.999,1.00,'1.00'),COLORRED; 顶线:1.00,COLORGRAY,DOTLINE; {1.00 参考线}参数说明:MA(VOL,N)是 N 周期成交量均值,N 取 20 时代表一个月的平均量能;IF(量均=0,1,量均)是除零保护,停牌或数据缺失时量均可能为 0,不保护会直接中断计算;MIN(1,量比/M)把结果压进 0 到 1;STICKLINE(条件,起点,终点,宽度,空心标志)中空心标志 0 表示实心柱。三种写法建议只留一种,同时保留会在画面上重叠。
3.3 主力资金强度:主动额拆分与均价线偏离
资金强度要解决的是「这根 K 线的成交额里,有多少是往上买的」。普通行情数据没有逐笔方向,业内常用的近似是把当日振幅当成分布区间,收盘价越靠近最高价,认为主动性买入比例越高。
{主力资金强度 副图 —— 主动性成交额近似} P:=20; 均价:=AMOUNT/IF(VOL=0,1,VOL)/100; {成交额/成交量,还原当日均价} 强弱:=IF(HIGH=LOW,0.5,(CLOSE-LOW)/(HIGH-LOW)); {0~1,越靠上越强} 主动额:=AMOUNT*强弱; {近似主动买入额} 净额:=主动额-(AMOUNT-主动额); {净额 = 主动 - 被动} 资金:净额/IF(MA(AMOUNT,P)=0,1,MA(AMOUNT,P)),COLORRED; 零轴:0,COLORGRAY,DOTLINE;逻辑说明:AMOUNT单位是元,VOL单位是手,除以 100 之后才是每股均价;HIGH=LOW表示一字板或数据异常,此时比例无意义,直接给 0.5 中性值,这是必须补的分支,否则分母为零会让整条公式失效。最后一步除以 P 周期成交额均值做归一化,目的是把不同市值、不同价位的股票拉到可比较的量级上,否则大盘股的资金线会比小盘股高出一个数量级,同一张副图没法通用。
需要留意的是,一字涨停时HIGH=LOW,强弱值恒定,资金线会走平,这不代表没有资金活动,只是数据本身无法区分。看到线走平先查当天是不是涨跌停,不要急着改参数。
3.4 三条线合成一张副图:坐标统一与阈值标线
量能饱和度在 0 到 1 之间,资金强度归一化后大约在 -3 到 3 之间,两条量纲不同的曲线画在一起,资金线会把量能线压成一条平线。常见做法是先各自压缩,再按权重合成一条情绪线,把原始曲线用淡色保留作参考。
| 曲线 | 原始范围 | 压缩方式 | 建议权重 |
|---|---|---|---|
| 量能饱和度 | 0 ~ 1 | 本身已在 0~1 | 0.6 |
| 资金强度 | 约 -3 ~ 3 | 除以 3 后截断 | 0.4 |
| 情绪线 | 0 ~ 1 | 两条加权求和 | 输出用 |
权重不是拍脑袋定的。量能数据来自真实成交量,噪声小,权重给高一点;资金强度是估算值,权重压低,避免它一个人带偏整条线。合成前先把资金强度截断到 -1 到 1,再线性映射到 0 到 1,这一步不做,情绪线会出现负值,和饱和度无法同轴比较。两条原始曲线用 COLORGRAY 之类的淡色画,情绪线加粗,视觉上主次分明。
4. 副图源码调参与排错:参数表、编译错误、未来函数
4.1 参数标签页怎么填:周期、阈值、平滑的取值区间
参数填在公式管理器的「参数」标签页,格式是「参数名(最小值,最大值,默认值)」。填完点「测试公式」,参数名要和源码里出现的完全一致,多一个空格都会报未知变量。
| 参数 | 含义 | 建议区间 | 默认 | 调大的效果 | 调小的效果 |
|---|---|---|---|---|---|
| N | 量能均线周期 | 5 ~ 60 | 20 | 曲线更平滑,突发放量被稀释 | 更灵敏,日内噪声多 |
| M | 饱和放大倍数 | 1 ~ 10 | 3 | 更难触顶,信号变少 | 频繁触顶,失去区分度 |
| P | 资金均额周期 | 5 ~ 60 | 20 | 偏向中期资金结构 | 偏向日内,跳动剧烈 |
| W | 资金权重 | 0 ~ 1 | 0.4 | 资金主导,震荡市易误报 | 量能主导,忽略资金转弱 |
调参不要一次改多个。固定 P 和 W,只动 N,从 10、20、30 各跑一遍同一只票,把触顶次数记下来,比凭感觉改靠谱得多。参数区间也别开太宽,最大值给到 200 会让不懂的人随便填,反而更容易出问题。
4.2 编译报错逐条定位:未定义变量、除零、函数不适用
公式管理器的报错信息比较简短,多数时候只给行号和一句提示。下面这张对照表覆盖了绝大部分情况。
| 报错提示 | 真实原因 | 处理办法 |
|---|---|---|
| 行 N:未知变量 | 全角冒号、变量名含空格或不可见字符 | 回到清洗脚本重跑 |
| 行 N:语法错误 | 缺分号、括号不配对 | 逐行数括号,确认每句以分号收尾 |
| 行 N:函数名错误 | 拼写不符,如把 PLOYLINE 写成 POLYLINE | 查函数列表核对拼写 |
| 结果恒为 0 或空 | 分母为零未做保护 | 分母统一套IF(x=0,1,x) |
| 选股时报画线函数不可用 | 公式里带 DRAWTEXT、STICKLINE 等 | 拆成显示版和选股版两份 |
有一个拼写坑值得单独说:通达信的多点连线函数写作PLOYLINE,不是常规拼写的POLYLINE,不少从别处抄来的源码在这行反复报错,改一个字母就好。另外函数名区分大小写的情况在部分版本存在,养成全大写或全小写统一的习惯,能省掉很多排查时间。
4.3 信号漂移的根源:ZIG、PEAK、BACKSET 这类未来函数
源码里出现ZIG、PEAK、TROUGH、BACKSET、REFX、BARSNEXT,就要提高警惕。这类函数在计算某个时点的值时会用到该时点之后的数据,历史图上看起来每个拐点都抓得准,实盘走到最后一根时数值还会变,也就是常说的信号漂移。
判断方法很直接:把公式装在图上,今天记下最后几根 K 线的信号状态,明天开盘前再看一次同样的历史位置,如果状态发生了改变,说明用了未来数据。也可以借助公式管理器自带的检测或第三方检测工具,但要清楚这些工具只能查已知函数名,改头换面的写法查不出来。
漂移对副图的影响比对选股小,但也别拿它做回测。用带未来函数的公式统计胜率,得到的结果没有参考价值,因为回测时每个信号都提前知道了后面的走势。
4.4 把副图源码复用成预警与选股条件
同一套算法要挂预警或者做条件选股,必须去掉全部画线函数,把结论收成一个输出变量。选股公式里出现 DRAWTEXT、DRAWICON、STICKLINE,编译阶段就会被拦下来。
{游资承接预警 —— 条件选股公式,不含画线函数} N:=20; M:=3; P:=20; 量均:=MA(VOL,N); 饱和:=MIN(1,(VOL/IF(量均=0,1,量均))/M); 均价:=AMOUNT/IF(VOL=0,1,VOL)/100; 强弱:=IF(HIGH=LOW,0.5,(CLOSE-LOW)/(HIGH-LOW)); 净额:=AMOUNT*强弱-(AMOUNT-AMOUNT*强弱); 资金:=净额/IF(MA(AMOUNT,P)=0,1,MA(AMOUNT,P)); XG:饱和>=0.999 AND 资金>0.5 AND CLOSE>REF(CLOSE,1);说明:公式新建时类型选「条件选股」,画线方法那一栏就不用管了。输出变量固定叫XG,通达信按这个名字识别选股结果。三个条件分别是量能触顶、资金强度过阈值、当日收红,用 AND 连接,条件越多信号越少,实测下来一天可能只出一两个,属于正常范围。挂预警时在「预警设置」里选这个公式,周期选日线,触发方式选「实时监控」,具体可选项随版本略有差异。
5. 副图源码的进阶玩法:tn6 互转、批量校验与版本留痕
5.1 tn6 与 txt 的互转:什么时候必须用 tn6
公式管理器里选中一条指标,右键或菜单里有导出选项,能导成 tn6 打包文件,部分版本支持导出为文本。tn6 的优势是自带公式名、参数和画线方法,导入方不用手工重填;文本只保留公式体,导入后还要自己建公式、自己填参数。要在多台机器之间同步,或者发给同事,用 tn6 明显省事。
反过来,需要看源码内容、做 diff 比对、改参数,就得用文本。遇到只有 tn6 没有源码的情况,先导入到自己的公式管理器,再导出成文本,就拿到了可读的公式体。注意不同版本的 tn6 兼容性有差异,低版本导出的包在高版本里一般能导入,反过来不一定,跨版本传递时留一句版本备注给自己。
5.2 批量校验:一次检查多个副图源码能不能编译
收了一堆清洗好的 txt,一条条手工粘贴测试太慢。可行的做法是写个脚本把每个文件里的公式体读出来,做静态检查:括号是否配对、每句是否以分号结尾、是否含未来函数关键字、分母是否都做了除零保护。
| 检查项 | 正则或方法 | 命中后的处理 |
|---|---|---|
| 括号配对 | 统计(与)数量 | 手工补齐 |
| 语句结尾 | 每行末尾是否为;或注释 | 补分号 |
| 全角残留 | 匹配[\uFF00-\uFFEF] | 回清洗脚本 |
| 未来函数 | 匹配 ZIG、PEAK、BACKSET 等 | 标记,人工确认 |
| 除零风险 | 查找裸除法/后是否为 IF 包裹 | 补 IF 保护 |
import re, pathlib RISKY = ("ZIG", "PEAK", "TROUGH", "BACKSET", "REFX", "BARSNEXT") for f in pathlib.Path("./clean").glob("*.txt"): s = f.read_text(encoding="utf-8") problems = [] if s.count("(") != s.count(")"): problems.append("括号不配对") if re.search(r"[\uFF00-\uFFEF]", s): problems.append("含全角字符") for k in RISKY: if re.search(rf"\b{k}\b", s): problems.append(f"疑似未来函数 {k}") print(f.name, "|", ";".join(problems) if problems else "静态检查通过")这段脚本只做静态筛查,不替代真机编译,但能把明显有问题的文件先挡掉,剩下的再逐条导入测试,效率差出好几倍。\b做单词边界匹配,避免把变量名里包含 PEAK 的标识符误判成函数调用,实际用的时候根据自己命名习惯微调。
5.3 版本留痕:源码文件怎么命名和比对
改造过的公式一定要留痕,不然过两个月自己也说不清哪版是好的。命名按「公式名_版本_日期」的格式,比如youzi_chengjie_v1.2_20250315.txt,版本号在公式体第一行的注释里也写一份。改动前后用diff看一眼,只改了参数还是改了算法,一眼能分出来。
diff -u youzi_chengjie_v1.1_20250310.txt youzi_chengjie_v1.2_20250315.txt调参到某个阶段感觉效果不错,就把那一版单独复制出来冻结,后面的改动另开文件,别在同一个文件上反复覆盖。真到了要复盘某次信号为什么没触发,手里有历史版本,五分钟就能查清是公式的问题还是参数的问题。
本文还有配套的精品资源,点击获取