简介:本资源是一份面向股票量化分析初学者与通达信用户的技术指标开发入门教程,系统讲解如何在通达信平台编写四类核心公式:技术指标(如MA、KDJ)、条件选股(如“股价低于每股净资产”)、交易系统(自动标示买卖点)及五彩K线(按形态染色K线)。教程覆盖从公式管理器操作、函数调用(CROSS、REF、AND等)、参数设置到动态翻译与测试验证的全流程,并配有详细图文示例,如10日均线构建、条件选股公式编写等实操步骤。资源为单文件PDF文档,共1个文件,大小1.52MB,内容结构清晰,含公式类型说明、函数速查附录与编辑器功能详解,便于随时查阅与上手实践。目前已有1044人学习下载,适合零基础入门、快速掌握通达信公式语言并投入实盘辅助分析的投资者与量化爱好者。
1. 通达信指标公式编写教程[完整版]:不是“抄代码就能用”的速成课,而是帮你绕开90%新手公式的血泪现场
你是不是也试过:网上搜到一个“MACD金叉选股公式”,复制粘贴进通达信,一测试——“公式语法错误”;或者好不容易调通了,回测发现它选出的全是ST股、退市预警股,根本没法实盘参考?这不是你手残,是绝大多数人根本没搞清通达信公式的底层逻辑:它不是Python,没有IDE调试器;它不报错行号,只甩你一句“参数错误”;它连小数点后几位都影响信号触发,而你还在用中文逗号写分号。这份《通达信指标公式编写教程[完整版]》PDF,不是教你怎么点几下鼠标生成均线,而是从函数本质、参数边界、坐标映射、测试陷阱四个维度,把通达信这个“金融黑匣子”拆开给你看螺丝怎么拧。适合刚装好通达信、连公式管理器在哪都找不到的新手;也适合写了三年公式但始终卡在“为什么副图显示正常、主图叠加就变形”的老手。它不讲K线哲学,只讲CROSS()函数里X和Y谁在前谁在后决定买卖方向,只讲REF(C,1)和REF(C,2)差一天就可能让金叉信号晚两天出现——这才是实盘能用的硬核细节。
2. 四大公式类型的本质差异:技术指标、条件选股、交易系统、五彩K线,不是菜单分类,而是数据流向与输出目标的彻底分野
通达信公式管理器里那四个并列的树形节点,绝不是为了界面好看随便分的。它们对应着四套完全不同的数据处理链路、输出规则和调用入口。搞不清这点,你写的公式再漂亮,也永远只能在副图里“自嗨”。
2.1 技术指标公式:副图/主图双模态输出,但坐标系逻辑天差地别
技术指标公式(如MA、KDJ)的核心任务是生成一条或多条数值序列,并决定它画在哪。关键不在计算,而在“画法”:
- 副图模式(默认):系统自动归一化坐标轴。比如你算出的MACD值域是[-50, 80],通达信会把它拉伸填满整个副图高度,零轴永远居中。此时
DRAWNULL(空值)会被忽略,不影响图形连续性。 - 主图叠加模式:数值直接映射到价格坐标系。如果你写
MA(C,5)并设为“主图叠加”,它就会像一根价格线一样,和K线共用同一纵轴。此时若你误写MA(VOL,5)(成交量均线),它会以“元”为单位画在价格图上——结果就是一条紧贴底部的直线,因为成交量数值远大于股价。
提示:主图叠加公式必须确保输出值与价格量纲可比。常见做法是用
/10000或*0.001缩放成交量,或用HHV(H,20)等函数做相对值转换。
2.2 条件选股公式:单布尔值输出,但“选中”背后藏着时间窗口陷阱
条件选股公式(如“股价低于净资产”)的唯一合法输出是1(满足)或0(不满足)。但它最致命的坑在于时间点认定:
C < FINANCE(34)这行代码看似无懈可击——FINANCE(34)是每股净资产。但通达信在执行选股时,默认取最新财报数据,且不校验财报日期是否覆盖当前K线周期。如果某公司3月发布年报,你4月用日线选股,它用的是年报数据;但若你切到周线,它仍用同一份年报,导致“净资产”在整周内恒定不变——而股价每天波动,信号失真。
正确写法需加时间过滤:
C < FINANCE(34) AND YEAR=YEAR(FINANCE(37))其中FINANCE(37)是最新财报公告日期,YEAR()取年份。这样确保只用当年财报数据。
2.3 交易系统公式:买卖信号非实时生成,而是基于“持仓状态机”推演
交易系统公式(如“双均线金叉买入,死叉卖出”)的输出不是简单BUY/SELL指令,而是一套状态驱动的信号队列。通达信内部维护一个虚拟持仓状态,只有当状态切换时才触发信号:
MA5:=MA(C,5); MA10:=MA(C,10); BUY:=CROSS(MA5,MA10) AND HOLDING=0; // 必须加HOLDING=0,否则反复开仓 SELL:=CROSS(MA10,MA5) AND HOLDING=1; // 同理,必须有持仓才平仓这里HOLDING是通达信内置变量,表示当前是否持有。漏掉它,系统会在每个金叉日都发买入信号,导致资金被反复占用。
2.4 五彩K线公式:颜色渲染依赖“K线实体判定”,而非收盘价绝对值
五彩K线公式(如“长阳线标红,长阴线标绿”)的输出是颜色代码(如COLORRED),但它渲染的依据是K线形态逻辑,不是数值大小:
// 错误示范:只看涨跌 IF(C>O, COLORRED, COLORGREEN) // 正确逻辑:看实体长度占振幅比例 STICKLINE(C>O AND (C-O)/MAX(H-L,0.01)>0.6, H, L, 0, 0), COLORRED; STICKLINE(C<O AND (O-C)/MAX(H-L,0.01)>0.6, H, L, 0, 0), COLORGREEN;MAX(H-L,0.01)防止除零,0.6是长实体阈值(60%)。否则震荡市中微涨微跌K线也会被染色,失去技术意义。
3. 公式函数的底层逻辑:HIGH、CLOSE、REF、CROSS不是单词,而是时间序列操作符,用错一个就全盘失效
通达信公式语言表面像BASIC,实则是为金融时序数据深度定制的DSL。它的函数不是“计算工具”,而是对K线序列的原子级操作。理解这点,才能避开90%的语法翻车。
3.1 行情函数:所有价格函数都带隐式周期偏移,CLOSE不是“今天收盘”,而是“当前周期收盘”
HIGH、LOW、OPEN、CLOSE、VOL这些基础函数,新手常误以为它们返回“当日值”。实际上,它们返回的是当前分析周期的值。当你在日线图上,CLOSE是当日收盘;但切到60分钟图,CLOSE就是最近一根60分钟K线的收盘价。更关键的是:它们天然支持跨周期引用,无需REF():
// 在日线图上,想获取上周五的收盘价 REF(C,5) // 正确:向前推5根日K线 // 但在60分钟图上,REF(C,5)是往前5根60分钟K线(约1天),不是上周五所以跨周期开发必须显式声明:
// 在任意周期图上,都取“上周五”收盘(假设周五是第5个交易日) REF(C, IF(WEEKDAY=5, 0, WEEKDAY-5+5)), // 复杂但精准:先判断今天星期几,再算偏移3.2 REF函数:不是“取历史值”,而是“取历史序列的第N个元素”,M必须为整数且≥1
REF(X,M)常被误解为“取M天前的值”。严格说,它是对X序列做负索引:X本身是一个长度为N的数组(N=当前K线总数),REF(X,M)返回X[N-M]。因此:
M必须是正整数,REF(C,0)非法,REF(C,-1)非法;M超过当前K线总数时,返回NULL,参与计算会导致整行公式失效;- 常见翻车:
REF(C,1)在第一根K线上返回NULL,若后续有/REF(C,1),则整列变空。
安全写法加保护:
PREV_CLOSE := IF(BARSCOUNT(C)>=1, REF(C,1), C); // 首根K线用自身代替3.3 CROSS函数:不是“交叉检测”,而是“上穿瞬时事件”,X和Y顺序决定信号方向
CROSS(X,Y)的真相是:仅当X在当前周期值 > Y,且X在上一周期值 ≤ Y时,返回1。它捕捉的是“穿越瞬间”,不是“交叉状态”。
// 想检测MA5上穿MA10的金叉信号 CROSS(MA(C,5), MA(C,10)) // 正确:X=快线,Y=慢线 // 若写成CROSS(MA(C,10), MA(C,5)),检测的是死叉!更隐蔽的坑:CROSS对NULL敏感。若MA(C,10)在前9根K线为NULL,则第10根K线时CROSS必然失败(因上一周期Y为NULL,不满足≤条件)。解决方案是用BARSCOUNT限定:
COUNT_CROSS := CROSS(MA(C,5), MA(C,10)) AND BARSCOUNT(C)>=10;3.4 逻辑运算符:AND/OR不是布尔运算,而是“向量级联”,空值传播规则极苛刻
通达信中AND、OR作用于整个序列,不是单点。X AND Y要求X和Y在每一根K线上都非空且为真,任一位置为NULL或0,结果该位置即为NULL。
// 想筛选“连续3日收阳且量能放大” C>O AND REF(C,1)>REF(O,1) AND REF(C,2)>REF(O,2) AND VOL>REF(VOL,1)*1.2 // 问题:第1、2根K线REF(C,1)、REF(C,2)为NULL,整行前两根变NULL,无法选股正确解法用COUNT聚合:
COUNT(C>O,3)=3 AND VOL>REF(VOL,1)*1.2COUNT只统计真值个数,自动跳过NULL,这才是金融时序的正确聚合姿势。
4. 避坑:新手必踩的5个“测试通过但实盘崩盘”陷阱,每一条都来自真实翻车现场
写完公式点“测试通过”就以为万事大吉?通达信的测试环境是理想国,实盘才是修罗场。以下5条,条条都是某开发者深夜删库重来的血泪经验。
4.1 现象:副图显示完美,主图叠加后指标线“悬浮”在K线上方,不贴合价格
- 原因:主图叠加模式下,公式输出值直接映射到价格纵轴。若你的指标(如RSI)值域是[0,100],而股价在[5,20]元,通达信会把100强行画在20元高度,导致整条线被压缩到顶部。
- 解决:主图叠加公式必须做量纲归一化。常用方案:
- 用
((X-LLV(X,N))/(HHV(X,N)-LLV(X,N)+0.01))*PRICE_RANGE将X缩放到当前价格区间; - 或用
MA(C,5)*0.99 + (X-50)*0.01,让指标围绕5日均线小幅波动。
- 用
4.2 现象:条件选股结果每天不同,同一只股票有时入选有时不入选,无规律
- 原因:未锁定数据源时效性。
FINANCE()函数取财报数据,但财报更新有延迟;DYNAINFO()取实时行情,但盘中波动剧烈。混用二者导致信号漂移。 - 解决:统一数据源并加时效校验。例如选股净资产,强制用年报数据:
C < FINANCE(34) AND FINANCE(37) >= FROMUNIX(20230101) // FINANCE(37)是财报公告日,FROMUNIX转时间戳
4.3 现象:交易系统公式在回测中盈利,实盘却频繁止损,胜率暴跌50%
- 原因:回测用“收盘价”成交,实盘用“下一根K线开盘价”成交。金叉信号出现在日K线收盘,但实际买入是次日开盘,期间可能跳空低开。
- 解决:交易系统公式中,买卖信号需预留1周期延迟:
BUY_SIGNAL := CROSS(MA5,MA10); ACTUAL_BUY := REF(BUY_SIGNAL,1); // 信号产生后,下一根K线才执行
4.4 现象:五彩K线在副图正常,在主图颜色错乱,阳线标绿、阴线标红
- 原因:
STICKLINE函数的H(最高)和L(最低)参数在主图模式下被解释为价格坐标,但若你用STICKLINE(1, H, L, ...),1被当价格值,导致线条画在1元位置。 - 解决:五彩K线必须用
DRAWNULL或COLOR直接控制,禁用STICKLINE画线:DRAWNULL,COLORRED; // 主图上直接设整根K线为红色 // 或用条件赋值 IF(C>O, COLORRED, COLORGREEN);
4.5 现象:公式在通达信7.0测试通过,升级到7.8后报“函数未定义”错误
- 原因:通达信版本迭代中,部分函数名变更或废弃。如旧版
STD()(标准差)在新版需写为STDDEV();SUM()在特定场景下被SUMBARS()替代。 - 解决:编写时查官方函数手册(非网络二手资料),并在公式开头加版本注释:
// 通达信7.8+兼容 // STD => STDDEV, SUM => SUMBARS for volume analysis
5. 实战:从零写出一个“防假突破”K线形态识别公式,含动态阈值与信号过滤
现在我们把前面所有坑都串起来,写一个真正能用的五彩K线公式:识别“长上影线假突破”形态——股价冲高回落,上影线长度超实体2倍,且成交量放大,预示上方抛压沉重。这不是教科书案例,而是某导师在模拟项目X中实盘验证过的策略。
5.1 形态定义与动态阈值设计
假突破核心是上影线长度 vs 实体长度,但固定阈值(如“上影>实体2倍”)在不同股价、不同波动率下失效。必须用动态基准:
- 实体长度:
ABS(C-O) - 上影线长度:
H-MAX(C,O)(阳线取C,阴线取O) - 动态基准:用
ATR(14)(14日平均真实波幅)替代固定倍数,因ATR自适应市场波动
// 计算基础变量 BODY := ABS(C-O); UPPER_SHADOW := H-MAX(C,O); ATR14 := ATR(14); // 动态阈值:上影线需大于1.5倍ATR,且大于实体2倍(双重过滤) IS_LONG_UPPER := UPPER_SHADOW > MAX(1.5*ATR14, 2*BODY); // 成交量过滤:当日量能需大于5日均量1.3倍,确认放量 VOL_RATIO := VOL/MA(VOL,5); IS_VOLUME_OK := VOL_RATIO > 1.3; // 综合信号 FAKE_BREAK := IS_LONG_UPPER AND IS_VOLUME_OK;5.2 信号去重与K线标注实现
直接标色会导致连续多日满足条件,K线一片红。需加“信号冷却期”:
// 用BARSLAST记录上次信号距今K线数,冷却期设为3日 LAST_SIGNAL := BARSLAST(FAKE_BREAK); COOLDOWN := LAST_SIGNAL > 3 OR LAST_SIGNAL = 0; // 最终有效信号 VALID_SIGNAL := FAKE_BREAK AND COOLDOWN; // 五彩K线标注:仅标实体,不画影线(避免遮挡) DRAWICON(VALID_SIGNAL, L, 1); // 在最低价位置画图标 // 或用颜色填充K线实体 STICKLINE(VALID_SIGNAL, O, C, 3, 0), COLORBLUE;5.3 实盘验证技巧:用“信号分布热力图”定位失效时段
写完公式别急着选股,先做三件事:
- 导出信号时间序列:在公式编辑器点“测试公式”→“导出数据”,保存为CSV;
- 用Excel做热力图:横轴日期,纵轴小时(若用分钟线),格子填1/0,观察信号是否集中在早盘/尾盘;
- 对比大盘状态:加一行
INDEXC>MA(INDEXC,60)判断大盘是否处于60日均线上方,若信号90%出现在大盘下跌中,则策略需加牛市过滤。
注意:通达信不支持直接导出热力图,但
EXPORT命令可导出全量数据。我一般用Python读取CSV,用seaborn.heatmap秒出图——这步省掉,等于没验证。
6. 进阶:参数精灵的隐藏用法与“公式版本管理”实战,让每次修改都有后悔药
参数精灵(Parameter Wizard)不只是改个数字的滑块,它是通达信里最被低估的工程化工具。用好它,你能把一个公式变成一套可配置策略族。
6.1 参数分组与联动:让“均线周期”和“ATR周期”自动同步
默认参数精灵是扁平列表,但你可以用//注释分组,通达信会识别:
// === 趋势参数 === M1:10,5,250,5; // 短期均线 M2:20,5,250,5; // 长期均线 // === 波动参数 === ATR_N:14,5,50,1; // ATR周期 VOL_MULT:1.3,0.5,3,0.1; // 成交量放大倍数更进一步,让M1和M2联动(如M2=2*M1):
M1:10,5,120,5; M2:20,10,240,10; // 初始值=2*M1,步长=2*步长,用户改M1,M2自动变6.2 版本管理:用“公式描述”字段存Git式commit信息
通达信公式有“公式描述”字段,别只写“假突破识别”。把它当git commit message用:
v2.1.3 | 20240520 | 修复ATR在新股首日为0导致除零 | 增加大盘过滤INDEXC>MA(INDEXC,60) | 测试通过:沪深300近3年回测胜率68%每次修改公式,更新描述字段。导出公式时,描述随文件保存。某天策略失效,你翻描述就知道:“哦,是v2.1.2版本没加新股保护,换回v2.1.3”。
6.3 公式备份与灰度发布:用“公式类型”字段做AB测试通道
公式管理器的“公式类型”不仅是分类,更是发布开关。我习惯建三个类型:
【TEST】假突破:给新版本用,不对外公开;【STABLE】假突破:当前主力版本;【LEGACY】假突破_v1:旧版存档。
在条件选股时,只调用【STABLE】;实盘用【STABLE】;新同事学习用【TEST】。切换只需改一个字段,零风险。
从那以后我每次写公式,都强制走一遍“参数分组→描述commit→类型打标”三步。不是怕出错,是怕三个月后自己都看不懂当初为啥把VOL_MULT设成1.3而不是1.25。希望帮到你。
本文还有配套的精品资源,点击获取