想找通达信公式循环怎么写,第一件要接受的事是这门语言里没有 for、while 这类循环语句。重复计算被拆成两件事来做:一是公式按根执行,每根 K 线走一遍同样的算式;二是需要跨若干根看数据的部分,交给窗口函数与上一根引用。把这两件事分开,多数「本来要用循环」的需求都能落成可运行的代码。

下面按执行模型、三类替代写法、需要展开的情形、写不出来的边界与验证顺序展开。文中的函数名与写法以通达信 PC 版的公式系统为准,不同版本与券商定制版在函数集合上存在差异,请以你所用客户端帮助文档里的函数列表为准。

一、公式是按根算的,不是按语句顺序算的

写公式时的书写顺序只影响赋值依赖,不代表执行顺序。客户端拿到一段公式后,对图表上的每一根 K 线都完整算一遍,算到当前根时,之前所有根的结果都已经存在,随时可以用 REF 取回来。这个模型带来两个结果:一是「重复」天然存在于外层,你不需要自己写;二是你不能在一根 K 线内部做状态累积,因为每根只被访问一次。

这一点解释了为什么「通达信公式循环怎么写」这个问题的答案总是绕回函数。循环的作用无非是遍历、累加、计数、比较极值四类,而每一类在这个模型里都有对应的窗口函数,遍历本身由客户端完成了。

循环想做的事 对应的写法 窗口参数的取法
累加 N 根 SUM(X,N) 只对最近 N 根的 X 求和
计数 N 根 COUNT(条件,N) N 根里满足条件的根数
窗口极值 HHV(X,N) / LLV(X,N) 最近 N 根内的最大 / 最小值
窗口均值 MA(X,N) 最近 N 根的算术平均

二、三类替代写法

把需求对号入座之后,写法就固定下来了。三类最容易混的是累加、计数与递推,处理方式并不相同。

累加类直接用 SUM。要算最近若干个周期的成交额合计,写成 SUM(AMOUNT,5) 即可,不需要自己写加法链。窗口长度写成常数或参数,不要写成另一个变量,因为在同一根 K 线上窗口长度不能再变。

计数类用 COUNT。要统计最近一段时间里价格上穿二十日均价的次数,写成 COUNT(CROSS(CLOSE,MA(CLOSE,20)),60)。COUNT 的第一个参数是一个逐根取值只有真或假的表达式,第二个参数才是窗口。

递推类需要 REF。像指数移动平均这种「当前值依赖上一根结果」的定义,用 REF 取回上一根,再套进通项公式里。下面是一段把三件事放在一起的例子。

{累加:最近 5 根的成交额合计}
额合计:=SUM(AMOUNT,5);

{计数:最近 60 根里上穿 20 日均价的次数}
上穿次数:=COUNT(CROSS(CLOSE,MA(CLOSE,20)),60);

{递推:按通项写一段 12 周期指数移动平均的近似}
上根值:=REF(EMA(CLOSE,12),1);
递推值:=IF(上根值=0,CLOSE,(2*CLOSE+11*上根值)/13);

{窗口极值:最近 20 根的高低点}
区间高:=HHV(HIGH,20);
区间低:=LLV(LOW,20);

递推那一段要说明两件事。第一,REF(EMA(CLOSE,12),1) 取的是上一根上的 EMA 值,这是把已有函数嵌进递推的常规做法。第二,公式里禁止出现 递推值:=递推值*2; 这种自己引用自己的写法,右侧读到的是未定义内容,编译不会通过,这正是「没有循环」的直接后果。

三、窗口长度写不出来的情形要展开

有些需求里,参与计算的根数本身依赖数据,例如「从本轮区间起点算起累加成交额」。这类写法在带循环的语言里是一句 for,在这里只能靠两个替代物:一是 BARSSINCE、BARSLAST 这类定位函数,二是把次数展开成有限的几项。

定位的写法是先找到一个条件第一次成立的根,再用它换算出间距。例如要找最近一次创六十日新高到当前有多少根,可以写成 BARSLAST(HIGH=HHV(HIGH,60))。间距拿到之后,这类需求就能换成对固定窗口的间接计算。

展开写法则适用于次数很少的场景。要比较当前价与前三根收盘价,直接连写三个 REF,比想办法绕成一个窗口更清楚。

{定位:最近一次创 60 日新高距今多少根}
距高点根数:=BARSLAST(HIGH=HHV(HIGH,60));

{展开:三次比较直接写三行,可读性比硬凑窗口好}
比前一根:=CLOSE>REF(CLOSE,1);
比前两根:=CLOSE>REF(CLOSE,2);
比前三根:=CLOSE>REF(CLOSE,3);

{条件合成}
连比:=比前一根 AND 比前两根 AND 比前三根;

四、写不出来的几件事

有几类计算在这个模型里没有对应写法,遇到时要么换目标,要么换指标口径。

  • 依赖任意次迭代的收敛计算,例如把某条曲线迭代到误差小于设定值。收敛次数不定,而这里没有地方承载不定次数的状态。
  • 需要一根一根地保存中间状态的路径依赖计算,例如按规则的持仓周期模拟。公式输出的是状态序列,不是可执行的过程。
  • 递归定义且递归深度由数据决定的算式。递推只有一层是可行的,深度不定就不行。
把这类需求硬塞进窗口函数,得到的算式能编译、能画线,但算出来的东西和你原本想算的不是同一量。判断方法很简单:把窗口参数改小改大各跑一次,如果结果的量级变化方向和预期不一致,说明窗口替代并不成立。

五、验证顺序

写完一段涉及窗口或递推的算式,按下面顺序走一遍,能省掉在图上反复猜的时间。

  1. 先确认编译通过。:= 声明的中间变量不输出,: 声明的输出行才画线,两者不要混用。
  2. 把中间变量临时改成输出行,挂到副图上看取值。窗口函数在数据不足的头部几根会给出无效值,这是正常现象,不要当成错误。
  3. 用参数调档验证量级。把窗口从 5 改成 20,累加类结果应随窗口单调变化,计数类结果不应超过窗口长度。
  4. 与手算对一遍。取最后一根数据,手工按定义算一次,和副图上读到的数值比。

通达信公式循环怎么写这件事,最后落在一张对照表上:需要遍历就找窗口函数,需要积累就用 SUM 与 COUNT,需要状态就用一层 REF 递推,次数不定就换需求。公式系统里还有函数按类别整理的清单,可以对照 通达信公式编写教程 一栏;窗口参数取值不同导致结果不一致时的排查顺序,见 报错与卡顿排查 一栏;确认写出来的算式与需求一致的方法,见 指标回测与风险验证 一栏。

如果只记一句:公式里没有循环,不是缺了一个语法,而是运算模型本就不同。把需求改写成「对哪一段数据做什么运算」,通达信公式循环怎么写就不再是一个卡点,而是一次窗口参数的选择。

文中函数名与语法按通达信 PC 版公式系统的常见写法描述;不同版本与券商定制版在函数集合、参数上限与无效值处理上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式语法与计算机制,不构成任何投资建议。

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