读通达信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公式源码在使用上的一条边界,越过它就会读出函数本身并不提供的信息。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 通达信公式编写教程 里讲赋值与输出符号、注释与函数引用,指标原理与参数 里讲递推结构与时序函数的行为,指标回测与风险验证 里讲样本选取与偏差控制,可对照查看。
