同一个「创新高」,写进通达信公式里能分出好几种写法,跑出来的信号却落在不同的 K 线上。差别出在比较对象与时间窗这两处设置上。把「通达信创新高选股公式」当作一个可计算的条件来拆,先要回答跟谁比、比多久、用哪个价,其次才是函数怎么摆、窗口参数怎么填。
一、先定三件事:跟谁比、比多久、用哪个价
把「创新高」变成条件之前,有三处要先落地。落不了地,函数写得再对,信号落点也是飘的。
跟谁比。参照系有两种:一是自身历史极值,取自上市以来或某一段足够长的区间;二是前一窗口极值,只在最近 N 根 K 线里找最大。参照系一换,同一根 K 线的判定可以相反——长历史里没破的位置,在短窗口里可能已经站在顶上了。
比多久。窗口参数 N 决定「新」到什么程度。N 取 20,比的是近 20 根;N 取 120,比的是更长的一段。N 越小,条件越容易被满足,落在窗口极值上的根数也越多;N 越大,成立所需的相对高度就越高,信号根数随之收窄。
用哪个价。收盘价与最高价不是一回事。用 CLOSE 判定,信号落在收盘站上极值的那一根;用 HIGH 判定,盘中触及极值即可成立,信号会提前到更早的那一根上。
这三件事定完,公式的骨架才算清。接下来才是分辨几种写法之间的差别。
二、三种口径的写法差别
三种口径写出来长得像,判定却不同,这正是「通达信创新高选股公式」容易写偏的地方。先把三种写法摆在一起:
{窗口参数,可改}
N:=20;
{第一种:当根是否落在窗口极值上}
XG1: C = HHV(C,N);
{第二种:突破此前窗口极值}
XG2: C > REF(HHV(C,N),1);
{第三种:改用最高价判定}
XG3: H > REF(HHV(H,N),1);
第一种。HHV(C,N) 求最近 N 根收盘价里的最大值。当根收盘等于这个最大值,说明当根就站在极值上。这里用的是等号,比的是「是不是这一段里的顶」,而不是「有没有越过此前的高点」。
第二种。REF(X,1) 取上一根的值。REF(HHV(C,N),1) 先算前一根的 N 根窗口最大值,再让当根收盘与它比。等号换成了大于号,判定从「落在极值上」变成「越过此前极值」。两种写法差的是一根 K 线:第一种在创出极值的那根成立,第二种在极值被越过的后一根成立。
第三种。把两式里的 C 换成 H。用最高价判定,盘中触及即可成立,信号落点比用收盘价提前。用哪个价,取决于想把信号卡在盘中触及,还是卡在收盘确认。同一段行情,两种价的信号集合会错开若干根。
等号写法还有一处容易忽略的地方:窗口内出现两个相同的高点时,后一个同样满足。行情连续走平,信号会出现在不止一根上。这类连续成立属于窗口极值本身的特征,读信号之前要心里有数。
三、数据口径对判定的影响
历史极值不是固定的数,它跟着复权口径走。
前复权把历史价格按后来的除权除息往回折算,前收口径则用未复权的原始价。同一根 K 线,在前复权序列里算出的 HHV(C,N),与前收序列里算出的值可以不同。差别来自中间那几次除权除息:折算之后,除权日之前的价格被整体平移,窗口极值跟着变。
后果是,一条在默认设置下成立的创新高条件,换到另一种复权设置后,同一根 K 线的判定可能翻过来。核对信号之前,要先确认自己看的是哪一种口径。
通达信里可以在数据设置里选复权方式(菜单名称在不同版本里可能略有差异,以本机为准)。选完之后回看同一时段,把两种口径下的极值各算一遍、逐根对照,口径的影响就摆在眼前了。
四、失效情形
条件成立有一个默认前提:窗口里的数据足够且可比。四种情形会让「通达信创新高选股公式」的这个前提失效,写公式和读信号时都要先考虑进去。
新股上市初期,历史数据根数不足。HHV(C,N) 在有效根数小于 N 时,按通达信的取数规则只对有数据的部分求值。此时算出的极值样本偏少,条件成立与否的参考价值有限。写公式时可以先加一层根数过滤:
XG4: C > REF(HHV(C,N),1) AND BARSCOUNT(C) > N;
BARSCOUNT(C) 给出一根 K 线上累计的有效数据根数,用它挡掉上市初期样本不足的那一段。
停牌复牌造成的跳空。停牌期间没有 K 线,复牌当根与停牌前那根在序列里被排成相邻,窗口的「N 根」在时间上并不连续,极值比较跨过了一段没有成交的时间。
除权当日前收不可比。除权当天,前一日收盘价与当日价格不在同一口径上。用未复权数据算极值,会把除权缺口当成价格变化,于是条件在缺口那一根上给出误导性的成立。
涨跌幅限制下缺少换手。价格被限制在当日涨跌幅上限附近时,极值附近的成交很少,用最高价判定的条件可能在几乎没有成交的位置成立。涨跌幅限制的倍数属于交易所规则,主板、创业板、科创板各不相同,具体取值以交易所公告为准。
五、落地到预警
条件写完,落到两个地方用:条件选股与预警设置。
条件选股里要选周期与数据范围。周期决定 K 线粒度,日线与周线算出的 HHV(C,N),窗口跨越的时间长度相差数倍。数据范围决定在哪些品种、哪一段时间上跑。两者都选完,条件才在目标区间上生效。选错了周期,窗口的物理含义就跟着变。
预警设置只做提示。条件触发时给一条通知,通知本身不携带方向判断,也不说明触发之后怎么走。把预警当作「某个条件在某根 K 线上成立了」的标记来用,它不承担结论的作用。
菜单路径在不同版本里可能略有差异,以本机为准。
这里要分清一件事:条件选股是批量筛出符合条件的根,预警是盯住已选定的对象等条件触发。两者的数据范围与刷新方式不同,混着用会得到对不上的结果集。
六、复核办法
公式对不对,用图看比用文字看快。
把条件挂到副图上,先给信号一条输出线:
XG: C > REF(HHV(C,N),1);
XG 是一条输出线,值为 1 表示当根成立,为 0 表示不成立。副图上它画成高低跳动的折线,成立的那根跳到 1。
再打开数据窗口,把同一时段的最高价、收盘价逐根列出来,找到副图跳到 1 的那几根,逐个核对:那一根的收盘价,是不是确实大于此前 N 根窗口的最大值。
接着换一个 N,把 20 改成 60,重跑一遍,看信号落在哪几根上。同一段数据,两个 N 给出的信号集合不同,这是窗口参数本身的作用,不是数据出错。
复核时若发现信号落在意料之外的根上,排查顺序是:先查窗口参数与复权设置,再查该根之前的有效数据根数。这三处对不上,信号就解释不通。
口径与参数都核对完之后,再回看一遍你比对的是 20 根还是 60 根,别把两种 N 的结果混在一张表里读。
七、边界声明
创新高是一个相对量,它只回答「当前值与窗口极值的大小关系」,不回答别的。窗口参数 N、比对的价、复权口径,这三处任何一个变动,成立的根都会跟着变。
把公式读成一条条件,边界就清楚了:它给出的是信号落点,本身不构成结论。
把「通达信创新高选股公式」拆到这一步,剩下的动作是回到本机的数据窗口里,逐根核对信号落点,再确认这个 N 与这个复权口径是否匹配你手头的品种范围。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
