一句用中文说出来的筛选需求,落到客户端里要经过四段:把句子拆成可判定的条件、为每个条件挑函数、把函数组装成公式并测试、把公式接到条件选股与预警上。通达信选股公式编写卡在哪一段,结果就不一样:条件没拆清,函数挑不出来;函数挑错,公式测试报错;公式通过了但拦在选股器里没有输出,问题出在第四段的挂载与数据上。下面按这四段逐段写清入口、写法与排查顺序。
一、四段流程的总体顺序
四段的顺序不能颠倒。条件拆解定的是「要判定什么」,函数选型定的是「拿什么算」,公式组装与测试定的是「写得对不对」,条件选股与预警挂载定的是「跑得起来吗」。后一段的问题常以症状的形式出现在前一段,例如选股器没有输出,容易被误判成条件写错,实际原因在数据是否下载、公式类型是否选对。
{四段的输入与输出}
第一段 条件拆解 输入:中文需求 输出:可判定条件清单
第二段 函数选型 输入:条件清单 输出:每条条件对应的函数式
第三段 组装与测试 输入:函数式 输出:测试通过的公式
第四段 选股与预警 输入:通过的公式 输出:条件选股结果 / 预警触发
把每段的输出写下来再进下一段,能省掉一轮返工。中文需求里的「连续」「创出」「上穿」这类说法不属于可判定条件,先落成周期数、区间、方向,才进得了第二段。
二、第一段:把需求拆成可判定的条件
拆解的目标是把一句话变成若干条能算出成立或不成立的条件。拆的时候给每条条件补三个要素:字段、周期、比较关系。字段指的是用哪个行情数据,收盘价、最高价、成交量、换手率都属于字段;周期指的是回看多少根 K 线;比较关系指的是大于、小于、等于还是穿越。
以「近 20 根 K 线内创出区间新高」这一类说法为例,拆出来的三要素是:字段取最高价,周期取 20,比较关系取等于区间内最大值。三要素齐了,第二段就有函数可以对照。缺了周期,函数里的参数就没有取值;缺了比较关系,写出来的是数值而不是判定。
复合条件要标注连接关系。两条条件之间是同时成立还是任一条成立,写法上分别对应 AND 与 OR;同时成立的条件越多,筛选出来的数量越少。把连接关系写在条件清单里,组装时不会漏掉括号。
{条件清单的拆解示例}
中文需求:近 20 根 K 线内创出区间新高,且当日成交量大于 5 日均量的 2 倍
条件 1 字段:最高价 HIGH 周期:20 关系:等于区间最大值
条件 2 字段:成交量 VOL 周期:5 关系:大于均量的 2 倍
连接 条件 1 AND 条件 2
三、第二段:按条件挑函数
函数的作用是把条件清单里的三要素翻成表达式。周期类条件对应统计函数,MA、HHV、LLV、SUM 属于这一类,参数给出统计窗口;比较类条件对应 REF 与 CROSS,前者取某个字段在若干周期之前的值,后者判定两条线是否发生穿越;区间边界类条件用 MAX、MIN 与 ABS。
| 条件类型 | 可用函数 | 写法示例 |
|---|---|---|
| 取当前或历史值 | REF | REF(CLOSE,1) 取前一根 K 线的收盘价 |
| 区间最高 / 最低 | HHV、LLV | HHV(HIGH,20) 取 20 周期内最高价的最大值 |
| 均线与平均 | MA、EMA | MA(VOL,5) 取 5 周期成交量均值 |
| 穿越判定 | CROSS | CROSS(CLOSE,MA(CLOSE,20)) 收盘价上穿 20 周期均线 |
| 数值边界 | MAX、MIN、ABS | ABS(REF(CLOSE,1)-OPEN) 取前收与开盘价之差 |
HHV 与 REF 的配合在区间条件里用得较多。要判断当前最高价是否等于最近 20 根 K 线的最高值,写成 HIGH = HHV(HIGH,20);要判断是否上穿了前 20 根 K 线构成的区间上沿,写成 CROSS(CLOSE,REF(HHV(HIGH,20),1)),外层的 REF 把区间后移一根,避免把当天的高点算进被穿越的区间里。
CROSS 的判定口径要留意:它比较的是上一根与当前这两根 K 线上两条线的前后关系,前一根在前、当前在后才算穿越。用 CROSS 写条件时,两条线本身都已是表达式,不要再套一层比较。
四、第三段:组装公式并在公式管理器里测试
组装是把条件表达式按连接关系拼成一条完整公式,输出用冒号后的变量名给出。条件选股公式的输出是一串成立与否的判断值,公式末尾不需要画线语句。把上一步的两条条件拼起来,就得到一条可直接贴进编辑器的公式。
{示例:条件拆解 → 函数选型 → 组装}
{条件 1:最高价等于 20 周期内最高价}
C1 := HIGH = HHV(HIGH,20);
{条件 2:当日成交量大于 5 日均量的 2 倍}
C2 := VOL > 2 * MA(VOL,5);
{组装:两条条件同时成立}
XG : C1 AND C2;
更通用的写法是把周期做成可调参数,避免每次改动都进编辑器。参数在公式头部声明,写在变量名与冒号之后,给出默认值、最小值、最大值与步长,挂到选股器或预警条件里可以直接改。
{加入可调参数的写法,N 与 K 在参数面板里改}
{参数声明:N 默认 20,K 默认 2}
C1 := HIGH = HHV(HIGH,N);
C2 := VOL > K * MA(VOL,5);
XG : C1 AND C2;
测试走公式管理器的「测试公式」按钮,它检查语法与函数名,把不认识的函数、括号不配对、变量未定义这三类问题拦下来。测试通过只说明公式能被解析,不代表筛选逻辑与需求一致。逻辑是否一致,用参数代入后看输出的判断值来核对:条件成立的位置输出非零,不成立的位置输出零。
五、公式类型的区别:条件选股公式与技术指标
公式管理器把公式按类型分开存放,条件选股公式与技术指标是其中两类。技术指标类的输出画在图上,主图与副图各自取不同的输出方式,一条公式可以有多条输出线;条件选股公式的输出是判断结果,不在图上画线,仅供条件选股与预警调用。
| 对比项 | 技术指标 | 条件选股公式 |
|---|---|---|
| 输出用途 | 画线,挂主图或副图 | 返回判断值,供选股与预警调用 |
| 输出条数 | 可多条,按主图副图区分 | 取判断结果,末行输出为条件 |
| 能否用于选股器 | 不直接可选,需另建选股公式 | 可以,条件选股入口按类型列出 |
| 参数面板 | 改参数后重算画线 | 改参数后重新执行筛选 |
两类公式在编辑器里的语法同源,函数通用。差别落在输出与调用位置:从技术指标里复制一段判断语句到条件选股公式,语法测试同样能过,输出的解释不同。建公式时在新建对话框里选定类型,建完之后类型不便直接改,需要按目标类型重新新建一条。
六、第四段:条件选股与预警的挂载
挂载分两个入口。条件选股入口在「条件选股」功能里,从公式列表中按公式类型找到那条公式,设定执行范围与参数,执行后给出筛选结果。预警设置入口在预警功能里,新建一条预警条件,公式部分选择条件选股类公式,再设置监控范围与刷新方式。
刷新频率决定公式多久重新执行一次。预警条件里的刷新周期与行情数据的更新节奏相关,取值越小执行越密集,对机器与数据的要求也越高。监控范围决定公式跑在哪些标的上,全市场范围与自选范围的数据量差别较大。
{第四段的挂载步骤}
条件选股:
1. 打开「条件选股」功能
2. 在公式列表里按类型找到条件选股公式
3. 设定执行范围与参数值
4. 执行,查看结果列表
预警挂载:
1. 打开预警设置,新建预警条件
2. 公式选择条件选股类公式,填参数
3. 设定监控范围与刷新周期
4. 启用后查看预警列表输出
七、选不出结果时的排查顺序
公式测试通过、选股器里却没有输出,按下面五处依次排查。顺序按排查成本排,前四处各查一次即可定位,走完还没结果再看参数本身。
| 排查点 | 现象 | 处理 |
|---|---|---|
| 公式类型 | 公式列表里找不到,或选股入口不列出 | 确认公式建在「条件选股公式」类型下 |
| 本地数据 | 测试通过但执行结果为空 | 用数据下载功能补齐所选周期与范围的历史数据 |
| 复权设置 | 同一条公式在不同复权设置下的结果不一致 | 核对公式里对价格字段的取值方式,统一复权口径后重跑 |
| 参数区间 | 条件取值偏严,输出为空或极少 | 放宽参数区间后重跑,观察输出数量的变化 |
| 输出写法 | 输出被当作画线值 | 确认末行输出为条件表达式,去掉画线相关写法 |
复权这一处的表现有具体差别。公式里直接写 CLOSE、HIGH 这类字段时,取值随客户端的复权设置变化;除权日前后,未复权数据上会出现缺口,涉及跨除权日的统计条件的结果会受影响。判断方法是在同一条公式上切换复权口径各跑一次,结果一致说明当前条件对复权不敏感。
数据与范围这两处也值得单独看。执行范围设成自选股时,公式只跑在自选里的标的上,与全市场执行的结果不同;执行周期设成日线时,分钟数据未下载不影响结果,反之则要先补齐。把范围与周期写在排查清单里,定位就落在具体那一格。
这段通达信选股公式编写走完四段,落点分别是条件清单、函数表达式、测试通过的公式、以及选股与预警里的挂载配置。四段的输入输出写下来,之后遇到输出为空,就按顺序从公式类型、本地数据、复权设置、参数区间这四处往回查。这段通达信选股公式编写的工作量落在前两段,函数写错会拦在测试那一步,测试之后的问题都在挂载与数据侧。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
