通达信公式卡顿这件事,判断顺序比解决办法重要。装了十几条自编公式之后翻页变慢,第一反应常常是电脑不行或者软件有问题,于是去清缓存、加内存、重装客户端,折腾一圈回到原点。实际负载集中在三个可枚举的位置:每根 K 线的重复计算、每次刷新的数据取用、每张图上的图形绘制。这三处的代价差别很大,减负的先后顺序也应该不同。

这篇按「先定位负载落在哪一层,再按代价从大到小摘」的顺序讲。文中目录名、文件名与菜单项按通达信 PC 版常见形态描述,不同版本与券商定制版在目录结构与菜单位置上有差异,具体以本机客户端的显示为准。

一、先分清是算得慢、画得慢,还是扫得慢

表现都是「卡」,成因分三层,混在一起讨论就找不到下手的地方。

层次 典型现象 判断动作
计算层 切到某只票才卡,同一只票切走就不卡 把那几张副图逐个关掉,一次关一张
渲染层 不切票也卡,拖动 K 线、缩放时间轴时掉帧 把公式切到 NODRAW 或暂时停用,看拖动手感是否恢复
扫描层 打开选股、预警、条件预警之后整机变慢 关掉预警与后台任务,看是否立刻恢复

第一层是公式在算,第二层是图画不出来,第三层是软件在扫全市场。三层对应的减负手段完全不同:计算层要改公式,渲染层要减图形元素,扫描层要收窄范围或者把任务挪到盘后。先定位再动手,比一次性全套优化省时间。

二、副图与输出线:每根 K 都要重算一次

通达信公式卡顿里代价最大的一项,是副图上叠了太多条指标。原因不在公式本身写得复杂,而在计算次数:一个副图里挂了五条公式,图上每新增一根 K 线,这五条都要在新的一根上把历史窗口重算一遍;切到下一只票,整套重算再走一次。

输出线的数量也直接吃资源。每一条不带 NODRAW 的输出都要参与绘制,四条线比一条线的绘制量多出三份。想看数值但不需要画线的中间量,加 NODRAW 只保留计算,不起笔。这一条改动成本最低,先把这一层做完,再看还剩多少卡。

{ 只看不画的中间量,加 NODRAW 减少绘制 }
M5:=MA(CLOSE,5);
M20:=MA(CLOSE,20);
DIFV:=M5-M20,NODRAW;          { 参与计算,但不在图上起笔 }
RATIO:=DIFV/M20*100,NODRAW;

副图的数量要按用途留,不是按数量留。同一张 K 线图上,一个量能类副图加一个趋势类副图,已经覆盖了看盘时需要对照的两类信息;再往上叠,重复的是同一件事。判断某张副图该不该留,问一句:关掉它,今天做的判断会变吗。答案是否,它就是可以摘掉的那张。

三、跨周期引用的代价,写在取数环节

跨周期引用是通达信公式卡顿里最容易被忽略的一项,因为它在源码上只多了一小段字符,在运行时却多了一次取数。写法形如 "MACD.DIF#WEEK",在日线周期里取周线的值;写法上还有一条硬限制:只能从较短周期引用较长周期,反方向不允许。

{ 跨周期引用:日线图里取周线与月线的值 }
WDIF:="MACD.DIF#WEEK"(12,26,9);
MDIF:="MACD.DIF#MONTH"(12,26,9);

每多一个这样的引用,公式在每一根 K 上都要去另一个周期的数据里定位一次。一条副图里放三五个跨周期取值,再叠上几条均线,单根 K 的计算量就上去了。切换标的时最明显:本地有周线数据,取数是读取;本地缺这段数据,客户端会去补,等待时间就落在这里。

跨周期取值的口径本身,在 指标原理与参数 一栏里有专门几篇讲取值边界。处理办法不是不用跨周期,而是把它从「每根 K 都要的东西」里挪出去。看周线状态时单独开一张副图,只在需要时切过去;常驻在盘面上的副图,尽量用同周期数据算。这一条与「同花顺那边能不能用」无关,纯粹是取数次数的问题。

四、每根 K 都执行的绘图语句

DRAWTEXT、DRAWICON、STICKLINE 这类语句,只要条件成立就执行一次。条件写得松,比如「收盘价高于五日均线」,那么一段上涨里几乎每根 K 都要画一个图标或写一段文字,图形元素的堆积速度与 K 线数量同阶。

{ 标注密度降下来的写法:同一方向两次标注之间至少隔 30 根 }
COND:=CROSS(CLOSE,MA(CLOSE,20));
DRAWICON(FILTER(COND,30),LOW*0.99,1);
{ 或者只在最后一根上标,避免历史段反复重画 }
DRAWICON(COND AND ISLASTBAR,HIGH*1.01,2);

FILTER(COND,N) 的作用是:条件成立后 N 根之内不再重复触发。它对图形元素数量的抑制很直接,代价是丢掉间隔内的重复提示。这两个取舍没有对错,取决于你要看「每一次」还是「每一段」。

还有一类写法会放大绘制量:把 DRAWTEXT 的纵坐标写成随价格浮动的表达式,图形每次刷新都要重新定位。这不是大问题,但在缩放到很密的 K 线区间时会明显拖慢拖动的手感。

五、公式库的规模与切换标的时的扫描

公式存得多,本身也吃时间。自编公式的库文件在 T0002 目录下:PriGS.dat 存公式主体,PriCS.dat 存参数,PriLoc.dat 存公式名索引。客户端启动与切换标的时会读这套索引,库里条目越多,读取与匹配的时间就越长。

这一项的判据不是「有多少条」,而是「有多少条从没被调用过」。在公式管理器里按类型过一遍列表,把三个月没打开过、也没有挂到任何版面上的条目挑出来,导出一份备份之后删掉。删之前先导出,是因为自编公式的删除没有回收站,删掉就只能靠备份文件恢复。

另一处常被算进公式卡顿、实际属于数据层:本地分钟数据与日线数据的体积。vipdoc 目录下堆积的历史分钟线会拖慢第一次打开图表的速度,清理方式是按年归档,不必整目录清空。数据层的慢与公式层的慢要分开处理,混在一起会白删东西。

六、减负的顺序:先摘,再改,最后才是重写

按代价与成本的比值排,顺序如下。前两步不动源码,做完就能看出效果。

  1. 关掉不看的副图。一次关一张,每关一张切一次标的,看等待时间有没有变化。这一步定位的是「哪张副图在拖」。
  2. 给中间量加 NODRAW。只影响绘制,不影响计算,改完重挂一次即可。
  3. 收窄标注密度。给 DRAWICON、DRAWTEXT 加 FILTER,或者只在末端标注。
  4. 挪走跨周期取值。常驻副图用同周期数据,跨周期的看盘需求单独开一张图。
  5. 清理长期不用的公式条目。先导出备份,再删。
  6. 改算法。把重复计算抽成中间量,用 := 赋值一次、后面反复引用,避免同一段表达式在多个输出里各算一遍。

第六步才是「优化公式」,前五步做完仍然卡,再动这一层。反过来的做法——先改源码、先换函数——常常是在一个不是瓶颈的地方使劲。

七、怎么确认改对了

验证要用对照,不要凭手感。做三次对比,每次只改一个变量。

第一次:同一只票,改前与改后。记下从点开标到图面完全刷出来的等待感受,用「数到几」这种方式记,比如翻页后默数到三才出图,改完数到一。感受类指标不精确,但同一人同一天内对比,方向是可靠的。

第二次:同一张图,换一只票。如果只有个别标的卡,问题更可能在数据层而不是公式层——那几只票的本地数据不全,客户端在补。

第三次:把公式切到系统自带指标。自带指标也慢,方向就不在公式上。这一步是分水岭,能用一次就排掉一大半怀疑。

改完公式记得点「测试公式」再保存。语法通过但输出区报错的情形,在加了 FILTER 或跨周期引用之后会出现,报错内容与函数参数个数、引用写法有关,按提示逐条对,不要靠猜。

这套顺序解决的是「公式带来的附加负载」,解决不了客户端本身的启动慢、行情刷新延迟、硬盘读写瓶颈。这几类问题与公式无关,把公式全删了也不会改善,判断方法是切到系统自带指标再看一次。

站内 公式报错与卡顿排查 一栏里,另有几篇讲报错与选股范围的排查;选股环节单独变慢,看的是扫描范围与条件顺序,不是副图负载,那一条路在那几篇里。公式文件的目录结构与备份还原,见 公式安装与导入。

下一步动作只有一个:打开公式管理器,把当前版面上挂着的副图数一遍,从最不常看的那张开始关。先做这一件事,比装一堆清理工具实在。

本文只作技术研究口径,内容为公式负载的定位方法与减负顺序,不涉及对任何标的的判断,也不提供操作层面的建议。目录名、文件名与菜单路径以本机版本的实际显示为准,不同版本与券商定制版可能存在差异。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。