简介:通达信时间周期指标公式源码,面向使用通达信进行股票技术分析的投资者,用于在K线图上自动标注基于斐波那契、卢卡斯等数列的时间节点,辅助识别可能的趋势转折。源码核心通过DRAWTEXT函数实现:当前K线数等于3、5、8、13、21等斐波那契数时,在高点上方显示绿色数字;在7、11、18、29等卢卡斯数位置显示白色标识;关键低点下方则以红色数字提示,颜色区分信号倾向,可为选时提供参考。这份源码利用CURRBARSCOUNT统计距当前K线的根数,标注位置和数字会随行情推进更新,便于复盘历史高点与变盘窗口。压缩包内共1个docx文档,大小108KB,包含可直接复制的完整公式代码与简要说明,已有82人学习。读者可直接将代码粘贴到通达信公式编辑器生成自定义指标,也可调整数字、颜色与标注位置以适配自身策略,是学习通达信公式编写和时间周期分析的有用素材。
1. 为什么我坚持在日线图里做“周线级”指标
先说一下我自己的痛点:早年看盘时,判断趋势总要在日线和周线之间来回切换。日线看到金叉,切到周线一看还在下降通道里,再切回来又忘了刚才的位置。后来我开始研究通达信指标公式源码里那些“时间周期”函数,试着把周线、月线级别的数据直接搬进日线主图或副图里,才彻底解决了这个问题。
所谓“时间周期”指标公式,核心就一件事:在不切换周期的情况下,用当前周期K线,去计算并展示其他周期的指标值。比如你在日线图上直接画出“本周最高价”“本周最低价”“周线MACD的DIF值”,这样就可以在一个界面里同时观察短周期和长周期的状态,做多周期共振判断时效率高很多。
这篇文章适合两类人:
- 一类是刚接触通达信公式、只会复制粘贴源码的新手,想知道这些源码为什么能“跨周期”显示,以及怎么改周期参数;
- 另一类是已经会写基础指标,但一遇到“跨周期引用”、“时间周期函数”就头疼的老手。
我会把通达信里和时间周期相关的几种做法拆开讲清楚,包括官方函数、跨周期引用、以及我自己常用的“裸函数重采样”写法,最后给出可直接编译的源码和验证方法。代码部分不含任何未来函数思路,也不会诱导你去追涨杀跌,仅仅是技术研究。
顺便说明:技术指标只是概率工具,周期信号再漂亮也不能保证后市走势,文中所有代码仅为公式写法演示。
2. 三条路线:通达信周期处理的实现层次
通达信里处理“时间周期”其实有三条完全不同的路线,我见过很多人混着用,最后都绕晕了。我把它们的原理和坑一次说透。
| 路线 | 实现方式 | 能选股吗 | 有无未来函数风险 | 适用场景 |
|---|---|---|---|---|
| 官方周期切换 | 直接点软件上的“周线”“月线”按钮 | 不涉及 | 无 | 手动看盘 |
| 跨周期引用 | 公式里用"指标名.输出线#WEEK"之类的语法 | 选股公式通常受限 | 取决于被引指标自身写法 | 需要真实周线数据的场景 |
| 裸函数重采样 | 用WEEKNUM、BARSLAST、HHV等函数自己拼出“周内序号” | 可以 | 可控 | 需要自建周期轨道、周期突破等信号 |
先看第一条路线,官方周期切换。它本质是把当前K线周期整体切换到周线、月线、季线或分钟周期,然后所有指标都在新周期下重新计算。这种操作最简单,但它不是“公式”,也做不到在同一个界面同时展示多个周期,所以我一般只用来人工复核,不写进公式里。
第二条路线,跨周期引用,是通达信官方支持的公式语法。比较典型的是这种写法:
周线DIF:"MACD.DIF#WEEK";它表示在日线周期下,引用周线周期下MACD指标的DIF线数值。这样日线图里就能直接看到周线MACD的变化趋势。我当时第一次用这个功能时觉得确实方便,但用久了就发现两个实际问题:
- 跨周期引用在选股公式里限制很多,很多券商版本根本不支持,你写出来要么编译报错,要么选出来的结果和副图显示不一致;
- 被引用的指标如果本身写得有问题,比如内部用了
CONST或其他未来函数,那周线数据会被“污染”,在历史K线上画出看似精准的买卖点,实盘根本没法用。
所以我后来的习惯是:能不用跨周期引用就不用,除非是被引用的周线数据结构实在复杂,比如想直接拿到真实的周线均线系统,才考虑这条路线。
第三条路线,裸函数重采样,是我最推荐大家掌握的方法。它不依赖任何#WEEK语法,只在当前周期内,用几个函数判断出“这根K线属于哪个时间周期、周期内第几根”,然后用HHV、LLV、SUM等函数把当前周期内的数据聚合起来。比如在同一根日线K线上,算出“本周至今最高价”“本周至今最低价”“本周累计成交额”等,这些数据本身没有未来函数,而且可以用于选股公式。
下面我用一整节来拆解这条路线的工作原理。
3. 裸函数周期转换的核心:定位周期起点
裸函数重采样听着玄乎,核心其实就两步:找到每个周期的起点,然后从起点数到当前K线一共有多少根。这两步解决了,后面所有统计都是水到渠成的事。
3.1 先用 WEEKNUM 判断“新周期第一根K线”
通达信公式语言里有一个函数叫WEEKNUM,它返回的是某个日期属于一年中的第几周。比如2024年1月2日如果属于第1周,那它返回值就是1,2024年1月9日如果属于第2周,就返回2。
基于这个特性,判断“当前K线是否为新一周的第一根K线”就非常简单:
周首:=WEEKNUM<>REF(WEEKNUM,1);意思是:如果当前K线的周数不等于前一根K线的周数,说明这根K线是本周第一根。比如从上周跳到本周,WEEKNUM从35变成36,条件成立。
这里有个细节值得注意:判断周起点用WEEKNUM比用WEEKDAY更稳。一开始我写的是WEEKDAY<REF(WEEKDAY,1),想通过“星期几变小”判断周一起点,但遇到周一节假日休市时,本周第一根K线可能是周二,WEEKDAY从上周五的5跳到本周二的2,逻辑也不难处理。可如果遇到国庆、春节这种长假,中间可能跨过多个星期,用WEEKDAY就很容易判断出错。WEEKNUM直接看“周编号是否改变”,无论中间隔了几天休市都不会错。
注意:年末跨年时会从第52周或53周跳回第1周,同样满足
<>条件,所以也能正确标记为新周期起点。
3.2 用 BARSLAST 计算“距本周第1根K线有多远”
找到周期起点之后,下一步是算距离。通达信里有BARSLAST函数,它返回上一次某个条件成立到当前的K线根数。
距周首:=BARSLAST(周首)+1;解释一下这个公式:
- 如果当前K线刚好是周首,那么
BARSLAST(周首)返回0,加1后距周首等于1,表示“当前是本周第1根K线”; - 如果当前是本周第2根,那么
BARSLAST(周首)返回1,加1后距周首等于2; - 以此类推。
打个比方,这就像切豆腐:你每隔一段距离切一刀,每一刀就相当于“周首”,切完之后你又往前进了一步,距周首就是这个“又前进的步数”。有了这个步数,就能把所有统计函数的计算范围限制在“本周内”。
比如:
本周最高:=HHV(H,距周首); 本周最低:=LLV(L,距周首); 本周开盘:=REF(O,距周首-1);HHV(H, 距周首)是“从本周第1根到当前K线,最高价的最高值”,也就是本周至今的最高价;LLV(L, 距周首)是“从本周第1根到当前K线,最低价的最低值”;REF(O, 距周首-1)是“回看距周首前1根的开盘价”,由于从本周第1根算起,这里取到的就是本周第1根K线的开盘价。
我在写第一个版本时直接用REF(O,距周首),结果发现信号总是偏移一根K线,后来才意识到当距周首=1时REF(O,1)取的是昨天开盘价,而不是今天的开盘价,所以一定要减1。这种细节不亲自跑一遍,光看别人源码很难发现。
3.3 把统计结果画出来:一个最简单的时间周期副图
基于上面的逻辑,写一个最简单的“周内轨道”副图:
周首:=WEEKNUM<>REF(WEEKNUM,1); 距周首:=BARSLAST(周首)+1; 周开:REF(O,距周首-1),COLOR00FFFF; 周高:HHV(H,距周首),COLOR0000FF; 周低:LLV(L,距周首),COLOR00FF00;这段代码在日线周期下运行后,副图会画出三条线:本周开盘价、本周至今最高价、本周至今最低价。每天盘中,周高和周低会随价格波动而变化,直观反映当前价在本周所处的位置。我经常用它来判断“股价是否运行在周内高点上沿”或者“是否跌破了周内低点”,这种信息在纯日线图里看不出来。
理解了WEEKNUM和BARSLAST的组合,你就有了一个基础引擎。后面想统计本周涨跌幅、本周成交额、本周振幅,都可以基于同一个距周首变量去做。这也是为什么社区里很多源码的核心都离不开这两个函数。
4. 可直接运行的源码:周线轨道副图与选股扩展
以下是我常用的一段完整源码,命名为“周轨”即可,编译通过后放在副图里看效果。它同时画出了本周开盘、周高、周低和本周均价线,基本覆盖了日常看盘需要。
{周轨副图} 周首:=WEEKNUM<>REF(WEEKNUM,1); 距周首:=BARSLAST(周首)+1; 周开:REF(O,距周首-1),COLOR00FFFF; 周高:HHV(H,距周首),COLOR0000FF; 周低:LLV(L,距周首),COLOR00FF00; 周均:SUM(AMOUNT,距周首)/(SUM(VOL,距周首)*100),COLORFF00FF,DOTLINE;这里顺手解释一下周均的含义:AMOUNT是成交额,VOL是成交量(单位手,乘以100等于股数),两者相除得到本周开盘至今的成交均价。它和分时图里的均价线思路一致,只不过被放到了周线周期维度上,对判断短期资金成本有参考价值。
用的时候有几个操作细节:
- 公式类型选“副图”,不要选“主图叠加”,否则线和K线挤在一起;
- 周期切到日线,因为源码里的函数逻辑是按“日线K线逐根判断”设计的;
- 如果盘中数据刷新滞后,按
Ctrl+S手动刷新一下行情,副图线会同步更新。
如果你试过这个副图后觉得有用,想把它扩展成选股条件,思路也很直接。比如我想选出“今天创出本周新高”的个股,核心条件就是:
距周首>1 AND C>REF(HHV(H,距周首),1);拆解一下:
REF(HHV(H, 距周首), 1)代表“到昨天为止的本周最高价”,排除今天的影响;C>...表示今天收盘价已经突破昨天为止的周内最高;距周首>1是为了过滤掉本周第一根K线,因为第一根没有“昨天的周高”可以比较。
完整选股公式可以这样写:
周首:=WEEKNUM<>REF(WEEKNUM,1); 距周首:=BARSLAST(周首)+1; 昨日周高:=REF(HHV(H,距周首),1); 突破:=C>昨日周高 AND H>昨日周高 AND 距周首>1; FILTER(突破,3);FILTER(突破,3)的意思是:信号成立后3个交易日内不重复触发,避免同一波突破连续几天都选出来。选股周期一定要设成日线,因为公式中所有函数都是基于日线序列计算的。
我还尝试过把它扩展成“月线轨道”。“月首”的判断逻辑类似,需要换成:
月首:=MONTH<>REF(MONTH,1); 距月首:=BARSLAST(月首)+1;MONTH函数返回月份,跨月时自然触发条件变化。用同样的方式构造月高、月低,就能在日线图里看到月线级别的支撑压力区间。不过要注意:月线轨道的时间跨度更大,信号频率更低,参考价值反而更偏中长期,不能和短周期混为一谈。
5. 时间周期公式最容易踩的五个坑
这部分是我个人最想写的。很多源码看起来逻辑没什么问题,但一放到实盘环境就变样,绝大多数都是踩了下边这些坑。我一条条说。
5.1 周期起点判断在新年或长假时翻车
前面我说WEEKNUM比WEEKDAY稳,但它也不是万无一失。每年跨年时,不同软件对“第1周”的定义可能不一致,有的把1月1日就算第1周,有的把第一个周一所在的周才算第1周。这就导致同一段K线在旧版本和新版本通达信里,WEEKNUM的返回值可能差1。
我处理这个问题的方法是在公式里加一个“周首辅助标记”,用DATE值人工核对:
周首:=WEEKNUM<>REF(WEEKNUM,1); DRAWTEXT(周首,LOW*0.98,'周');把公式跑起来后,如果副图每周第一根K线下方出现“周”字,说明判断正确;如果某些周没标记或者标记错位,赶紧检查是不是跨年边界问题。
5.2 CONST 函数带来的未来函数陷阱
网上很多“解码后”的指标源码里都喜欢用CONST函数,比如CONST(HHV(H, 距周首))或者CONST(REF(MA(C,5), 距周首))。我一开始也以为这样能把周线数值固定成水平线,看起来信号特别清晰。后来深入研究才发现,CONST的作用是“取序列最后一个值并平铺到所有K线上”,也就是说它会把最新一天算出的结果回填到历史每一根K线上。在历史图上你看到的是很完美的直线或买卖点,但那是“事后诸葛”,实盘中根本不可能提前知道最终值。遇到这种写法,不管指标名字多神,都要保持警惕。正确的做法是用REF、HHV、LLV这类只能使用当时K线及之前数据的函数,保证信号在盘中可以重复计算。
5.3 跨周期引用在选股公式中不支持
我想不少人都经历过:副图里用"MACD.DIF#WEEK"显示正常,一放进选股公式,要么提示语法错误,要么选出来结果为空。不同券商的通达信版本跨周期支持程度不一样,有的只允许在技术指标公式中使用,不允许在条件选股公式中使用。这不是你代码的问题,是平台限制。解决办法有两个:
- 改用裸函数重采样,把所有周线数据先算成普通序列,再写选股条件;
- 或者先创建周线指标,输出为个股数据到自定义板块,再做二次筛选。
我一般优先选第一个,因为省事,而且逻辑更透明。
5.4 周内信号会随着本周K线增加而漂移
日线周期下计算“本周新高”“本周均价”,它们天然有一个特点:每个交易日都会变化,周五收盘后才会最终定格。所以你在周二看到的周线级别突破信号,和周五收盘后回看时,“当时信号是否成立”可能不一样。比如周初股价强势突破了当时的周内高点,但后面两天冲高回落,到周五再看,那根K线可能已经被排除在突破条件之外。这种“信号漂移”不是公式错误,而是周期统计的固有属性。
应对办法是:只有在接近周期末端时,周期信号才更有参考价值。比如周线级别的突破,最佳确认时机是周四、周五,而不是周一。如果你用日线周期的信号去做短线交易,必须对信号滞后有心理准备。
5.5 公式被加密后的“解锁”乱象
网上流传的“通达信指标带密码怎么解锁”其实是很多人都会搜的问题。坦白说,大部分加密指标解锁后你会看到两个结果:一是源码里塞满了CONST和一堆无意义的中间变量,功能并没有宣传的那么神奇;二是解锁过程本身就伴随风险,比如导入第三方插件或DLL,反而可能影响交易终端安全。我的个人观点是:与其花精力去解锁别人的黑盒指标,不如把WEEKNUM、BARSLAST、HHV这几个基础函数吃透,自己写出来的公式至少每一步逻辑都清楚,出了问题也知道去哪修。如果你手上确实有必须用的加密指标,也建议只在模拟环境验证,不要直接放到实盘账上。
6. 怎么验证你的时间周期指标没有未来函数
最后分享几个我用得最多的验证方法,适合任何周期类指标,尤其适合你准备拿真金白银去参考的公式。
6.1 手工对比周线图和日线图
最简单粗暴的方法:把源码跑在日线副图上,然后在同一只股票上切到周线周期,对比“本周开盘价、本周最高、本周最低”是否和你副图里最后一根K线上的数值一致。如果一致,说明周期统计逻辑正确;如果不一致,查一下是距周首的边界错了,还是周线软件本身的复权方式和你主图不一样。
我举一个具体例子:如果你在日线图用了前复权数据,但切到周线图时软件默认也做了前复权,那么数值应该是一致的。但如果日线图用的不复权、周线图用的前复权,两者会差一个除权除息缺口,这不是公式问题,而是数据口径问题。遇到这种情况,先把两个周期都统一成“前复权”再对比。
6.2 用“标记函数”定位周期起点
在副图里加一行:
DRAWTEXT(周首, LOW, '起');如果公式逻辑正确,你会在每个新周期第一根K线下方看到“起”字。然后对照K线图最底部的时间轴,看看这些标志是否正好落在每周第一个交易日上。如果某些周少了,或者某些周多了一个标志,说明WEEKNUM或跨年判断在你的数据源下需要额外处理。
6.3 回放验证:昨天没信号,今天有信号,不算问题;昨天有信号,今天没了,才是问题
我常给朋友讲一个口诀:未来函数的最大特征是“昨天有信号,今天却消失了”。因为未来函数在历史片段上用的是“最终值”,所以K线走完后信号是固定的;而实时计算时,随着新K线加入,早些K线上被赋的值可能会变化,看起来就像信号突然消失。针对这个特征,你可以用通达信的“公式回放”功能,把K线停在某个历史日期,看公式当时是否给出信号。如果回放到历史某天时显示有信号,但把K线拉到当前最新位置后再回看那天,信号却没了,那这个公式大概率有未来函数。
我自己的使用习惯是:任何带未来函数嫌疑的指标,只用来复盘研究,绝不上实盘。裸函数写的HHV、LLV、SUM都是天然无未来函数的,这也是我坚持用裸函数重采样做周期指标的根本原因。
7. 一点个人体会:别迷信源码,理解周期才是核心
这几年我研究过不少“时间周期”相关的通达信指标源码,也帮朋友修复过很多下载下来乱码、带密码、编译不过的公式。从中最大的体会是:源码本身不神秘,真正有价值的是你如何理解周期、如何判断边界条件。把WEEKNUM、BARSLAST、距周首这几个概念吃透,你既能看懂别人公式里的门道,也能自己写出更贴合交易思路的指标。
如果你刚开始接触这块,建议先从“周轨副图”这个例子入手,在几只不同股票上反复观察一周,看看周高、周低、周开三条线的变化节奏。等你习惯了这种“日线图里看周线数据”的视角,再往月线、季线、分钟线扩展,就会发现通达信的时间周期组合几乎可以满足所有自定义需求。最后再说一句:公式只是工具,周期只是观察角度,真正做决策时永远要把风险控制放在第一位。
本文还有配套的精品资源,点击获取