读通达信SAR公式源码时先要拆掉一个理解偏差:把 SAR 当成趋势强弱的读数,以为数值越大趋势越强。SAR 本身是一条转向判定线,不给强弱分数:它随价格推进,按加速因子不断收窄与价格之间的距离。价格在它一侧运行时,线在另一侧跟随;价格穿线之后,线翻到对面。按强弱指标的口径去比较它的大小,读出来的结论会跑偏。

一、SAR 是转向判定线,不是趋势强弱读数

趋势强弱读数属于振荡类指标的表达方式,它把价格变化压缩成一个可横向比较的数值。转向判定线走另一条路:它不输出强弱分数,只回答两件事——线落在价格的哪一侧,以及下一根 K 线上的线位在哪里。判断相应只有两种:线保持跟随方向,或者线被价格穿透后翻转。

线围绕三个量构造。当前段的方向决定线画在价格下方还是上方;段内极值点记录这一段价格推进到达的端点;加速因子决定下一根向极值点靠拢多少。三个量定下来,下一根的线位随之确定。

把转向判定线与均线并排看,差别更容易抓住:均线取过去若干根的算术平均,转向判定线取「段内极值减去一段正在收缩的距离」。取数方式不同,穿线的时点也就不同,两者不能相互替代。

二、内置函数 SAR(N,STEP,MAXP) 的三个参数

通达信SAR公式源码的起点是内置函数 SAR。它把整套递推封装在函数内部,调用时给三个参数,按官方函数说明的口径,含义如下。

  • N:周期,参与段内极值取样的根数,决定极值点是在多长的窗口里找出来。
  • STEP:加速步长,用整数书写,写 2 对应小数 0.02,是加速因子的起步值与单次增量。
  • MAXP:加速上限,同样用整数书写,写 20 对应小数 0.2,是加速因子累加后的封顶值。

参数用整数书写、函数内部按小数参与计算,这是内置函数的固定约定,所以参数位写 0.02 与写 2 并不等价。取值前按本机版本的函数说明核对书写口径。

{SAR 内置函数调用写法}
参数:N 周期,STEP 加速步长,MAXP 加速上限
书写约定:参数写整数,函数内部按小数参与计算

SAR(4,2,20);            {步长对应 0.02,上限对应 0.2}
SARSLOW: SAR(10,4,40);  {步长对应 0.04,上限对应 0.4}

例中两条只差参数,输出线就分开了。改完参数在公式管理器里点「测试公式」,确认输出随参数变化,能排掉参数没接进计算链路的情形。

三、取值口径与参数对照表

三个参数的书写口径可以并到一张表里核对,表里同时给出每个参数在片段中的位置。

参数 含义 书写口径 片段位置
N 周期,段内极值取样的根数 整数,取正数 SAR(4,2,20) 中的 4
STEP 加速步长,加速因子的起步值与单次增量 整数,2 对应 0.02 SAR(4,2,20) 中的 2
MAXP 加速上限,加速因子累加后的封顶值 整数,20 对应 0.2 SAR(4,2,20) 中的 20

三者的作用点各不相同。N 影响极值取样窗口的宽窄;STEP 影响线每次靠拢的步子,步子越小,线与价格之间的距离拉得越开;MAXP 影响加速因子的封顶位置,封顶越早,线在后段的跟进越钝。

四、自编源码的递推结构

通达信SAR公式源码的自编版本,要还原的就是内置函数内部那一套递推。核心关系是一个式子:SAR(t+1) = SAR(t) + AF × (EP − SAR(t))。SAR(t) 是上一根的线位,EP 是当前段的极值点,AF 是加速因子,决定这一根向极值点靠拢多少。

加速因子的取值规则分三步。起步时等于步长;段内每创一次新高(上升段)或新低(下降段)累加一个步长;累加值碰到上限后不再增加。段被反转时,加速因子回到步长重新起步,SAR 归到上一段的极值点,方向随之翻转。

反转归位这一步在源码里容易写错。反转发生在价格穿透线的当天,新段的起点应当是上一段的极值点,不应取穿透当天走出的新价。规则是先判断方向有没有变,变了把线位归到上一段的极值,没变才继续递推;漏掉这一步,反转当天的线位会跳空。

五、自编写法能写到哪一步

自编写法要拆开看:哪些部分能落成单遍公式,哪些写不出来。下面这段用 IF、REF、HHV、LLV、BARSLAST 写成,赋值用 :=,注释用 {},给出参数位、方向判定、极值、加速因子与反转归位条件。

{SAR 自编写法:单遍公式能覆盖的部分}
N:=4;      {周期}
STEP:=2;   {加速步长,2 对应 0.02}
MAXP:=20;  {加速上限,20 对应 0.2}

{第一步:定方向}
NH:=BARSLAST(H=HHV(H,N));
NL:=BARSLAST(L=LLV(L,N));
DIR:=IF(NH<NL,1,-1);      {距最近一次 N 日新高更近即为上升段}

{第二步:取当前段的极值点}
EPUP:=HHV(H,N);
EPDN:=LLV(L,N);
EP:=IF(DIR=1,EPUP,EPDN);

{第三步:加速因子,从步长起步,按计数递增,到上限封顶}
CNT:=IF(DIR=1,BARSLAST(L<=EPDN),BARSLAST(H>=EPUP));
AF0:=STEP/100 + CNT*STEP/100;
AF:=IF(AF0>MAXP/100,MAXP/100,AF0);

{第四步:反转归位的判定,方向与上一根不同即为转向发生}
FLIP:=REF(DIR,1)<>DIR;
BASE:=IF(DIR=1,LLV(L,N),HHV(H,N));   {转向时应归位的上一段极值}

{以上四项均逐根可求值;线值递推 SAR(t+1)=SAR(t)+AF*(EP-SAR(t))}
{要用上一根的线值参与,单遍公式靠自引用写不出来,线值取内置输出}

这段公式全部用 := 写成,没有 : 输出行,挂到图上不画线,用途是取值核对。线值递推要用上一根的线值参与运算,而这类语言自上而下求值,同一遍里引用尚未算出的自身写不出来;需要线值时调用内置 SAR(N,STEP,MAXP),把自编的方向与参数跟它的输出逐根比对。

自编部分与内置输出的比对只覆盖方向与参数口径,不覆盖线值本身;取数顺序与支持范围以本机函数说明为准。

六、画点与画线的区别

输出语句默认把结果画成连续的线。要改成一串离散的点,做法是在输出行后面接线型修饰词,把连线方式指定为点状。修饰词的名称与可选取值以本机版本的函数说明为准,各版本对线型与颜色的写法有差异,照抄别处的写法未必能被识别。

转向判定线本身输出的是连续线,画点落在两种场合:只想看转向发生的那一根,就在那根 K 线上打点;想区分线与价格,就线画实线、另用点标记位置。两类点都要先有条件表达式,条件成立的那根才落点。

画点与画线在计算上没差别,差别只在渲染:计算链路一行不动,图上从连线变成一串点。点没出现时,先查修饰词的写法,再查落点条件在目标区间内是否成立。

七、边界:震荡区来回翻转与参数敏感性

转向判定线在单边推进的行情里表现平稳,进入震荡区间后,段的极值点被频繁改写,方向来回翻转,线在两段之间来回切换位置。这一现象来自递推结构在方向不明确时的自然结果,并非源码出错。

参数越小越敏感。N 调小,取样窗口变窄,方向判断更贴近最近几根 K 线;STEP 调小,线向极值靠拢的步子变小,线与价格的距离被拉开,单根大 K 线穿线的时点提前;MAXP 调小,加速因子更早封顶,线在后段的跟随变钝。三个参数各调一次,输出叠在同一张图上,差异可见。

数据与周期两项也要一并核对。极值取样需要至少 N 根连续 K 线,数据未更新或中间缺根的时点上,公式取不到值,输出为空属于正常;同一段逻辑在日线与分钟线上对应的取样跨度不同,参数要按周期重新核对。转向判定线给出的是线位与方向,不包含对线位之外价格走向的推断——这是通达信SAR公式源码在使用上的一条边界,越过它就会读出函数本身并不提供的信息。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。

站内还有 通达信公式编写教程 里讲赋值与输出符号、注释与函数引用,指标原理与参数 里讲递推结构与时序函数的行为,指标回测与风险验证 里讲样本选取与偏差控制,可对照查看。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。