通达信公式引用外部数据能走到哪一步?结论放在前面:公式读的是本地行情库、板块归属与财务字段这三类数据,读不到外部网页,也读不到你自建数据库里的表。要把外部的数值或清单搬进公式,能走的路是三条:自定义数据、自定义板块文件、DLL 插件。下面按能力边界、三条路的写法与更新时机、记录表结构、对不上时的回查顺序讲清楚。写法以通达信金融终端个人版为准,不同版本在「公式管理器」的入口位置与措辞上可能有差异。

一、先划边界:通达信公式引用外部数据能到哪一步

公式的数据源在客户端内部,分三层。第一层是本地行情库,开高低收、成交量与成交额按周期落在本地,公式用 CLOSE、VOL 这类基础字段直接取。第二层是板块归属,HYBLOCK、GNBLOCK、DYBLOCK 返回的是所属行业、概念、地域的板块名,返回类型是字符串,不能直接参与加减。第三层是财务字段,按 FINANCE 的序号取,取到的是最近一期报告期的值,季报与年报的更新节奏决定这个值什么时候换。

三层之外的东西,公式取不到。外部网页上的表格、你自己维护的 CSV、第三方接口返回的数据,都不在通达信的取数路径里。所以「引用外部数据」这件事,落地的动作是把外部数据先写进通达信能读的文件,再在公式里引用这份文件。三条路的差别集中在三点:谁来写、写在哪、多久写一次。

这三类数据源里,板块与财务由客户端自己维护,公式只做读取;行情库同样是客户端写入的。外部数据的接入之所以要借道文件或插件,是因为公式没有直接发起网络请求的能力,取数的范围由客户端划定。

{板块归属:三类函数的返回值是板块名字符串,不是数值}
行业名:HYBLOCK;
概念名:GNBLOCK;
地域名:DYBLOCK;
{财务字段:按 FINANCE 的序号取,序号表以公式管理器里的函数说明为准}
财务值:FINANCE(1);
{行情基础字段:从本地库直接取}
量:VOL;
价:CLOSE;

二、第一条路:自定义数据文件的写入与取用

通达信公式引用外部数据的第一条路是自定义数据文件,它搬的是数值。客户端里维护一组数据名,每个数据名对应一列按周期排列的值,写进去之后落在 T0002 目录下,具体文件名随版本而定。公式里用 EXTDATA 之类接口按数据名或序号把它取出来,取到的是一个可以参与计算的序列。

写入周期分两类。日频写入是收盘后写一次,写进去的是当天的快照,第二根 K 线起公式才读得到;不定频写入是人工导入一次写一次,导入之前公式读到的还是上一版。两类都指向同一个事实:公式读到的是上一次写入的快照,不是实时值。数据名的命名要能自解释,写进记录表时按数据名对齐。

{引用自定义数据:按数据名或序号取,写法以公式管理器里的函数说明为准}
外部值:EXTDATA(1);
{把外部值当作条件:阈值提到参数里,方便逐次改}
条件成立:外部值>=外部阈值;
{条件成立时在副图上标记,只做展示}
标记:IF(条件成立,1,0);

自定义数据适合搬数值,不适合搬清单。评级分、外部算好的指标值、资金字段这类一个标的一个数的东西,写进自定义数据之后在公式里就是一个序列;一份几百个标的的名单写成自定义数据只是一串 0 和 1,读写都别扭,名单交给第二条路。

自定义数据是快照式的。写一次读一版,回查时先确认公式读到的是哪一版,再去比数值。

三、第二条路:自定义板块文件

板块通道搬的是清单。把外部标的清单落成 T0002\blocknew 目录下的自定义板块文件,后缀是 blk,客户端把它显示成一个自定义板块。公式里用 INBLOCK 判断某个标的是否属于这个板块,返回值 1 表示属于,0 表示不属于。

这条路的更新时机是清单驱动:名单变了就重新生成文件,再让客户端刷新板块。它不跟着行情周期走,清单没变就不需要重写。两处容易对不上:板块名与文件名要对应,改过名之后公式里那份字符串也得改;板块内容的生效要等客户端刷新完,刷新之前公式读到的还是旧名单。

{自定义板块:清单落在 T0002\blocknew 下的 blk 文件里}
{公式里判断标的归属,返回 1 表示属于}
在观察池:INBLOCK('我的观察池');
{归属类字段返回的是板块名字符串,按字符串处理}
所属行业:HYBLOCK;
{把归属当作条件用}
命中:在观察池=1;

四、第三条路:DLL 插件与信号输出

通达信公式引用外部数据的第三条路是 DLL 插件,它走的是函数调用。写法形如 “库名@函数名”(参数),通达信把参数传出去,DLL 回传一个数值序列,公式把它当普通序列使用。它接的是信号输出这一段:行情来源仍是通达信本地库,计算过程由 DLL 决定,公式只负责调用与显示。

这条路不碰交易通道。插件回传的是数值,成不成交、走哪条通道由外部程序与券商侧负责,公式本身不具备下单能力。部署上要多想一层:DLL 与客户端版本、位数要匹配,版本升级后要重新确认能否加载。调用时机是每根 K 线计算时,所以它的更新频率跟着计算走,比前两条路的快照式更新要密。

{DLL 插件:写法形如 "库名@函数名"(参数)}
{DLL 只回传数值序列,不连接交易通道}
外部信号:"MYDLL@FUNC"(CLOSE);
{转成条件用}
成立:外部信号>0;
DLL 只能来自可信来源。加载外部动态库等于把计算过程交给它,来源与版本都要记录,升级客户端之后先确认能否正常加载。

五、记录表与对不上的回查顺序

三条路各写一行记录,字段固定成四列:数据名、写入方式、更新频率、公式引用写法。记录的意义是回查时能一眼看到公式读的是哪份数据、这份数据什么时候写的。字段留空的地方,就是一次回查要补的缺口。

数据名   | 写入方式            | 更新频率       | 公式引用写法
外部评级 | 自定义数据文件      | 每交易日收盘后 | EXTDATA(1)
观察池   | blocknew 自定义板块 | 清单变化时     | INBLOCK('我的观察池')
外部信号 | DLL 插件            | 每根K线计算时  | "MYDLL@FUNC"(CLOSE)

对不上时的回查按一个顺序走:先看外部那份数据的生成时间,再看公式的取数时间,两边按时间对齐。如果外部数据是收盘后生成的,公式在当天盘中读到的是上一版;如果清单改了而客户端没有刷新,公式读到的还是旧名单。顺序固定下来,回查就不会在三条路之间来回跳。

下面这张表按现象列出对应含义与处理方式。

现象 / 提示 含义 处理
公式里自定义数据全是 0 数据名没有写入,或写入后未刷新 核对数据名与写入时间,重新写一次再看
板块判断在名单之外也成立 板块文件已生成,但客户端未刷新 刷新自定义板块,再重新计算一遍
DLL 函数加载失败 客户端版本或位数与插件不匹配 换匹配的插件版本,或退回前两条路
同一条件前后两次结果不同 两次取数落在不同的写入版本上 把写入时间与取数时间写进记录再比对

记录表要跟公式一起存。改过数据名或板块名之后,先改记录表再改公式,两边一致,回查时才不会分叉。公式文件的备份按客户端默认位置来,改动之前先导出一次。

回到开头的问题:通达信公式引用外部数据这件事,难在公式本身,还是难在外部那份数据什么时候写、公式什么时候读?把写入方式、更新频率、引用写法三列填满,再按生成时间与取数时间对齐,这条路才算走得稳。

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

站内还有 复盘方法与数据工具 的条目,公式编写教程 里讲取数写法,指标原理与参数 里讲数据源与口径,可对照查看。

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