通达信IF函数怎么写?条件分支、嵌套顺序与选股输出错误

IF条件、分支返回值和优先级检查流程示意,非软件截图
原创分支检查流程示意,非软件截图。

发布日期:2026年10月8日。IF是返回不同数值的函数,不是写进公式后就自动过滤股票的按钮。特别是两个分支都返回非零时,看起来设置了“如果,否则”,实际输出却可能始终为真。本篇解决返回值与条件真假、嵌套优先级和无效输入保护的问题。

本文按通达信官方红宝书《通达信公式-全部函数.docx》IF、MAX等条目核对基本语义,核对日期2026年10月8日。示例由本站原创,做了固定输入的分支计算检查,未在具体客户端实测,也不宣称与其他平台或手机版本通用。

一、IF三个参数分别是什么

IF(X,A,B)在X非零时返回A,X为零时返回B。关键是它返回一个值,返回值可以是0、1,也可以是价格或自定义分类数。判断条件和返回结果不是同一个东西。

FLAG:IF(CLOSE>OPEN,1,0);

这一写法用0与1显示条件结果,便于学习。如果想根据条件输出不同价格,可以让分支返回价格,但那样输出的是数值序列,不应直接解释成选股条件。公式类型见主图、副图与条件选股区别。

二、两个分支都非零,为什么不符合过滤需求

RAW:=CLOSE>OPEN;
CLASS:IF(RAW,2,1);

这可以作为两种类别的编码,却不是“成立才输出真”的过滤规则。无论RAW真假,结果都是非零。如果把CLASS未经比较就用作真假条件,两个分支都不能表达不满足。

RAW IF(RAW,2,1) 结果=2 IF(RAW,1,0)
真 2 真 1
假 1 假 0

如果确实使用分类编码,可明确比较CLASS=2;若只需要真假,保留原条件或明确返回1/0更容易核对。这是代码语义检查,不是通过调整输出提高选股效果。

三、嵌套IF先命中哪一项,要在表里写清

用合成数值D解释优先级:D依次为-2、0、1、3、5,希望D大于2分为2类,D大于0但不大于2分为1类,其余为0类。

D:=CLOSE-OPEN;
CLASS:IF(D>2,2,IF(D>0,1,0));
输入D D>2 D>0 期望类别
-2 假 假 0
0 假 假 0
1 假 真 1
3 真 真 2
5 真 真 2

若错误地先写IF(D>0,1,IF(D>2,2,0)),D=3和5已经命中外层,结果会变成1,内层无法按原分类目标发挥作用。两个条件有包含关系时,先列出重叠区间和优先级,不是把括号配齐就完成了逻辑验证。

例子用绝对差值2只为了说明分支顺序,不适合作为不同价格证券的通用阈值,更不构成交易建议。

四、不要仅靠外层IF保证除数安全

看到类似IF(HIGH>LOW,(CLOSE-LOW)/(HIGH-LOW),0)时,容易以为另一分支必然不会计算。本篇所核对的基本IF条目只说明返回值,没有提供所有客户端的短路求值保证,因此不作这种兼容承诺。

学习时可先让分母本身可计算,再用条件表达有效性:

DEN:=MAX(HIGH-LOW,0.000001);
POS:=(CLOSE-LOW)/DEN;
OUT:IF(HIGH>LOW,POS,0);

这个保护示例只讨论通常HIGH不低于LOW的价格字段;0.000001是示意阈值,不是适用于所有数量级的通用精度标准。被保护的0输出也不代表原数据有效。若用于其他序列,应重新确定合法范围、精度和无效值标记,不能照抄到有负数语义的分母。

五、拆成中间变量,逐项检查更容易

  1. 先单独输出条件结果,确认0和非零的含义。
  2. 分别记录A和B分支的返回值,不将价格、类别码与真假混用。
  3. 列出边界值,例如D=0和D=2,区分大于与大于等于。
  4. 多层IF先画一张优先级表,重叠条件先后顺序要符合需求。
  5. 检查每个中间表达式本身是否可能出现零除、缺数据或非法输入。
  6. 在测试副本中逐层加入,遇到括号或未知字符串问题查看公式报错排查。

例如要将类别2作为单一条件输出,可把CLASS改为中间变量,再写XG:CLASS=2;。完整入门结构见条件选股公式写法;不要同时保留多条绘图输出就认定它是可直接运行的选股公式。

来源与限制

原始资料:通达信用户红宝书中的全部函数文档;分支表和保护示例为本站原创。学习路径见教程中心。本文不提供付费源码、个股买卖建议、胜率或收益承诺,语法和逻辑检查通过也不表示策略有效。