一句用中文说出来的筛选需求,落到客户端里要经过四段:把句子拆成可判定的条件、为每个条件挑函数、把函数组装成公式并测试、把公式接到条件选股与预警上。通达信选股公式编写卡在哪一段,结果就不一样:条件没拆清,函数挑不出来;函数挑错,公式测试报错;公式通过了但拦在选股器里没有输出,问题出在第四段的挂载与数据上。下面按这四段逐段写清入口、写法与排查顺序。

一、四段流程的总体顺序

四段的顺序不能颠倒。条件拆解定的是「要判定什么」,函数选型定的是「拿什么算」,公式组装与测试定的是「写得对不对」,条件选股与预警挂载定的是「跑得起来吗」。后一段的问题常以症状的形式出现在前一段,例如选股器没有输出,容易被误判成条件写错,实际原因在数据是否下载、公式类型是否选对。

{四段的输入与输出}
第一段 条件拆解      输入:中文需求    输出:可判定条件清单
第二段 函数选型      输入:条件清单    输出:每条条件对应的函数式
第三段 组装与测试    输入:函数式      输出:测试通过的公式
第四段 选股与预警    输入:通过的公式  输出:条件选股结果 / 预警触发

把每段的输出写下来再进下一段,能省掉一轮返工。中文需求里的「连续」「创出」「上穿」这类说法不属于可判定条件,先落成周期数、区间、方向,才进得了第二段。

二、第一段:把需求拆成可判定的条件

拆解的目标是把一句话变成若干条能算出成立或不成立的条件。拆的时候给每条条件补三个要素:字段、周期、比较关系。字段指的是用哪个行情数据,收盘价、最高价、成交量、换手率都属于字段;周期指的是回看多少根 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 这类字段时,取值随客户端的复权设置变化;除权日前后,未复权数据上会出现缺口,涉及跨除权日的统计条件的结果会受影响。判断方法是在同一条公式上切换复权口径各跑一次,结果一致说明当前条件对复权不敏感。

数据与范围这两处也值得单独看。执行范围设成自选股时,公式只跑在自选里的标的上,与全市场执行的结果不同;执行周期设成日线时,分钟数据未下载不影响结果,反之则要先补齐。把范围与周期写在排查清单里,定位就落在具体那一格。

这段通达信选股公式编写走完四段,落点分别是条件清单、函数表达式、测试通过的公式、以及选股与预警里的挂载配置。四段的输入输出写下来,之后遇到输出为空,就按顺序从公式类型、本地数据、复权设置、参数区间这四处往回查。这段通达信选股公式编写的工作量落在前两段,函数写错会拦在测试那一步,测试之后的问题都在挂载与数据侧。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。

站内还有 选股公式与预警 的条目,新手入门问答 里讲公式管理器的基本操作,公式编写教程 里讲函数与语法,可对照查看。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。