早上打开软件,副图上某根 K 线的信号在;下午再打开,同一根 K 线的那个位置空了。这不是偶发故障,也不是软件不稳定。通达信公式信号时有时无,背后是一套可以推演的机制:公式读的是本地数据,而本地数据会在几个确定时点被重新计算,计算结果也就跟着重排。
下面按触发点、变化范围、与漂移的分界、验证顺序、处理边界展开。文中提到的目录与菜单(T0002、PriGS.dat、盘后数据下载)以通达信金融终端个人版为准,券商定制版可能不同。全文只讨论数据与计算这一层,不涉及具体标的的判断。
一、同一个信号,两次打开不一样
先把现象描述准确。”时有时无”至少包含三种互不相同的表现,混在一起讨论会得出错误结论。
- 同一根历史 K 线,两次打开读数不同:说明该位置被重新计算过。这是本文的重点。
- 信号只在最右边一根出现,收盘后消失:最右侧那根 K 线尚未收盘,价格字段还在变动,参与判断的值不等于收盘后的值。
- 信号在一只品种上有、另一只品种上没有:两只品种的本地数据完整度不同,参与计算的 K 线根数不同,这不是”时有时无”,是数据差异。
分清楚是哪一种,后面的处理路径才成立。第二类的处理在第四节,第三类的处理是补数据,只有第一类需要往后查重算机制。
二、重算的四个触发点
本地数据不会自己变化,它在你做完下面某个动作之后被重算。这四个动作都在常规使用中出现,不需要刻意去做,这也是通达信公式信号时有时无会在某一天突然出现的原因。
| 触发动作 | 入口 | 重算的内容 |
|---|---|---|
| 盘后数据下载 | 系统 → 盘后数据下载 | 补齐或覆盖本地历史 K 线,缺失的根被填上 |
| 除权除息数据更新 | 随盘后数据一起更新 | 复权价整体重算,价格字段取值改变 |
| 切换复权方式 | K 线图上的复权设置 | 价格序列在不复权、前复权、后复权之间切换 |
| 重新登录行情或切换主站 | 登录界面与主站设置 | 本地历史数据被来自不同服务器的数据刷新 |
此外还有一种不经过数据的重算:修改公式源码后重新编译。这属于自己主动改动,容易识别。
三、重算之后,哪些量会变
重算影响的是数值,不是全部数值。把”会变”与”不会变”分开,能省掉一部分无用的核对。
对价格序列做等比缩放的复权处理,不改变均线之间的大小关系。MA5 大于 MA10 这类比较,在前复权与后复权之间结论一致,因为两条均线被同一个比例缩放。基于差值的判断同理:EMA(C,12) 减 EMA(C,26) 得到的差值会按比例缩放,但正负号不变。所以”均线依次排列””两条线谁在上方”这类形态判断,在复权方式切换后一般保持稳定。
会变的是三类:
- 与价格数值相关的判断:例如价格高于某个固定数值、整数关口、固定价差。复权切换后价格水平整体改变,这类条件是否成立会变。
- 除权日附近的比值:不复权数据里,除权当日与前一日之间会出现缺口,用
C/REF(C,1)计算的涨跌幅在这一天会得到一个异常值。使用复权数据后缺口被填上,同一根上的涨跌幅是另一个数。 - 参与计算的 K 线根数变化:补数据后,原先缺失的根被填上,长周期统计量(如 60 根均线)在数据起点附近的值随之改变。
把这三类与前面”不会变”的部分分开,核对时就知道该看哪些位置。用形态类条件写的公式,重算之后信号位置保持不变;用价格阈值或涨幅写的公式,重算之后信号位置可能整体移动。
四、漂移与重算的分界
两件事都表现为”值变了”,分界线只有一个:变化是由你的操作引起的,还是由时间推进引起的。
重算 触发条件:执行了补数据 / 更新除权 / 切换复权 / 重连行情 变化时点:动作完成之后一次性发生 之后表现:稳定,不再变化,直到下一次触发 漂移(未来函数) 触发条件:新增 K 线,无需任何操作 变化时点:每一次数据推进都可能发生 之后表现:只要还在推进,历史值就一直可能被改写 未定型(最右一根) 触发条件:盘中行情推送 变化时点:持续变化,收盘后停止 之后表现:收盘后固定,此后不再变化
用一句话概括:需要你做点什么才变的,是重算;你什么都没做它也会变的,是公式读到了后面的数据。这句话可以直接用在任何一次判断上。
五、三种情形的现象对照
把三种情形并排放,是判断通达信公式信号时有时无时用到的主线索。先确定变化范围,再确定变化是否由自己的操作引起,两列信息合起来就能定位到具体来源。
| 情形 | 变化范围 | 识别方法 | 处理方向 |
|---|---|---|---|
| 数据重算 | 整段区间同时变化 | 做一次盘后数据下载或切换复权,对比读数 | 固定数据与复权设置,在确定的设置下使用 |
| 未来函数 | 历史上多处位置,且持续变化 | 隔一段时间再读一次,仍在变 | 源码里的 ZIG、PEAK 类调用,删除或替换 |
| 最右一根未定型 | 只有最右侧一根 | 左侧历史 K 线读数稳定 | 把判断移到已收盘的 K 线上 |
六、验证:按时间顺序走五步
- 记录基线:选定品种、周期、复权方式,用十字光标读出三个历史位置上每个输出的数值,写下来。
- 不动,等一段:什么都不做,隔一段时间重新打开软件再读一次同样三个位置。读数变了,说明与你的操作无关,查源码里的未来函数。
- 做一次复权切换:在三个复权方式之间各读一次。三次读数彼此不同、但每种设置下稳定,说明差异来自数据口径而非公式。
- 补一次数据:执行一次盘后数据下载,再读一次。变化集中在数据起点附近,说明是补齐 K 线造成。
- 看最右一根:确认变化是否只发生在最右侧。是这一类的话,前面四步都会显示左侧稳定。
七、可以固定下来的情形
属于重算的那一类,处理方式是让计算基准固定下来。具体做法有三条:把复权方式固定成一种并在使用中保持;在判断条件里避开价格数值与固定阈值,改用形态关系;对于必须用到涨跌幅的条件,确认数据包含完整的除权信息,避免在缺口位置产生异常值。
属于最右一根未定型的那一类,处理方式是改变判断的取值位置。把参与判断的价格字段往后挪一根,用已经收盘的那一根做基准,盘中刷新就不再影响读数。通达信里对应的写法是用 REF 把取值延后:
{ 盘中会反复变化:用到当根的收盘价 }
当根条件:=C>REF(C,1);
{ 改用上一根:基准已收盘,盘中刷新不再影响 }
延后条件:=REF(C,1)>REF(C,2);
{ 注意:延后只是换一根取值,不等于消除未来函数的影响 }
八、无法消除的情形
含 ZIG、PEAK、TROUGH、PEAKBARS、TROUGHBARS、ZIGBARS 这类调用的公式,其历史标记会随新数据改写,这一点来自算法本身:转折点要等后面走出来才能确认。改参数、换周期、调整写法都不能绕开,因为要让函数给出转折点,就必须让它看后面的数据。
另有一种间接情形:公式本身不含未来函数,但引用了另一个含未来函数的指标。这种情况下变化出现在被引用的部分,容易误判成本公式的问题。排查时要把引用的链条一起看,通达信的函数集里没有区分这一点,需要自己核对源码。
九、边界
通达信公式信号时有时无这件事,能处理的部分和不能处理的部分分得很清楚:数据口径与判断位置是可以固定的,未来函数的时间性质是固定的对立面。分不清这两者的时候,人会倾向于反复重装软件、反复重装公式,而这两件事对上面任何一种情形都不产生作用——软件里没有可以关掉重算的开关,也没有可以关闭未来函数特性的选项。
因此判断顺序建议固定成一句话:先确认变化范围,再确认变化是否由自己的操作引起,最后才去看源码。顺序反过来,就会在一个本来就是正常的公式里找错。
本文讲的是数据重算机制与验证方法,不涉及具体标的的判断。站内还有 报错与卡顿排查 的其他条目,量价形态与信号拆解 里讲信号条件本身的写法,指标回测与风险验证 里讲怎么在历史行情上核对信号是否稳定,可对照查看。
