通达信涨停选股公式最容易写错的一处,是把涨停当成固定的 10%。把条件写成「涨幅超过 10%」之后,条件确实能跑通,屏幕上也会出现一批结果,但条件命中的范围与实际的涨停范围并不重合:涨跌幅限制分档的品种会被漏掉或被多算。这一处口径没定下来,后面的参数与复核都在错的基础上做。
下面按「幅度分档、幅度怎么表达、涨停价与取整、三种条件写法、参数外置、误判场景、搭建顺序」七步讲。全文只讨论条件的写法与计算口径,不涉及任何方向判断,也不针对具体品种;文中的涨跌幅规则为公开的交易所价格计算规则,写法以通达信公式编辑器内附的函数说明为准。
一、涨停判定写不成一个固定百分比
通达信涨停选股公式里的幅度按板块与风险警示状态分档,公开规则里可以枚举出这几档:主板为10%,主板上的风险警示股为5%,创业板与科创板为20%,北交所为30%。另外,部分板块的新股在上市初期的一段时间内不设涨跌幅限制。分档存在,条件里就不能只写一个数字。
后果在两个方向上都成立。二十个百分点这一档的品种,价格走到十个百分点时就会被按十个百分点写的条件命中,条件给出的结果里混进了并未涨停的位置;五个百分点这一档的品种,价格走到5%时已经封住,但按十个百分点写出来的条件不会命中,这一批从头到尾都不会出现在结果里。
二、适用幅度怎么在公式里表达
公式里没有可以直接读取的「板块」或「涨跌幅限制」字段,幅度要自己表达出来。可行的做法有两条,各有取舍。
| 做法 | 怎么落地 | 取舍 |
|---|---|---|
| 按代码段枚举 | 用代码前缀把品种分成几组,每组配一个幅度常量 | 一次跑完,但代码段规则变动时要回来改公式 |
| 幅度做成参数 | 把幅度放进公式参数表,按档分批跑 | 公式稳定不用动,但结果要分几次跑再合并 |
按代码段枚举的写法需要先把规则核实清楚。不同市场、不同板块的代码段规则经过多次调整,建议以你所用的数据源里实际的代码归属为准,把归属表核对一遍之后再把前缀写进条件。写成参数的做法代价更低,代价是结果需要人工合并,合并时要在记录里标明这一次跑的是哪一档。
三、涨停价的计算与取整
通达信涨停选股公式里的涨停价按前一个交易日的收盘价乘以「一加上适用幅度」得到,结果按四舍五入取至价格最小变动单位,也就是小数点后两位。取整这一步是公开规则的一部分,漏掉它,比较就会在边界上出偏差。
{ 涨停价与比较的写法 }
前收 := REF(CLOSE, 1);
涨停价 := 前收 * (1 + 幅度);
容差 := 涨停价 * 0.002;
收于涨停 := CLOSE >= 涨停价 - 容差;
触及涨停 := HIGH >= 涨停价 - 容差;
{ 容差用来吸收取整带来的不到一分钱的差 }
容差的取值要克制。它只负责吸收取整误差,量级应当停在分位附近;把容差放大到1%以上,会把「接近但并未触及涨停价」的位置也纳进结果,条件就不再是涨停条件了。核对容差是否合适,把涨停价与容差一起输出到副图,看命中的位置与最低价、最高价的关系是否落在预期的边界上。
另一种做法是把取整直接写进公式,先对涨停价做一次保留两位的处理,再做比较。两种做法结果接近,区别在于公式里多一道运算、少一个需要解释的容差参数。哪一条都行,公式里只用其中一种,不要两处都写。
四、三种条件的写法
同样是「涨停」,在条件里可以落成三种判定。三者的区别是拿哪一根价格去与涨停价比较。
| 判定 | 比较对象 | 命中的范围 |
|---|---|---|
| 触及涨停 | 当根最高价 | 盘中曾经达到涨停价的位置都计入 |
| 收于涨停 | 当根收盘价 | 只计入收盘时仍停在涨停价的位置 |
| 一字形态 | 开盘、最高、最低、收盘四价 | 只计入全天没有离开涨停价的位置 |
三种写法写在同一段代码里不会冲突,但用哪一种是必须先定的。用触及涨停写出来的结果,与用收于涨停写出来的结果,是两批不同的位置,混在同一个统计里做比较没有意义。写之前先把要回答的问题说清楚:问的是「盘中是否到达过」,还是「收盘是否停在上面」,还是「全天是否没有打开过」。
五、参数外置与分段复核
把幅度、容差、区间长度这类取值放进公式参数表,比写死在公式主体里更好核对。参数外置之后,同一段代码可以用不同的参数跑不同的品种范围,公式主体不用改。
{ 参数表建议的四项 }
幅度 —— 按这一档的涨跌幅限制取值
容差 —— 只覆盖取整误差,量级停在分位
上市天数下限 —— 过滤掉上市时间过短的品种
数据根数下限 —— 过滤掉历史数据不足、取不到前收盘的位置
复核的第一段只输出涨停价,不写比较。把涨停价与客户端里同一位置的涨幅数值对照,两边一致说明幅度与取整都对上了。这一段确认之后再往下写比较,出错时就不用回头怀疑价格本身。
六、误判场景逐条对照
| 场景 | 为什么会偏 | 怎么核 |
|---|---|---|
| 跨过除权除息日 | 前收盘价被调整,与公式取到的历史价口径不一致 | 按复权口径取数后重算一遍,看两边是否一致 |
| 风险警示状态变化 | 适配的幅度档发生变化 | 把这一段时期的品种范围单独跑一次 |
| 停牌后复牌 | 比较基准不是紧邻的前一根,而是停牌前最后一个交易日 | 查出该位置的数据缺口根数,确认基准是哪一根 |
| 历史数据未补充完整 | REF 取不到前收盘,条件落在空值上 | 先补齐本地数据,再重跑条件 |
| 上市初期无涨跌幅限制 | 这一段时间里没有涨停价这个概念 | 用上市天数下限把它排除在范围之外 |
这张表里前两项的核对动作是一样的:把口径统一之后重算,看结果是否回到预期。后三项属于范围内该被排除的位置,靠过滤条件处理,不需要在比较逻辑里改。判断某个偏差点属于哪一类,先看它是不是处在数据缺口或规则变更的位置上。
七、按这个顺序搭条件
通达信涨停选股公式的搭建顺序可以固定下来:先定幅度与容差,再算涨停价,再做三种比较里的选一种,最后补上市天数与数据根数两个过滤器。按这个顺序走,每一段都能单独输出、单独核对,出问题时能定位到具体是哪一段。
顺序反过来会多花时间。先把比较与过滤写在一起再回头查,条件不命中时无法判断是幅度取错、容差过宽,还是被过滤器挡掉了。分开写之后的排查路径是明确的:涨停价对不上改幅度,命中范围偏大改容差,结果数量偏少查过滤器。
条件本身只是筛选与统计口径的练习,条件成立与否不代表任何方向性的结论,也不构成任何操作依据。相关的排查顺序见 公式报错与卡顿排查 一栏,结果口径的验证思路见 指标回测与风险验证 一栏;本栏 通达信选股公式与预警 里另外几篇讲的是预警设置与条件拆解,与本篇的幅度口径可以对读。
文中涨跌幅分档为公开交易规则的一般性描述,具体以交易所现行规则与所用数据源的字段口径为准;通达信不同版本与券商定制版对函数支持范围、参数表写法与比较运算的处理存在差异,请以你所用版本公式编辑器内附的函数说明为准。本文只讨论条件写法与计算口径,不构成任何投资建议。
