通达信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输出也不代表原数据有效。若用于其他序列,应重新确定合法范围、精度和无效值标记,不能照抄到有负数语义的分母。
五、拆成中间变量,逐项检查更容易
- 先单独输出条件结果,确认0和非零的含义。
- 分别记录A和B分支的返回值,不将价格、类别码与真假混用。
- 列出边界值,例如D=0和D=2,区分大于与大于等于。
- 多层IF先画一张优先级表,重叠条件先后顺序要符合需求。
- 检查每个中间表达式本身是否可能出现零除、缺数据或非法输入。
- 在测试副本中逐层加入,遇到括号或未知字符串问题查看公式报错排查。
例如要将类别2作为单一条件输出,可把CLASS改为中间变量,再写XG:CLASS=2;。完整入门结构见条件选股公式写法;不要同时保留多条绘图输出就认定它是可直接运行的选股公式。
来源与限制
原始资料:通达信用户红宝书中的全部函数文档;分支表和保护示例为本站原创。学习路径见教程中心。本文不提供付费源码、个股买卖建议、胜率或收益承诺,语法和逻辑检查通过也不表示策略有效。




