通达信公式计算出错,症状是测试能通过、图上也有线,但数值与预期对不上。这类问题不产生报错提示,定位的入口只有一个:数据类型。同一段表达式在不同类型的数据上参与运算,结果会差出量级。这篇按「先分症状、再逐类定位、最后处理」的顺序展开。
文中的字段名与函数名按通达信 PC 版的常见形态描述。不同版本与券商定制版在字段定义与函数行为上存在差异,涉及具体取值的地方请以你所用客户端的测试结果为准。
一、先分清三种「结果不对」
「算错了」是一个笼统的说法,实际包含三类完全不同的现象。分清楚属于哪一类,才能确定要查什么。
| 现象 | 表现 | 主要怀疑方向 |
|---|---|---|
| 量级不对 | 线条形状对,数值差若干倍 | 单位或复权口径 |
| 方向不对 | 该涨的时候在跌 | 比较符号或正负号 |
| 时点不对 | 信号位置比预期早或晚一根 | 引用位置或周期函数 |
| 部分为空 | 图上中间有几段断开 | 前置数据不足或除零 |
第一类的处理最简单,也最容易被误判成公式写错了。先看量级,再看逻辑,这个顺序能省掉不少返工。
二、量级不对:单位口径的四个来源
量级差出固定倍数时,问题落在单位换算上。下面四处是常见的来源。
{量级检查的最小动作}
1. 把参与运算的两个量分别输出到图上,看它们各自的取值范围
2. 记下两者的数量级差(十倍、百倍、千倍)
3. 回到表达式,找出这个倍数出现在哪一步
4. 确认这一步是单位换算还是口径不同
| 来源 | 说明 | 检查方式 |
|---|---|---|
| 成交量的单位 | 不同字段的成交量可能以手或股计 | 把字段单独输出,与成交明细对照量级 |
| 金额与手数混用 | 成交额除以成交量得到的是均价,但单位不同则结果偏差 | 算出的均价与图上价格区间比对 |
| 价格是否复权 | 复权与不复权在同一段历史里数值不同 | 换一个复权设置再看同一个值 |
| 百分比与小数 | 涨跌幅字段是百分数还是小数形式 | 在已知涨跌幅的位置上核对一次 |
三、方向不对:比较与符号
方向反了的典型原因是比较的左右写反,或者把差值当成比值用。
{方向类问题的两种形态}
形态一:比较左右写反
写成:MA(CLOSE,20)>MA(CLOSE,5)
意图:短期均线在长期均线之上
形态二:差值当比值
写成:CLOSE-REF(CLOSE,1)
意图:当日的相对涨幅
问题:得到的是绝对价差,高价股与低价股不可比
改为:(CLOSE-REF(CLOSE,1))/REF(CLOSE,1)
第二种形态在跨品种或跨时段比较时会暴露得比较明显:同一段代码在两个价格区间差异较大的对象上给出的值差得很远。同品种同价位下看不太出来,容易一直用错。
四、时点不对:引用与周期
信号位置差一根,问题出在引用位置上。这一类的处理要点是把「当前这根」与「前一根」分开看。
{时点检查}
1. 把表达式里所有引用前值的函数列出来
2. 逐个确认引用的是几根之前
3. 把引用前后的值同时输出到图上,确认对应关系
4. 若用了跨周期函数,确认取的是已完成的那根还是正在走的那根
跨周期取值是一个独立的坑。取正在走的那根,与取已完成的那根,在同一时刻会给出不同的值。公式里若没有明确这一点,图上看到的位置与预期就会差半根到一根。
| 写法 | 取的数据 | 适用场景 |
|---|---|---|
| 不指定引用位置 | 当前这根 | 盘中实时计算 |
| 引用前一根 | 上一根已完成的 | 需要稳定值时 |
| 跨周期不指定 | 取决于版本约定 | 需要先测试确认 |
五、部分为空:前置数据与除零
图上出现断开,是因为这条线在某个位置没有值。原因有两类。
第一类是前置数据不足。用 20 日均线时,最开始 19 根没有足够的历史数据,那条线从第 20 根才出现。这是机制决定的,不是错误。若希望从第一根就有值,需要换用对前置要求更低的写法。
第二类是除零。分母在某个位置取值为零时,结果无法定义,图上表现为断开或异常值。
{除零的处理}
原始写法:
比值:CLOSE/REF(CLOSE,1)-1;
加一层保护:
分母:=REF(CLOSE,1);
比值:IF(分母>0,CLOSE/分母-1,0);
保护值的选取要与该指标的取值范围相称。取 0 意味着「无变化」,若业务上「无变化」与「数据缺失」需要区分开,就应当在图上用不同的呈现方式体现,而不是都归到 0。
六、通达信公式计算出错的排查顺序
把前面的内容整理成一个固定顺序,遇到问题按序走一遍。
- 确定现象属于量级、方向、时点、断路中的哪一类。
- 把参与运算的关键量逐个输出到图上,记下各自取值范围。
- 量级问题查单位与复权;方向问题查比较的左右与差值比值混用。
- 时点问题查引用位置与跨周期取值。
- 断路问题查前置数据是否足够、分母是否会出现零。
第 2 步是这套顺序的核心。不把中间值输出到图上,后面四步的判断都建立在猜测上,改一处试一次会耗掉大量时间。
七、同一段代码在不同周期下的差异
周期切换后结果变化,是通达信公式计算出错里较难察觉的一类。日线上正常的取值,切到周线或分钟线后可能差出量级或位置偏移。
| 差异来源 | 表现 | 处理方向 |
|---|---|---|
| 前置数据根数改变 | 短周期上线更长,长周期上线更短 | 按最小可用周期的前置要求设定均线长度 |
| 成交量单位随周期汇总 | 周线量是日线量的累加 | 跨周期比较前统一到同一周期 |
| 引用位置含义变化 | 「前一根」在日线与周线上跨的时间不同 | 明确要跨的是时间还是根数 |
处理办法是把公式的适用范围写清楚。同一条公式若要跨周期使用,参数就不能按单一周期的经验取值,而应当按周期的数据根数重新定一次。
{跨周期核对动作}
1. 在日线上取一个已知位置,记下公式输出值
2. 切到周线,找到覆盖同一时间的位置,记下输出值
3. 比较两者,判断差异是否能用根数变化解释得通
4. 解释不通时,回到引用位置那一节重新确认
第 3 步是关键。差异若能由根数变化解释,说明公式本身没问题,只是范围定义得太窄;解释不通则说明表达式里混入了与周期相关的假定。
七、写公式时顺手做掉的三件事
避免这类问题比事后排查更省力,做法集中在写的时候就做掉。
{写的时候就做掉}
1. 变量名带上单位含义(如「量_股」「价_元」这类后缀)
2. 相对量用比值表达,不用绝对差值
3. 除法一律加分母保护
这三条不增加代码量,但能把前文中量级、方向、断路三类问题挡在写稿阶段。把它们当成写公式的默认动作,比事后逐条排查划算。
相关延伸:公式的四段结构与基础写法,见 公式编写教程 一栏;导入后出现的提示与报错原文,见 报错与卡顿排查 一栏;指标参数的设定值与合理范围,见 指标原理与参数 一栏。
通达信公式计算出错这类问题的特点是不报错,所以排查靠的是把中间值显出来看,而不是读代码找语法问题。把中间值输出这一步做扎实,多数问题在十分钟内能定位到。
文中目录名、文件后缀与菜单名按通达信 PC 版的常见形态描述;不同版本与券商定制版在目录结构、命名约定与菜单路径上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论操作步骤与文件机制,不构成任何投资建议。
