通达信IF函数用法看着简单:三个参数,条件成立取一个值,不成立取另一个值。真正麻烦的地方在它的参数也是序列——条件、成立时的取值、不成立时的取值这三段都按根求值,所以 IF 既能在两个数之间选,也能在两条曲线之间选。分清这两种用法,后面那些嵌套与报错就好处理了。

下面按三段结构、比较结果、嵌套写法、易踩的位置、分段函数、不该用的场合与核对清单七步讲。文中函数名、参数形式与菜单名称为通达信客户端的通用描述,不同版本与券商定制版对条件函数的种类与参数个数的支持存在差别,请以你所用客户端的实际界面与官方说明为准。

一、三段结构与求值方式

IF 的写法是三个参数依次排列,第一个是条件,第二个是条件成立时的取值,第三个是条件不成立时的取值。

{ IF 的三段结构 }
IF(条件, 成立取值, 不成立取值)
条件 —— 按根求值,结果为 1 时取第二段
成立取值 —— 可以是常数,也可以是一段表达式
不成立取值 —— 同上
{ 三段都按根求值,所以得到的是整条序列 }

三段的类型要能对上。第二段写成常数、第三段写成一条均线,公式仍能算,因为两者在本客户端里都是数值序列,常数相当于每一根取同一个值的序列。这种混用在数值层面没问题,但读公式的人容易误以为它只在对两个数做选择。

通达信IF函数用法里,条件段写什么直接决定它能用在哪。条件段可以是一段比较,也可以是一个已经赋值的中间变量。用中间变量作条件时,变量的取值只要非零就算成立,这给组合条件留出了空间:先用逻辑与把多个判断合成一个变量,再交给 IF 去分两路取值。

二、比较表达式的结果是什么

第一个参数写成比较表达式即可,不必先转换。比较表达式按根求值的结果是 1 或 0,而 IF 判定的正是「是否为非零值」。这一条决定了两种写作方式等价。

{ 两种等价写法 }
写法一:IF(C > O, 1, 0)
写法二:C > O
{ 前者让意图更清楚,后者更简短,功能上一致 }

等价这一点在嵌套时有用。当第三段又是一个 IF 时,可以省掉外层条件里不必要的转换,直接把比较表达式放进去。要注意的是省略之后公式的读法变了,条件与结果混在同一个位置,读的时候需要按参数个数去数逗号。

三、嵌套写法的可读性问题

多层 IF 嵌套可以表达分段判定,代价是括号与逗号迅速变多。三层以上的嵌套,一行里的括号数量让人难以一眼数清配对关系,改一处时容易把逗号位置放错。

嵌套层数 写法 建议
一层 直接写在一个 IF 里 保持原样,可读性没问题
两层 第三段再嵌一个 IF 写成多行,按参数对齐
三层及以上 继续内嵌 拆成中间变量,逐段命名

拆成中间变量的做法是把每一层的判定单独用冒号等号赋给一个变量,名字取成能读出含义的短语,最后再用一个 IF 把结果组合起来。行数变多,但每一行都能单独读懂,改参数时不用重新数括号。

四、几处容易踩到的地方

第一处是两个分支的取值来源不同。一个分支取价格、另一个分支取比例,公式能算,但两条曲线的量纲不同,画在同一张图上看不出统一含义。要用在不同分支上时,先让两个分支的取值落在同一量纲里。

第二处是条件里带了除以变量的运算。变量的取值出现零时,这一步在那一根没有定义,结果会出现异常值。处理办法是在条件里先把零排除,或者把分母加一个小的正数避免取零。

第三处是把赋值当成条件。条件参数的位置要放比较表达式,写成赋值符号会让语法解析走向另一种结构,编译时的提示可能不直接指向这里。写公式时把这两类符号的作用记住:冒号用于输出,冒号等号用于赋值,比较用大于小于这类符号。

第三处的典型表现是提示指向括号或逗号,而真正的问题在条件段的符号用错了。看到括号相关的提示先不要改括号,先回看条件段写的是什么。

五、用 IF 实现分段函数

分段函数是 IF 的主要用途:按参数的不同取值区间给出不同结果。写法是把区间边界写成条件,逐段回退。

{ 分段判定的结构 }
最外层判断第一段区间,成立则取第一段的结果
不成立时进入下一层,判断第二段区间
依次回退,最后一层承接剩余全部情形
{ 每一层的边界都要写清楚,避免出现两段都不覆盖的空档 }

边界的闭开关系值得单独核对。上一段写到「大于等于某值」,下一段就不能再从「大于等于」开始,否则两个条件在同一点同时成立,结果取到哪一段由嵌套顺序决定,而不是由公式的意图决定。核对办法是把边界处的取值单独算一遍,看落在哪一段。

分段判定的层数不宜过多。层数增加之后,每一层能覆盖的区间变窄,公式的通用性随之下降。一段公式里出现四层以上的嵌套时,先回头看能不能把它拆成两个独立的输出,让每一段各自承担一部分判定,这样改参数时只需回到其中一段。

六、什么时候不该用 IF

只做筛选而不做取值时,不必用 IF。要在一根 K 线上判断条件是否成立并给出标记,直接用比较表达式即可,比较结果本身就是可用的输出。套一层 IF 再输出 1 和 0,多了一层没有增加信息。

要做条件平均这类计算时,另一种写法更合适:把条件表达式当作乘数,与数值相乘,再对结果求均值。不成立的位置乘数为零,参与求和但不改变累加值。这种写法避免了 IF 在分支上取常数带来的量纲混乱。

需要在这两类写法之间选择时,问一句「我要的是取值还是筛选」就能定下来。取值用 IF,筛选用比较表达式,条件累加用乘法。

还有一类场合适合用 IF:输出的不是数值,而是在两个标记之间选择。文字标注函数的文字参数可以接受条件分支的结果,用它输出不同的标注文字,比写两条各带条件的标注语句更好维护,改动时也不会漏掉其中一条。

七、核对清单

  1. 三段参数各自是常数还是序列,含义说清楚了没有。
  2. 两个分支的取值是不是同一量纲。
  3. 条件段有没有可能取到零作分母。
  4. 嵌套在两层以上时,有没有拆成中间变量。
  5. 分段判定的边界有没有重叠或空档。
  6. 条件段用的是比较符号,还是误用了赋值符号。

条件函数只是公式语法里的一类。字段与函数的分工、按根求值的含义见 通达信新手入门问答 一栏;赋值符号与输出符号的区别见 通达信公式编写教程 一栏。把这两处基础弄明白,通达信IF函数用法剩下的部分就是参数个数与括号配对的问题了。

文中函数名、参数形式与菜单名称为通达信客户端的通用描述;不同版本与券商定制版对条件函数的种类、参数个数、边界取值的处理存在差异,具体请以你所用客户端的实际界面与官方说明为准。本文只讨论条件函数的语法与写法约定,不构成任何投资建议。

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