条件本身写得对,不等于组合起来的结果对。通达信选股条件组合的麻烦点就在这里:三条各自都测通的条件,用 AND 连起来跑出来的一批结果,可能既不是想要的交集,也解释不清多出来的那部分从哪来。问题基本不在条件本身,而在顺序、括号和收窄的分级上。下面按「先分清组合的两层含义,再谈顺序,最后落到核对」这个次序走一遍。
一、组合的两层含义:同时成立与分别成立
把多个条件放进同一条公式,先要分清你要的是哪一种关系。
第一种是同时满足,也就是逻辑与。写成 A AND B,含义是这一根 K 线上 A 与 B 都取真值,结果集是两者命中集合的交集,只会比原来小。
第二种是分别成立,也就是逻辑或。写成 A OR B,含义是两者中任意一个为真即可,结果集是两个命中集合的并集,会比任何一个都大。
两层以上的组合就必须加括号。公式语言的优先级里,AND 排在 OR 之前,这跟加减乘除不是一套规则:算术里乘除先于加减,逻辑里与先于或。三个条件写成 A OR B AND C,编辑器按 A OR (B AND C) 读,你的预期若停在 (A OR B) AND C,两边算出来的东西就不是一回事。
A OR B AND C { 编辑器读作 A OR (B AND C) }
(A OR B) AND C { 加上括号才是先并集后交集 }
A AND (B OR C) { 与上式不同,注意括号挪的位置 }
AND 与 OR 之间的层次用括号补全,再对照预期。这一条不改动任何函数,只是把默认优先级显式化。二、顺序为什么重要:落点在排查顺序
多个条件组合之后,命中集合会随着条件增加而收窄。三条条件依次取交集,结果集是上一级的子集,一层比一层小。顺序不影响最终的交集大小,交换前后位置,交集是同一个。
顺序影响的是另一件事:出问题时你从哪一步开始查。宽条件指覆盖广、算法简单的取值类条件,例如 C>0 这种排除无成交 K 线的判定;窄条件指判断严、命中少的判定类条件,例如用 BARSLAST 统计自上一次某个事件以来经过的根数。把宽条件放在前面,你能先确认数据本身读到了、范围没跑偏;把窄条件放在前面,第一步就可能得到接近空集的结果,而后你分不清是判断太严,还是数据缺失。
这里的落点是排查顺序,不是哪种写法更优。同一组条件换一个排列,跑出来的结果一样,但中间断层出现在哪一级不一样。写公式时把中间量按宽的在前、窄的在后排列,等于给自己留了一条从宽到窄的定位路径。
三、逐级收窄的写法:中间量单独输出
把复合条件拆成若干中间量,是通达信选股条件组合里最实用的一步。中间量用 := 定义,它承担取值或判断,但不进入输出清单;每个中间量另外单独用一次 : 输出,就能把它的命中原样看到。先看单条命中多少根 K 线,再把它们用 AND 连起来,出问题时一眼知道是哪一级收窄过度。
MA5:=MA(C,5);
MA20:=MA(C,20);
量增:=V>MA(V,5);
趋势向上:=MA5>MA20;
站上均线:=C>MA5;
近月高点:=HHV(H,20);
{ 三个中间量各自用 : 输出一次,先看单条命中 }
趋势向上:趋势向上;
站上均线:站上均线;
近月高点:近月高点;
{ 组合:趋势向上 与 站上均线 同时成立,再并入量增 }
组合:(趋势向上 AND 站上均线) AND 量增;
这段里的三个中间量各自输出一次,挂到副图就能看到每一根 K 线上它取真还是取假。近月高点用的是 HHV(H,20),包含当前这根,把它当成”突破前高”用会与预期不同;要表达突破前 20 个周期的高点,写成 C>REF(HHV(H,20),1),由外层 REF 把窗口推到上一根为止。
四、结果集核对:包含关系必须成立
做完通达信选股条件组合之后,把结果集分解回单条件结果集核对。核对的核心是一条包含关系:组合结果必须是每个单条件结果的子集。三条条件取交集,组合命中的每一根 K 线都应当同时落在三个单条件的命中集合里。
这条包含关系不成立,说明组合里混进了别的条件,或者某个中间量写错了。三种情形:
- 组合结果里有 K 线不在某个单条件结果里。检查那个单条件的表达式是否被改动过,或中间量名是否与外层输出线名重复。
- 单条件结果该有的 K 线在组合里全丢了。检查组合行里连接条件时是否漏了项,或括号把某一项圈到了不该圈的分支里。
- 组合结果与某个单条件结果完全相同。检查其余条件是否没参与运算,例如被括号吞掉,或写成了常量真值。
逐根比对的方法:把每个单条件用 : 输出成一条线挂到副图,再把组合也输出成一条线,同一张副图上对齐看。组合线取真值的位置,必须同时是三个单条件线都取真值的位置。哪一根不满足,就把光标停在那一根上逐个读三条线的真假,问题就锁在具体那一层。
五、四类顺序误用
组合写错,落点常在这四处。下表左列是写法特征,右两列是后果与核对办法。
| 误用写法 | 后果 | 核对办法 |
|---|---|---|
| 把判断条件写在取值条件之前 | 取值还没算完就参与判断,判断读到的是空值或上一级的残留值 | 把取值类中间量排在前面,逐级确认每级输入已就位 |
组合里混入带 REF 的滞后量却不核对根数 |
滞后量把窗口整体推后若干根,命中集合整体平移,与其它条件错位 | 单独输出该滞后量,数它相对原始量偏移了几根,再确认窗口是否对齐 |
| 中间量名与外层输出线名重复 | 编译能过,但语义变了,组合行引用到的可能是被改写的那一个名字 | 把中间量统一加前缀,与输出线名区分开,输出清单里逐条比对 |
用 OR 连接时忘了括号 |
优先级跑偏,实际算成 A OR (B AND C),范围比预期大 |
把每处 OR 的两边用括号圈起来,再对照预期 |
这四处共同的核对手段只有一个:把中间量单独输出,看它自己的命中与组合后的命中差在哪一级。表格里第四类容易被忽略,因为它编译不报错,只是把结果集悄悄放大。
六、落地到条件选股与预警
组合写成一条通路后,落到两个入口。条件选股在「功能 → 选股器 → 条件选股」里执行,选公式、定范围、选周期。周期与数据范围决定结果集的边界:同一组条件在日线与周线上跑出的结果不同,范围含不含停牌、复权怎么设,也会改变命中。核对结果集时把周期与范围记下来,换一个范围就要重新比一遍。
预警是另一类用法,它在盘中按公式逐根计算,条件成立时给一个提示。预警只做提示,不做方向判断,它回答的是”这一根上条件成立没有”。预警公式的写法与条件选股里一致,差别只在运行时段与数据依赖,分钟级数据没下载时盘中计算会受影响。
七、组合的推荐排查次序
三级的次序排下来:
- 先看单条命中。把每个中间量单独
:输出一次,逐个确认命中根数落在合理区间,数据本身读到了。 - 再看两两交集。任取两个条件用
AND连一次,看交集是不是两个单条件结果的子集,且不为空集。 - 最后看整体。把全部条件合成一行,对照包含关系,逐根比对组合线与各单条件线的真假。
这个次序的道理是:错在单条上,就只在单条上改;错在交集上,就把组合行拆开重连;错在整体上,多半是括号或中间量命名的问题。每一级都能独立验证。
回到开头那句判断,通达信选股条件组合的本质,是把一次排查拆成若干可验证的步骤。顺带记一条:AND 与 OR 混用时,把每处连接的两边都用括号显式圈起来,让优先级落在纸面上。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内相关内容:通达信选股公式与预警(条件筛选、预警用法与结果复核的合集)、通达信公式编写教程(语法、函数与调试)、通达信复盘方法(结果归档与逐根核对)。
