通达信指标公式核心函数与实战编写指南
2026/9/17 14:52:05 网站建设 项目流程

简介:本资源是一份面向股票量化分析初学者与通达信公式编写入门者的系统性教程,聚焦技术指标、条件选股、交易系统及五彩K线四大类公式的实战编写方法。内容覆盖公式管理器操作流程、核心函数(如CROSS、REF、AND)的语义与用法、参数设置逻辑、动态翻译与公式测试技巧,并配有均线指标与“股价小于每股净资产”选股公式的分步编写示例,辅以界面截图说明与坐标线、画线方式等编辑器细节解析。资源为单文件PDF文档,共1个文件,大小1.52MB,结构清晰、图文结合,适合作为案头速查手册或自学入门指南。目前已有1038人学习下载,内容完整、语言平实,从零起步即可掌握通达信公式编写的核心能力与常见陷阱规避方法。

1. 通达信指标公式不是“写代码”,而是用专用语法描述价格行为逻辑

很多刚接触通达信的交易者,一看到“公式编写教程”就下意识打开Python或JavaScript编辑器,结果发现根本跑不起来——通达信指标公式既不依赖Python解释器,也不走HTTP API,它运行在通达信客户端内置的公式引擎里,语法是高度领域化的:没有循环、没有函数定义、没有面向对象,只有时间序列操作符(如REFBACKSET)、条件判断(IF)、绘图指令(DRAWLINEDRAWICON)和预置金融函数(MACDBOLLDMA)。它的核心价值不是“编程能力”,而是把技术分析语言精准翻译成机器可执行的信号规则。比如“三步点睛”副图指标中“触底→反转→看多”的三阶段判定,本质是用CROSS(金叉)、LLV(周期最低价)、COUNT(统计满足条件K线数)三个函数组合出状态机;而“量能饱和度圆圈1.00”里的圆圈图标,则必须用DRAWICON配合ISLASTBAR控制只在最新一根K线上绘制。这类公式对新手门槛在于逻辑建模能力,而非编码功底;对老手瓶颈则常卡在BACKSET的回溯长度陷阱或FILTER去重时机误判上。本文不讲抽象语法树,只聚焦你打开通达信公式管理器后,从新建空白公式到实盘验证的完整链路——所有命令可直接粘贴、所有参数有明确物理意义、所有坑位附带错误现象与定位方法。

2. 通达信指标公式语法核心:用5个基础函数构建90%的技术逻辑

通达信公式引擎的执行模型是“逐K线扫描+向量计算”,所有函数输入都是数组(即整列数据),输出也是同长度数组。理解这点,才能避开“为什么REF(C,1)返回整列而不是单个值”的常见困惑。下面用实战中最高频的5个函数展开,每个都配可运行代码、参数说明及典型误用场景。

2.1REF(X,N):时间轴上的“快照”操作,N必须为常数

这是最易被滥用的函数。新手常写REF(C, BARSCOUNT(C)-1)想取首根K线收盘价,但BARSCOUNT(C)是变量,通达信编译时会报错“参数必须为常数”。正确做法是用VALUEWHENHHV/LLV替代。

// ✅ 正确:取前3根K线的最高价(N=3为常数) PREV_HIGH := REF(HHV(H,5),3); // ❌ 错误:N为变量,编译失败 // DYNAMIC_N := BARSCOUNT(C) - 1; // FIRST_CLOSE := REF(C, DYNAMIC_N); // ✅ 替代方案:用VALUEWHEN获取首根K线收盘价 FIRST_CLOSE := VALUEWHEN(BARSCOUNT(C)=1, C);

提示REF(X,N)的N只能是0~5000的整数常量。当需要动态偏移时,优先用VALUEWHEN(条件,X)(取首次满足条件时的X值)或SUMBARS(X,N)(累计求和达到N时的K线索引)。

2.2CROSS(A,B):金叉/死叉检测器,本质是布尔状态跃迁

CROSS(A,B)返回1仅当A由下向上穿越B(即A前值<B前值 且 A当前值>B当前值),其他情况返回0。它不返回位置索引,而是每根K线一个布尔值。常被误用于“找第一次金叉”,但CROSS本身不带记忆性,需配合BARSLAST

// ✅ 正确:标记MACD柱状图由负转正的K线(即MACD金叉) MACD_DIFF := EMA(C,12) - EMA(C,26); MACD_DEA := EMA(MACD_DIFF,9); MACD_BAR := 2*(MACD_DIFF - MACD_DEA); MACD_CROSS := CROSS(MACD_DIFF, MACD_DEA); // DIFF上穿DEA // ✅ 找出最近一次MACD金叉距今几根K线 LAST_CROSS_BAR := BARSLAST(MACD_CROSS); // ❌ 错误:试图用CROSS找“首次”金叉(CROSS无历史记忆) // FIRST_CROSS := CROSS(MACD_DIFF, MACD_DEA) AND BARSCOUNT(C)=1; // 逻辑错误

注意CROSS对数据精度敏感。若A、B值因浮点误差在临界点反复抖动,可能产生虚假金叉。生产环境建议加过滤:CROSS(A,B) AND ABS(A-B)>0.001

2.3BACKSET(COND,N):制造“回溯标记”,解决“未来函数”争议的核心

BACKSET是通达信最具迷惑性的函数。BACKSET(COND,N)作用是:当COND为真时,将当前K线及向前N-1根K线的值设为1,其余为0。它常被误认为“取未来数据”,实则是用当前信号反向标记历史区间,用于画线、填色等视觉增强。

// ✅ 正确:画支撑线——当价格创N日新低后,将该K线及前N-1根标为1,再用DRAWLINE连接 N := 5; NEW_LOW := C = LLV(C,N); SUPPORT_FLAG := BACKSET(NEW_LOW,N); SUPPORT_LINE := DRAWLINE(SUPPORT_FLAG=1,L,SUPPORT_FLAG=1,L,0); // ❌ 错误:用BACKSET生成买卖信号(导致信号提前) // BUY_SIGNAL := BACKSET(CROSS(MA(C,5),MA(C,10)),3); // 错!这会让买入信号出现在金叉前3根K线

关键区别BACKSET用于绘图(视觉反馈),FILTER用于信号(交易触发)。后者才具备去重和延迟功能。

2.4FILTER(COND,N):信号去重与防抖,N是“冷却期”而非“前瞻”

FILTER(COND,N)在COND首次为真时返回1,之后N根K线内即使COND持续为真也返回0,直到N根后再次为真才返回1。它是实现“只做第一次突破”“避免连续开仓”的刚需函数。

// ✅ 正确:涨停回调低吸策略中,只在首次满足“5日内涨停后回调至10日均线”时发出信号 ZT_FLAG := C/REF(C,1)>=1.098; // 涨停 ZT_5DAY := BACKSET(ZT_FLAG,5); // 标记涨停及前4根K线 CALLBACK_COND := ZT_5DAY=1 AND C<=MA(C,10) AND C>REF(C,1)*0.95; BUY_SIGNAL := FILTER(CALLBACK_COND,5); // 5根K线内只发1次信号 // ✅ 验证:查看信号是否真的去重(在公式管理器中右键“测试公式”,看信号柱是否孤立)

参数说明:N是“最小间隔K线数”,不是“等待N根后触发”。若N=0,则退化为COND本身;N过大(如>100)会导致信号严重滞后。

2.5DRAWICON:在指定位置画图标,ISLASTBAR是安全绘制的关键

DRAWICON(COND,PRICE,TYPE)在满足COND的K线上,在PRICE价格处画TYPE号图标。但若未加ISLASTBAR限制,历史K线也会重复绘制,导致图表混乱。通达信图标编号需查《通达信图标代码表》,常用1(红箭头)、2(绿箭头)、10(圆圈)。

// ✅ 正确:只在最新一根K线画“量能饱和度圆圈” VOL_RATIO := V/MA(V,5); // 当前成交量/5日均量 SATURATION := VOL_RATIO > 2.5; DRAWICON(SATURATION AND ISLASTBAR, L*0.99, 10); // 在最新K线最低价下方画圆圈 // ✅ 副图中显示文字(用DRAWTEXT,原理同DRAWICON) DRAWTEXT(SATURATION AND ISLASTBAR, L*0.98, '量饱'), COLORRED; // ❌ 错误:漏掉ISLASTBAR,所有满足条件的K线都画圆圈 // DRAWICON(SATURATION, L*0.99, 10); // 图表将布满圆圈

提示ISLASTBAR是通达信内置常量,值为1仅当该K线是当前周期最后一根(即实时行情中的最新K线)。它不可被赋值或修改,是绘图安全的黄金守则。

3. 从零编写“三步点睛”副图指标:触底→反转→看多的完整实现

“三步点睛”是通达信社区高频指标,其逻辑本质是价格行为的状态机:先确认阶段性底部(触底),再验证上涨动能出现(反转),最后确认趋势强化(看多)。本节不提供成品源码,而是带你手写每一行,理解每个参数的业务含义,并给出调试验证方法。

3.1 第一步:定义“触底”——用价格与波动率双重过滤

单纯用LLV找最低点易受单日异常波动干扰。“触底”需满足:① 价格处于近期绝对低位;② 波动率收缩(地量/窄幅),表明抛压衰竭。

// 参数设置(公式管理器中可调) N1 := 13; // 触底周期,通常13-21日 M1 := 5; // 地量周期,通常5日 VOL_RATIO := V/MA(V,M1); // 当前量比 PRICE_POS := (C-LLV(L,N1))/(HHV(H,N1)-LLV(L,N1)); // 价格在N1日区间位置,0~1 // 触底条件:价格位置<0.15(底部15%区域)且量比<0.7(缩量70%) TOUCH_BOTTOM := PRICE_POS < 0.15 AND VOL_RATIO < 0.7;

参数说明N1=13对应斐波那契周期,兼顾灵敏与稳定;0.150.7是经验值,实盘中需根据个股波动率调整——高波动股(如创业板)可放宽至0.20.8

3.2 第二步:定义“反转”——用价格结构突破确认动能

“反转”不是简单阳线,而是价格突破短期压制结构。这里用CROSS(C,MA(C,3))确认站上3日线,再用REF(V,1)/V>1.5验证放量(前日量是当日1.5倍以上,表明资金回流)。

// 反转条件:收盘价上穿3日均线,且前日成交量是当日1.5倍以上(量价共振) UP_CROSS := CROSS(C, MA(C,3)); VOL_SURGE := REF(V,1)/V > 1.5; REVERSE := UP_CROSS AND VOL_SURGE; // 关键约束:反转必须发生在触底之后5根K线内,避免无效信号 REVERSE_VALID := REVERSE AND BARSLAST(TOUCH_BOTTOM)<=5;

注意BARSLAST(TOUCH_BOTTOM)<=5确保反转紧随触底,构成连贯行为。若去掉此约束,可能匹配到数月前的触底,失去战术意义。

3.3 第三步:定义“看多”——用趋势延续性确认方向

“看多”需排除假突破,要求价格在反转后站稳并创新高。用C>REF(H,1)(今日收盘高于昨日最高)确认突破有效性,再用COUNT(C>MA(C,10),3)>=2(3日内至少2日站上10日线)验证趋势黏性。

// 看多条件:突破昨日高点,且3日内至少2日站上10日线 BREAK_HIGH := C > REF(H,1); ABOVE_MA10 := C > MA(C,10); TREND_STICKY := COUNT(ABOVE_MA10,3) >= 2; LOOK_LONG := BREAK_HIGH AND TREND_STICKY; // 最终信号:三步全部满足,且按顺序发生(触底→反转→看多) STEP1 := TOUCH_BOTTOM; STEP2 := REVERSE_VALID AND BARSLAST(STEP1)<BARSLAST(REVERSE_VALID); // 确保反转在触底后 STEP3 := LOOK_LONG AND BARSLAST(REVERSE_VALID)<BARSLAST(LOOK_LONG); // 确保看多在反转后 THREE_STEP := STEP1 AND STEP2 AND STEP3;

逻辑说明BARSLAST(STEP1)<BARSLAST(REVERSE_VALID)确保反转K线索引大于触底K线索引(即反转发生在触底之后),这是状态机时序的核心校验。

3.4 绘图与信号输出:用不同颜色区分三步状态

副图指标需直观展示各步骤进展。用STICKLINE画背景色块,DRAWICON标关键节点,DRAWTEXT注释状态。

// 绘制触底区域(灰色半透明) STICKLINE(TOUCH_BOTTOM,0,0.3,6,0), COLORGRAY; // 绘制反转信号(黄色三角形) DRAWICON(REVERSE_VALID,0.4,8), COLORYELLOW; // 绘制看多信号(红色箭头) DRAWICON(THREE_STEP,0.8,1), COLORRED; // 文字标注(仅最新K线显示) DRAWTEXT(THREE_STEP AND ISLASTBAR,0.85,'★三步点睛'), COLORRED; DRAWTEXT(REVERSE_VALID AND ISLASTBAR AND NOT THREE_STEP,0.45,'→反转'), COLORYELLOW;

验证方法:在公式管理器中点击“测试公式”,观察副图是否出现分层色块;切换不同股票(如贵州茅台、中际旭创),检查信号是否符合常识——茅台应少信号(趋势强),小盘股应多信号(波动大)。

4. 公式调试与排错:3个必查错误类型及定位命令

写完公式不等于能用。通达信公式管理器的报错信息极其简陋(常只显示“公式语法错误”),实际问题多隐藏在逻辑层面。以下3类错误占调试工作量的80%,每类都给出定位命令和修复方案。

4.1 “除零错误”:隐式除法导致整个公式失效

通达信中/运算若分母为0,不报错但返回空值,后续所有计算变为无效。常见于MA(V,5)在新股前5日(V=0)、C/REF(C,1)在上市首日(REF(C,1)为空)。

// 定位命令:在公式末尾添加诊断行,查看分母是否为0 // DIAG_V_MA5 := MA(V,5); // DRAWTEXT(ISLASTBAR, 0.1, 'V5日均:'+NUMTOSTR(DIAG_V_MA5,2)), COLORBLUE; // ✅ 修复:用IF函数规避除零 VOL_MA5 := IF(COUNT(V>0,5)>=5, MA(V,5), REF(MA(V,5),1)); // 若5日内有0值,取前值

排查技巧:在公式管理器中右键“测试公式”,查看“数据”页签,找到VOL_MA5列,观察是否有#N/A。若有,说明分母为0。

4.2 “未来函数污染”:BACKSET/BARSLAST误用导致信号漂移

BACKSET本身非未来函数,但若用它生成的标记参与CROSS等函数,会间接引入未来数据。例如CROSS(BACKSET(COND,3),0.5),因BACKSET将未来3根标为1,导致金叉位置前移。

// ❌ 危险写法:用BACKSET结果做交叉判断 // FLAG := BACKSET(CROSS(MA(C,5),MA(C,10)),3); // FALSE_CROSS := CROSS(FLAG,0.5); // 信号提前3根! // ✅ 安全写法:所有信号生成必须基于已知历史数据 REAL_CROSS := CROSS(MA(C,5),MA(C,10)); REAL_SIGNAL := FILTER(REAL_CROSS,3); // 用FILTER去重,不引入未来

验证命令:在公式中加入DRAWNUMBER(ISLASTBAR, 0.9, BARSLAST(REAL_SIGNAL), COLORGREEN),观察数字是否为正整数(表示距今K线数)。若为负数,说明信号被未来数据污染。

4.3 “绘图溢出”:DRAWLINE/STICKLINE参数越界导致图表崩溃

DRAWLINE(A,B,C,D,0)要求A、B、C、D四列数据长度一致。若其中一列因REF取不到数据而变短(如REF(C,100)在不足100根K线的分钟图上),绘图函数会报错或显示异常。

// ✅ 防御式写法:用`ISNULL`检查数据有效性 VALID_A := IF(ISNULL(REF(C,5)),0,REF(C,5)); VALID_B := IF(ISNULL(L),0,L); DRAWLINE(VALID_A>0, VALID_B, VALID_A>0, VALID_B, 0), COLORBLUE; // ✅ 更优:用`COUNT`确保足够K线数再绘图 ENOUGH_DATA := COUNT(C>0,100)>=100; // 确保有100根有效K线 DRAWLINE(ENOUGH_DATA AND VALID_A>0, VALID_B, ENOUGH_DATA AND VALID_A>0, VALID_B, 0);

提示:在分时图(如5分钟)上测试公式时,务必先用COUNT(C,100)检查数据长度。新股或复牌首日数据不足,是绘图错误的高发场景。

5. 进阶技巧:用通达信公式管理器6.06实现指标参数化与批量导出

通达信公式管理器6.06版(当前主流版本)支持参数化设计和批量文件操作,这是提升效率的关键。很多教程忽略这点,导致每次改参数都要重写公式。本节教你用原生功能实现“一次编写,多股适配”。

5.1 参数化:用INPUT声明可调参数,替代硬编码

INPUT语句允许用户在公式应用时动态输入数值,无需修改源码。所有INPUT参数在公式管理器中自动生成滑块或输入框。

// 在公式开头声明参数(必须放在所有计算之前) N1:INPUT("触底周期",13,5,50,1); // 名称,默认值,最小值,最大值,步长 RATIO_PRICE:INPUT("价格位置阈值",0.15,0.05,0.3,0.01); VOL_SHRINK:INPUT("量比阈值",0.7,0.3,1.0,0.05); // 后续计算直接使用参数名 PRICE_POS := (C-LLV(L,N1))/(HHV(H,N1)-LLV(L,N1)); TOUCH_BOTTOM := PRICE_POS < RATIO_PRICE AND VOL_RATIO < VOL_SHRINK;

操作路径:在公式管理器中选中该公式 → 右键“修改” → 点击“参数”页签 → 可见三个滑块,拖动即可实时查看效果。参数名会自动显示在副图标题栏右侧。

5.2 批量导出:将tn6格式公式转为txt,便于版本管理与协作

通达信公式以.tn6二进制格式存储,无法用Git管理。但可通过公式管理器导出为文本,保留全部逻辑。

# 步骤(Windows系统): # 1. 打开通达信 → 公式管理器(Ctrl+F) # 2. 选中目标公式 → 右键“导出” → 选择“文本文件(*.txt)” # 3. 保存为"三步点睛_触底反转看多.txt" # 4. 用VS Code打开,可见清晰的Pascal语法结构

关键细节:导出的txt文件包含{公式名称}{公式描述}{参数}等区块,{公式主代码}部分即为你编写的全部逻辑。团队协作时,只需共享此txt文件,成员导入时选择“从文本文件导入”即可。

5.3 公式兼容性检查:识别tn6文件是否含加密或私有函数

部分网络流传的“国宝级指标”含加密段(如{ENCRYPTED}标签)或调用私有DLL(如CALLDLL('xxx.dll','func')),这些在标准通达信中无法运行。

// ✅ 安全公式特征:仅含通达信官方函数(文档可查) // 如:REF, CROSS, BACKSET, FILTER, DRAWLINE, MA, HHV, LLV... // ❌ 风险公式特征:含以下任意一项则可能失效 // CALLDLL(...) // 调用外部DLL // {ENCRYPTED} // 加密标识 // @FUNC_NAME // 私有函数前缀 // EXTERNAL_FUNC // 外部函数声明

验证方法:用记事本打开tn6文件(实际是文本),搜索CALLDLLENCRYPTED@符号。若存在,该公式需专业解密工具或联系作者,切勿强行修改。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询