通达信REF函数怎么用?历史引用、同根对齐与比较错位排查

REF历史字段与同根比较对齐流程示意,非软件截图
历史引用对齐流程示意,非软件截图。

发布日期:2026年10月8日。写了REF(CLOSE,1),不代表同一行中的所有价格都变成上一根。如果另一边仍写OPEN,比较的就是“上一根收盘与当前开盘”。本篇解决历史引用放在哪一层、同一条件的字段是否属于同一根的问题,避免公式能运行但比较对象已经错位。

函数语义按通达信官方红宝书《通达信公式-全部函数.docx》REF/REFX条目核对,日期2026年10月8日。表格和代码由本站原创;本次核对的是固定数据计算模型,未做具体客户端、手机版或跨周期调用实测。

一、REF移的是一个表达式的历史值

基本写法REF(X,A)引用A个计算周期前的X值。本文只用正整数常量1和2,先在同一周期内讨论,避免把动态参数、缺失历史和跨周期数据混在一个例子里。

PREVC:=REF(CLOSE,1);
PREVO:=REF(OPEN,1);
PREVBULL:PREVC>PREVO;

这样分别移动收盘与开盘,比较的是上一根内部的两个字段。若只将PREVC与当前OPEN比较,则表达式变成另一种条件,不能继续解释成“上一根收阳”。

二、用原创开收盘表找出错位

下面四根K线为合成数据,不对应任何股票:

根序号 OPEN CLOSE 当前CLOSE>OPEN
1 10 11 真
2 13 12 假
3 9 10 真
4 12 13 真

在第3根,上一根CLOSE为12、上一根OPEN为13,所以REF(CLOSE,1)>REF(OPEN,1)为假。但当前OPEN为9,REF(CLOSE,1)>OPEN为真。看见同样的REF和大于号并不能认定这两行表达同一问题。

在第2根也可看到相反方向的错位:上一根收盘11高于上一根开盘10,但不高于当前开盘13。建议将两根的字段写成表,再解释条件名称,避免用名称掩盖实际代码。

三、引用整条条件和逐项引用有什么关系

A:=CLOSE>OPEN;
PREV1:REF(A,1);
PREV2:REF(CLOSE,1)>REF(OPEN,1);

在这组字段有效、使用同一固定偏移、同一周期的简单样本中,PREV1和PREV2都询问上一根是否收盘高于开盘。因此第2、3、4根依次应为真、假、真。第1根缺少所需上一根数据,本篇不擅自规定软件应显示0、空值或哪种特殊值。

这种对齐关系不能不加条件地推广到任意表达式。不同偏移、跨周期调用、动态参数、初始化或特殊数据更新,可能引入额外限制。先在可核对区间对照,再讨论替换。

四、上一根、前两根和当前根要分别标清

比较当前收盘与上一根收盘可写为:

NOWVSPREV:CLOSE>REF(CLOSE,1);

比较上一根与前两根,应把两边都移到正确位置:

PREVVSOLDER:REF(CLOSE,1)>REF(CLOSE,2);

它与“当前比前两根高”不同。给变量起名时注明参照位置,例如NOW、PREV、OLDER,有助于排查;中文名字写得像昨天,也不会自动改变代码的周期位置。

五、REF的单位不是固定自然日

同一周期内的A=1表示上一根计算周期;在日线通常对应上一根可用日K线,在5分钟图是上一根5分钟K线。周末、休市或证券停牌时,不要把一根之前直接翻译成日历上的昨天。历史数据完整性、复权方式和实际周期都应写进记录。

比较窗口与历史最大值的组合已有专门文章,可看HHV窗口与排除当前值。本篇重点是字段对齐,不用改变窗口长度替代引用位置检查。

六、怎样排查“历史条件和图上不一致”

  1. 先分别输出当前CLOSE、OPEN和引用后的字段,暂时不叠加交易信号或图标。
  2. 固定至少三根都有有效字段的样本,逐根记录实际引用来源。
  3. 检查某个字段是否忘了REF,或者两边用了不同A值。
  4. 核对条件是在当前根判断,还是引用了上一根已经算好的判断结果。
  5. 将缺失历史、动态参数和跨周期调用另列问题,不用模型补出来的值冒充软件输出。
  6. 完整公式若还有特殊引用或改历史显示的语句,继续做未来函数与时间可用性检查。

官方另列REFX为引用后续周期的未来函数,不能为了让历史图“对齐”而拿它代替本篇正周期REF。即使某一行只读过去,也不能由此保证整条指标不存在其他未来信息依赖。

来源与限制

原始资料入口:通达信用户红宝书;基础结构见选股公式入门,返回教程中心。本文为公式语义学习,不提供个股建议、兼容保证或收益承诺。