「通达信公式需要编程基础吗」这个问题,答案要分成两半:写日常用的指标与条件,通用的编程经验不是前提;真正需要编程基础的部分存在,但它的边界比想象中窄,而且可以绕开。

下面按三件必须理解的模型、真正需要编程经验的部分、以及自我判断的方法来写。文中函数名与算式按通达信公式体系的通用写法描述,不同版本对函数与外部接口的支持情况存在差异,请以你所用客户端的帮助文档为准。

一、先说结论:通用编程经验不是前提

把通达信公式与常见的编程语言放在一起看,前者少掉了好几层东西:没有变量作用域、没有函数定义、没有内存管理、没有循环结构。它更像一张电子表格里的公式列,你写的是「这一根应该怎么算」,而不是「程序应该按什么顺序做哪些事」。

所以决定能不能上手的,不是有没有写过代码,而是能不能接受一件事:算式里的每一行,都会对每一根 K 线各执行一次。这条模型成立之后,剩下的就是把需求拆成对应的函数调用。

二、第一件事:算式是按根算的

这是最需要先建立的一层认识。通达信公式需要编程基础吗,这道门槛容易被想成语法记忆,实际的门槛在这里。写下一个 CLOSE,得到的不是一个数值,而是一整列数值,每一根 K 线各有一个。写下一个 MA(CLOSE,20),得到的同样是一整列,每一根位置上是它前面二十根收盘价的平均值。

由此推出两条实践结论。第一,算式的顺序不是执行顺序,写成几行只是为了让算式可读,客户端在每一根上都会把用到的部分算一遍。第二,两个不同位置的数值可以相减,得到的是同一天两个量的差,而不是先后两个时间点的差。想要前后对比,需要用 REF 把前一列数值整体往右挪一位。

{ 同一天的两个量之差,与前后两根之差 }
同日差:CLOSE-OPEN;
相邻差:CLOSE-REF(CLOSE,1);

这两行的差别,是从「按根计算」这个模型里直接推出来的。理解了它,后面遇到「算式写得对但结果不对」的情况,第一反应就会落在「我是不是把两个位置搞混了」上。

三、第二件事:没有循环,用函数替代

公式语言里没有 for 与 while,也不支持逐个元素的数组操作。所有需要「遍历最近若干根」的需求,都用现成函数来表达。

{ 最近五根里有几根收阳 }
阳线根数:COUNT(CLOSE>OPEN,5);
至少三根:阳线根数>=3;

COUNT 做的正是遍历:在指定的窗口内数出条件成立的根数。同类的还有求最大最小的 HHV、LLV,求累计的 SUM,求距离的 BARSLAST。把它们认全,就等于拿到了原本要用循环才能写出来的那部分能力。用之前还有一处限制要知道:窗口长度要写成常数,写成随行情变化的另一个数列会报错,这是语言本身的约束。

这套替代方案有明确的边界:它只能表达对固定窗口的统计,表达不了「一直等到某个条件出现再往下做」这类带状态的过程。遇到这类需求,要么把状态压缩成一个可以用 BARSLAST 表达的距离,要么承认它超出了公式的范围。状态如何压缩,见 公式编写教程 一栏。

四、第三件事:输出语句决定结果去哪

算式算出来的东西要有去处,去处由输出语句的写法决定。

写法 产生的结果 典型用途
用冒号输出 一条可见的曲线或数值 指标类公式,挂到图上
用冒号加等号赋值 一个中间变量,不对外显示 拆解复杂算式的中间步骤
只留一条可判定的输出 成立或不成立的判定结果 条件类公式,交给选股器执行

第一行与第三行的区别,是初学者最容易踩的一处:同一段算好的内容,输出语句写错一个字,客户端就可能把它当成一条曲线来处理,挂到条件选股里跑不出名单。判断办法很简单,在公式管理器里看这条公式被归到哪一类,类型与输出形态必须一致。

五、真正需要编程基础的部分

边界在哪里,可以按下面三条来划。

第一条是调用外部动态库。公式语言本身算不了的东西,例如读写本地文件、发起网络请求、做复杂的数据结构运算,需要通过外部动态库接入。写这类动态库要会 C 或 C++,还要会编译出与客户端位数匹配的库文件。这一条确实需要编程经验,但它属于扩展能力的范畴,不走这一步的人用不到。

第二条是把自己的一整套做法写成可执行流程。公式语言没有条件分支的嵌套结构,也没有函数封装,能表达的是逐根的数值计算。把一套包含多个阶段、每个阶段有不同规则的做法落到代码里,需要换到支持完整编程能力的环境。

第三条是批量处理与自动化。读取多个文件、按规则批量改写、自动跑一遍对照,这些属于脚本范畴的操作,与公式语言无关。

三条之外,日常会遇到的需求基本落在函数组合的范围内。判断自己属于哪一类,看需求里有没有出现「保存到文件」「按时间顺序分步」「读取外部数据源」这几个动作。通达信公式需要编程基础吗,走到这一步就能给出针对自己的答案:需求里没有这三个动作,就不需要。

还有一处介于两者之间的情形值得单独说:需要在多个品种之间做横向统计。公式语言的取数对象以当前品种为主,跨品种取值要靠特定函数或者表格数据来实现,写法比单品种复杂。若需求停在这一层,先用表格手工算一遍再决定要不要写进公式,比直接动手写更省事。

六、怎么判断自己到哪一步

通达信公式需要编程基础吗,与其估计一个时长,不如做一次能力自测。下面四道题按难度排列,能顺畅答完前三道,写日常公式就没有障碍。

  1. 把「收盘价比五天前高」写成算式。这题考的是 REF 与比较运算。
  2. 把「最近十根里有几根的量大于它的五日均量」写成算式。这题考的是把条件与 COUNT 组合起来。
  3. 把「连续三根满足同一个条件」写成算式。这题考的是多根判定的写法,写法不止一种。
  4. 把「每次满足条件之后重新计数,直到下一次满足」写成算式。这题如果答不出来,属于正常,它已经接近公式语言的表达边界。

答不出第四题不需要回头补编程课,需要的是把它换成可以表达的形式,或者接受这一步交给别的工具。上手门槛更完整的说明,见 新手入门问答 一栏。

七、边界说明

把门槛说成「要不要学编程」,容易把注意力引到无关的地方。真正需要理解的是按根计算这个模型,它由数据组织方式决定,与练习时长无关;真正需要编程经验的是外部动态库、分步流程与批量处理这三类需求,它们由需求本身决定,与语言难度无关。

还有一处边界值得写下来:公式语言能做的计算与判断都是确定性的,它算出的是给定数据下的结果,不包含对未来的推断。学它的目的是把观察口径固定下来、把步骤复现出来,与预测是两件事。这个边界在当前工具链里没有被绕过的办法。

文中函数名与输出写法按通达信公式体系的通用描述;不同版本与券商定制版对函数范围、外部动态库接口与公式类型的支持情况存在差异,具体请以你所用客户端的实际界面与帮助文档为准。本文只讨论学习门槛与语言机制,不构成任何投资建议。

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