通达信排序指标公式与条件选股公式在公式管理器里属于两类,差别落在输出上:排序指标给每一只标的算出一个可以比大小的数值,行情表按这个数值排座次;条件选股只回答成立或不成立,给出的是一份名单。把两类混在一起写,会在选择公式类型那一步就走偏,后面怎么调都不对。
下面按两类公式的差别、输出要求、建立步骤、挂载与使用、结果的干扰源五层讲。文中菜单名与公式类型名称取自通达信客户端的通用描述,不同版本与券商定制版对排序入口的位置与类型命名可能存在差别,请以你所用客户端的实际界面与帮助文档为准。
一、两类公式的差别落在输出形态上
条件选股公式的输出是一个布尔序列,非零表示那一根满足条件。排序指标公式的输出是一条连续数值序列,只有最后一个值会参与排序,前面的值只用于绘图与自检。
| 对比项 | 条件选股 | 排序指标 |
|---|---|---|
| 输出内容 | 成立或不成立 | 可比较大小的数值 |
| 在图上呈现 | 标记出现在成立的根上 | 一条连续的曲线 |
| 使用位置 | 选股与预警 | 行情表的排序依据 |
| 需要几行输出 | 一行条件算式即可 | 一条最终数值表达式 |
最后一行是建立时最容易出错的地方。排序指标只需要一条最终表达式,如果中间变量与最终表达式都用冒号写成输出项,末端的取值可能来自其中一条中间项,排序结果会与你以为的表达式不一致。
判断末端的取值来自哪一条,办法是看图上出现了几条曲线。带冒号的输出项都会在图上出现,中间变量不会。写完表达式之后数一下图上的曲线条数,再对着源码数一遍冒号,数量对不上就说明有一条该写成冒号等号的被写成了冒号。这个核对动作在调试阶段做一次,能省下后面许多次「排序结果为什么不对」的排查。
二、输出要求:一个数,可比较
通达信排序指标公式的输出必须是单一数值,而且这个数值在不同标的之间横向可比。可比有两层含义:量纲相同、取值范围相近。
量纲相同指的是所有标的算出来的都是同一种单位的量。用价格做输出,各标的的数值直接反映价位高低;用百分比做输出,反映的是相对幅度。两种输出都能排序,但排出来的座次含义完全不同,一个偏向高价标的,一个偏向变动幅度大的标的。
挑哪一种量纲,取决于后面拿这份座次做什么。打算按价位分组观察,就用价格类的输出;打算比较不同标的之间的强弱变化,就用比值类的输出,把价格量级的影响先去掉。两种口径不能混在同一张表里比较,因为座次的含义不一样。
取值范围相近指的是数值不要出现过大的数量级差异。用成交额做输出时,不同标的之间的差距可能跨好几个数量级,排序结果会被少数几个值牵走,中间那一段标的的相对顺序挤在一起,看不出差别。遇到这种情况,先做对数处理或先除以一个基准,把区间压回来。
{ 排序指标的最小结构:一条最终表达式 }
{ 中间量用冒号等号,不进入输出列表 }
基准:=MA(C,20);
偏离:=IF(基准=0, 0, (C-基准)/基准);
{ 最终输出用冒号,作为排序依据 }
偏离度:偏离;
三、建立一条排序指标的步骤
第一步,明确排序依据是什么。想按强弱排就取涨幅或涨速类的量,想按量能排就取成交量或换手率类的量,想按形态位置排就取价格与均线的距离类的量。依据决定输出的量纲。
第二步,在公式管理器里新建公式,类型选择排序指标。类型选错会让公式在行情表的排序列表里不出现,这和公式内容写得对不对没有关系。
第三步,为通达信排序指标公式写输出表达式。中间计算过程都用冒号等号赋值,只留最终一条带冒号的输出。如果需要在图上核对中间量,可以临时把某一条中间量也改成冒号,核对完再改回去。
这一步的核对可以放到收盘之后做。盘中最后一根还在变化,曲线末端的值跟着刷新,看着像是不稳定;切到已收盘的那一根再看,值就固定了。这一步的目的不是判断数值对不对,而是确认这条曲线有没有正常产出值、值域有没有落在合理范围内。
第四步,先挂到一张单图上看曲线。这一步看三件事:曲线有没有值、值域大概落在哪个区间、有没有出现特别大的尖峰。尖峰出现在停牌或数据缺失的位置,需要在表达式里做兜底。
第五步,编译并保存,回到行情表里挂载。
四、挂载与使用
排序指标的挂载位置在行情表上,不在K线图上。在行情表的右键菜单里找到与排序或自定义排序相关的选项,把自编指标挂上去,行情表会多出一列按这个数值排列的座次。
挂载之后有两个细节要确认。第一,排序是按最后一根的值算的,盘中最后一根还在变化,座次会跟着刷新;要看定格的结果,得在收盘之后再看。第二,行情表里显示的标的范围由它自己的过滤条件决定,如果表里只筛了一部分标的,排序结果也只在那一部分里成立。
五、排序结果的三处干扰源
第一处是数据未更新。行情表的日线数据如果没有下载到最新,最后一根的值来自更早的日期,排序算的是旧数据上的座次。核对方法是把表里的日期列调出来看一眼。
第二处是停牌与长期无成交。停牌期间价格不变,某些量能类的输出会变成零或保持前值,排序时这些标的会集中挤在某一段位置,把中段挤乱。处理办法是在表达式里加一个成交量的下限条件,把无成交的根剔除掉。
还有一层与数据范围有关的问题:行情表里显示的是哪一段日期的数据。如果表里的日期列显示的是上一交易日,而排序依据取的是最后一根,那么排出来的座次对应的是上一交易日收盘时的状态,与当日盘中无关。看座次之前先看日期列,这一步花不了几秒,却能避免把旧数据的排序结果当成当下的状态。
{ 给输出加一层兜底,避免无成交与除零 }
有效:=V>0 AND 基准>0;
{ 无效的根给一个中性值,不参与极端排名 }
偏离度:IF(有效, 偏离, 0);
第三处是口径不一致。同一张表里,有的标的输出的是未做缩放的量,有的因为数据缺失走了兜底分支输出的是零,两者的量纲虽然相同,含义却不同。排出来的座次看起来正常,其实混合了两种口径。做横向比较之前,先确认参与排序的每一个值都走的是同一条计算路径。
排序指标适合当筛选的入口,把范围从全市场收窄到一段,再接后续的判断;它本身只提供一个顺序,不包含对后面走势的说明。指标取数口径的写法见 通达信指标原理与参数 一栏;排序之后进入观察与记录环节的处理,见 复盘方法与数据工具 一栏。
下一步动作可以这样安排:先把通达信排序指标公式里想要排序的那一个量写成一条不带条件的输出,挂到行情表上确认曲线有值且值域正常,再加兜底条件把停牌与无成交的根剔除,最后才把过滤范围与记录字段定下来。这三步按顺序走完,再回头调参数。
文中菜单名与公式类型名称为通达信客户端的通用描述;不同版本与券商定制版对排序入口位置、类型命名与输出限制存在差异,具体请以你所用客户端的实际界面与帮助文档为准。本文只讨论公式写法与取数口径,不构成任何投资建议。
