通达信CROSS函数写成 CROSS(A,B),在源码里占的位置不长,但它和「A 大于 B」这个写法之间隔着一层语义差别。这一层差别决定了公式输出的是单根脉冲还是整段状态,也决定了同一段源码在图上和在选股结果里是不是一个样子。
下面把 CROSS 的成立条件拆开,与几种常见替代写法逐条对照,再给一个可以自己跑的验证办法。全文只讲函数语义与写法差异,不评价任何策略,也不给出操作结论。文中函数名与菜单路径以通达信金融终端个人版为参照,版本号可在「帮助 → 关于」中核对。
一、CROSS 的成立条件只有一根 K 线
CROSS(A,B) 的意思是 A 从下方穿越 B。它成立的条件是两条:前一根 K 线上 A 不大于 B,当前这根 K 线上 A 大于 B。两个条件同时满足的那一根,CROSS 返回真,其余情况下返回假。
把这句话写成等价的展开式,就是 A>B AND REF(A,1)<=REF(B,1)。这个展开式是理解 CROSS 的关键,因为它把「穿越」这个动作拆成了可以逐根检查的两个比较。
{ 三种写法,输出应逐根一致 }
M1:=MA(CLOSE,5);
M2:=MA(CLOSE,20);
C1:CROSS(M1,M2); { 标准写法 }
C2:M1>M2 AND REF(M1,1)<=REF(M2,1); { 等价展开 }
C3:IF(C1,1,0)-IF(C2,1,0); { 差值为 0 表示两者一致 }
把 C1 与 C2 同时挂在副图上,两条线应当完全重合。若第二条写法里漏掉了后半句,只写 M1>M2,输出的形状会完全不同:它从穿越那根开始一直为真,直到反向穿越为止。
二、与「大于」比较式的差别
这个差别在图上表现为形状,在用途上表现为信号数量。CROSS 给出的是一根 K 线宽的脉冲,M1 大于 M2 给出的是整段持续的状态。两种输出都正确,但它们回答的问题不一样:前者回答「哪一根发生了穿越」,后者回答「当前是否处于 M1 在上的状态」。
| 写法 | 成立范围 | 输出形状 |
|---|---|---|
CROSS(A,B) |
仅穿越那一根 | 单根脉冲 |
A>B |
穿越之后持续成立 | 连续区段 |
A>B AND REF(A,1)<=REF(B,1) |
与 CROSS 相同 | 单根脉冲 |
用法上的直接后果在条件选股与预警里。用状态型写法做条件,从穿越那根之后的每一根都满足条件,选出的结果会包含同一段行情的多个日期;用脉冲型写法,只有穿越那根满足。两种写法选出的条数差别,用同一个品种与同一段区间跑一次就能看到。通达信CROSS函数在这一处的表现,是理解两类写法分工的入口。
三、震荡区间的重复脉冲
脉冲型写法有一个需要留意的地方:两条线在相近位置反复交叉时,每一根穿越都会产生一次输出。价格在一个窄区间内来回摆动,均线之间的差值也跟着正负切换,图上就会出现一串密集的小标记。
这不是 CROSS 写错了,是这段行情本身的特征被如实记录了下来。判断要不要处理它,先看标记的密度:把显示区间拉长,数一数两次相邻标记之间隔了多少根 K 线。间隔普遍很短,说明这段行情里两条线反复交错。
处理的方式有两类。一类是要求穿越时两条线之间已经有足够距离,把差值过小的穿越排除掉;另一类是要求穿越之前两条线已经保持一段时间的相对位置,也就是下一节说的收紧条件。两类做法都只改动判断式,不动其他部分。
重复脉冲的数量可以直接量化。做法是把输出用一个累加写法累计起来,看它在区间内的总数,再除以区间长度,得到的比值反映穿越发生的频繁程度。把它与收紧之后的结果并排放,能看出收紧条件削掉了多少短促交错。这一步不需要额外工具,公式里加一行累加即可。
{ 统计区间内穿越发生的次数 }
M1:=MA(CLOSE,5);
M2:=MA(CLOSE,20);
C1:=CROSS(M1,M2);
CISHU:SUM(IF(C1,1,0),0); { 从第一根累计到现在 }
四、把条件收紧的写法
收紧条件的思路是给穿越加一个前提:在穿越发生之前,两条线已经维持了足够长时间的相反位置。通达信提供了用于这一类判断的函数,写法是在 CROSS 前加上一个周期参数,含义是要求前若干个周期内 A 一直不大于 B。函数的准确名称与参数顺序以你所用版本的函数说明为准。
{ 收紧条件的一种写法:要求穿越前维持了 N 根 }
M1:=MA(CLOSE,5);
M2:=MA(CLOSE,20);
LONGCROSS(M1,M2,5);
{ 等价的手工写法,便于看清条件构成 }
EVERY(M1<=M2,5) AND M1>M2;
手工写法把条件摊得开一些:前五根上 M1 都不大于 M2,当前这根 M1 大于 M2。两种写法的输出在多数根上一致,差别出现在正好等于的边界上,用哪一种取决于你要不要把这些边界算进条件。
收紧之后还有一处要核对:收紧周期与显示范围的关系。周期取 10,意味着条件要看过去十根;把显示范围缩小到十根以内,区间左端那几根上的条件无法成立,输出会比实际情况少。核对办法是把显示范围往左扩一段,看左端是否有新的标记出现。
五、验证写法是否符合预期
验证的办法在前面已经出现过:把目标写法与它的等价展开式放在同一张副图上,两条输出应当完全重合。这个办法的优点是它不依赖对行情的判断,只看两种写法是否描述了同一件事。
还有一处值得单独核对:涉及等于的情形。CROSS 的前置条件写的是「不大于」,也就是把相等算了进去;如果一段行情里两条线长时间贴合在一起,穿越那一根的位置会受这个边界定义影响。要看清这一点,可以构造一段人为的价格序列验证,也可以在图上去找两条线重合的区段,把鼠标逐根移过去看输出在哪一根翻转。
通达信CROSS函数的写法差异,归结起来是三件事:它描述的是穿越那一刻而不是穿越之后的状态;穿越在震荡区间会反复发生;收紧条件只能改变判断式,不能改变行情本身的交错程度。把这三点写进公式的注释里,过一段时间回头看源码时不必重新推导一遍。
还有一处验证值得做:把用 CROSS 写出来的条件与用状态型写法写出的条件,分别放到条件选股里跑同一段区间,比较选出的条数。两者条数之比,反映的就是这段区间里穿越之后持续成立的根数。这个比值随区间不同而变化,把它记下来,有助于理解同一个条件在不同写法下为什么给出不同数量的结果。
通达信CROSS函数在源码里只占一行,但它涉及的语义有三层:成立的范围、边界上的取值定义、以及与其他写法的等价关系。三层都确认过之后,再把它放进更长的条件式里,对这段代码的理解就不会停在它表示上穿这个层面。
站内还有几处可以对照查看:公式编写与语法函数 一栏按类别讲各函数的写法,量价形态与信号拆解 一栏讲信号条件怎么拆成可验证的描述,公式报错与卡顿排查 一栏讲编译提示的对照。三处侧重点不同,按需要挑一处看即可。
文中出现的函数名、参数写法和菜单路径以通达信金融终端个人版为参照;不同版本的函数表收词与参数顺序可能存在差异,请以你所用版本的「帮助 → 关于」与公式编辑器内的函数说明为准。
