通达信公式预警延迟不是网络慢造成的。它由几段耗时相加得到,每一段都有各自的成因与量级;不把这几段分开测,调多久都不会看到明确变化。先接受这个前提,后面的排查才有方向。

下文按耗时段落、轮询间隔、单轮计算量、数据与通道、分段测量五个部分展开。文中界面项以通达信金融终端个人版为准,券商定制版的预警设置项可能有差异。全文只讨论求值过程的时间构成,不涉及任何标的的判断。

一、延迟由几段耗时相加,需要分开量

从条件在数据上成立,到界面上出现提示,中间经过的段落可以拆成四段:

段落 决定它的因素 怎么观察
行情落地 行情推送频率、本地行情接收状态 把同一时刻的行情报价与另一处报价源对比
公式求值 公式引用的历史根数、函数个数、单只品种的计算路径 换一段简单公式做对照,看单轮耗时是否变化
等待下一个轮询点 预警的轮询间隔设置 把公式换成恒成立条件,测两次提示之间的间隔
提示发出 提示方式(弹窗、声音、列表刷新) 同一条件下换一种提示方式对比

四段是相加关系,通达信公式预警延迟等于四段之和。其中的第三段容易被当成无关项,但它的量级由设置直接给出:轮询间隔设为 3 秒时,条件成立后可能要在原地等待接近 3 秒才被判断到。这一段构成了延迟的下限。

二、刷新频率:轮询间隔决定了下限

公式预警的工作方式是按间隔轮询,而不是每次行情更新都触发一次计算。这意味着即使公式在极短的时间内算完,提示也只能落在下一个轮询点上。

轮询间隔在预警设置界面里选定。它的取值有几档可选,间隔越短,判断越密集,同时每一轮留给计算的时间也越短。这两件事是一起变化的:

  • 间隔设得比单轮计算时间短。上一轮还没算完,下一个轮询点已经到了,实际的判断间隔会被拉长到接近单轮计算时间。此时把间隔调得更短不会改善延迟,反而增加本地负担。
  • 间隔设得远大于单轮计算时间。等待时间占主导,缩短间隔能直接降低延迟,直到间隔接近单轮计算时间为止。
  • 间隔与单轮计算时间接近。这是配置的合理区间,继续调小间隔收益有限。

三档之间的关系可以用一个动作确认:先把间隔调到允许的最短档位,再逐步调长,观察两次提示之间的实际间隔。调短之后实际间隔没有变化,说明当前的瓶颈不在轮询间隔上,而在单轮计算或提示通道上;调长之后实际间隔跟着变长,说明公式与范围这一段并没有把每一轮的时间占满。

先测单轮计算时间,再定轮询间隔。测的办法是把预警条件换成一个恒成立的条件(例如 条件:C>0;),范围收到自选股,观察两次提示之间的实际时间间隔。这个数字就是轮询间隔在本地真实环境下的表现。

三、本地计算量:单只耗时乘以扫描品种数

本地计算量这一段在通达信公式预警延迟中的占比是可变的,它由两项相乘得到:单只品种的求值耗时,乘以参与扫描的品种数。两项里更容易被忽略的是前一项。

单只品种的求值耗时与公式的写法有关,具体落在三处:

写法 为什么影响耗时
往回取值的窗口长度 LLV(C,250) 与 LLV(C,20) 的比较范围不同,前者每次求值要覆盖更长的历史区间
函数个数与嵌套层数 嵌套调用会把中间结果逐层算出,层数越多,单次求值的路径越长
跨周期引用 在较短周期上引用较长周期的数据,需要在两种周期之间做对应,求值路径比同周期引用长

另一项是品种数。全市场扫描与自选股扫描的数量差别很大,两者在单轮耗时上的差距与数量大致同向变化。把预警范围从全市场收窄到自选清单,是降低单轮耗时最直接的一步,不需要改动公式。

{ 求值路径较短的写法:窗口短、常量在文首 }
N:=20;
条件:V>MA(V,N)*1.5 AND C>REF(HHV(H,N),1);

{ 求值路径较长的写法:窗口长、同一量重复计算 }
条件2:V>MA(V,250)*1.5
      AND C>REF(HHV(H,250),1)
      AND LLV(L,250)>REF(LLV(L,250),1)*0.9;

两段写法在表达的意思上不完全相同,这里只借它说明一件事:同一份逻辑,往回取的窗口越长、重复计算的次数越多,单只品种的求值耗时越长。写公式时把重复用到的中间量定义一次、后面引用变量名,可以省掉一部分重复计算。

品种数这一项有一个容易被忽略的细节:预警范围里的停牌品种与当日无行情的品种同样会进入扫描队列。这类条目没有可用行情,公式在它们上面的求值结果没有意义,但扫描动作本身仍要花费时间。把手动加入的自选清单逐项清理一遍,比在公式里加过滤条件更直接。

四、行情落地与提示通道

这一段与公式无关,但它占的份额需要单独确认,否则公式改来改去也测不出改善。

  • 行情落地。本地报价依赖行情推送。推送节奏与本地接收状态决定这一段的基础耗时,它不受公式写法影响。
  • 计算位置。预警条件在本地求值时依赖本地行情与本地历史数据;使用云端预警时,判断在服务端完成,本地只负责接收结果,两段耗时的构成不同。
  • 提示通道。弹窗、声音、列表刷新三种方式的响应速度不同。同一条件下换一种方式对比,可以判断这一段的份额。
排查顺序是从可改的段落往不可改的段落走:先收窄范围、缩短窗口,再看轮询间隔,最后才考虑行情推送。反过来做,会在一段本来就不由本地控制的地方反复尝试。

五、分段测量与判断

把四段拆开测,操作上只有三步:

  1. 测下限。预警条件换成恒成立的条件,范围收到自选清单,观察两次提示之间的实际间隔。这个数字包含轮询间隔与提示通道两段,是本地环境能达到的近似下限。
  2. 测单轮。把真实条件加回去,保持范围不变,观察间隔的变化量。变化量就是公式求值这一段在单只品种上的耗时体现。
  3. 测范围。保持条件不变,把范围从自选清单扩到全市场,再观察间隔的变化。变化量与品种数同向。
观察结果 指向 下一步
第一步的间隔已明显长于设置的轮询间隔 轮询间隔与单轮计算时间不匹配,或提示通道耗时 先确认单轮计算时间,再调间隔
第二步加回条件后间隔明显变长 公式求值这一段占比较大 缩短往回取值窗口、消除重复计算
第三步扩大范围后间隔明显变长 品种数占比较大 收窄预警范围
三步都测不出明显变化 延迟不在本地计算与范围这两段 转向行情落地与提示通道这两段

通达信公式预警延迟的排查结论,取决于这三步测出的数字,而不取决于公式的复杂程度看起来如何。最后留一个问题:把范围收窄到自选清单、把往回取值的窗口从 250 根降到 60 根之后,如果实际间隔几乎没有变化,那前面关于本地计算量的推断还站得住吗?测不出变化的那些段落,恰好就是你不需要再动的地方。

本文讲的是求值过程的时间构成与分段测量方法,不涉及具体标的的判断,预警条件输出的是一份满足表达式的清单,不含任何参与与否的结论。站内还有 选股公式与预警 里讲条件与预警对应关系的条目,公式报错与卡顿排查 里讲其它故障的对照表,指标原理与参数 里讲递推类函数的取值方式,可对照查看。

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