通达信公式计算出错,症状是测试能通过、图上也有线,但数值与预期对不上。这类问题不产生报错提示,定位的入口只有一个:数据类型。同一段表达式在不同类型的数据上参与运算,结果会差出量级。这篇按「先分症状、再逐类定位、最后处理」的顺序展开。

文中的字段名与函数名按通达信 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。

分母为 0 的情况在停牌、复牌或数据缺失的位置会出现。用一段包含这类位置的历史来回测,能把这类问题暴露出来;只用一段平稳行情测试,问题会一直藏着。

六、通达信公式计算出错的排查顺序

把前面的内容整理成一个固定顺序,遇到问题按序走一遍。

  1. 确定现象属于量级、方向、时点、断路中的哪一类。
  2. 把参与运算的关键量逐个输出到图上,记下各自取值范围。
  3. 量级问题查单位与复权;方向问题查比较的左右与差值比值混用。
  4. 时点问题查引用位置与跨周期取值。
  5. 断路问题查前置数据是否足够、分母是否会出现零。

第 2 步是这套顺序的核心。不把中间值输出到图上,后面四步的判断都建立在猜测上,改一处试一次会耗掉大量时间。

七、同一段代码在不同周期下的差异

周期切换后结果变化,是通达信公式计算出错里较难察觉的一类。日线上正常的取值,切到周线或分钟线后可能差出量级或位置偏移。

差异来源 表现 处理方向
前置数据根数改变 短周期上线更长,长周期上线更短 按最小可用周期的前置要求设定均线长度
成交量单位随周期汇总 周线量是日线量的累加 跨周期比较前统一到同一周期
引用位置含义变化 「前一根」在日线与周线上跨的时间不同 明确要跨的是时间还是根数

处理办法是把公式的适用范围写清楚。同一条公式若要跨周期使用,参数就不能按单一周期的经验取值,而应当按周期的数据根数重新定一次。

{跨周期核对动作}
1. 在日线上取一个已知位置,记下公式输出值
2. 切到周线,找到覆盖同一时间的位置,记下输出值
3. 比较两者,判断差异是否能用根数变化解释得通
4. 解释不通时,回到引用位置那一节重新确认

第 3 步是关键。差异若能由根数变化解释,说明公式本身没问题,只是范围定义得太窄;解释不通则说明表达式里混入了与周期相关的假定。

七、写公式时顺手做掉的三件事

避免这类问题比事后排查更省力,做法集中在写的时候就做掉。

{写的时候就做掉}
1. 变量名带上单位含义(如「量_股」「价_元」这类后缀)
2. 相对量用比值表达,不用绝对差值
3. 除法一律加分母保护

这三条不增加代码量,但能把前文中量级、方向、断路三类问题挡在写稿阶段。把它们当成写公式的默认动作,比事后逐条排查划算。

相关延伸:公式的四段结构与基础写法,见 公式编写教程 一栏;导入后出现的提示与报错原文,见 报错与卡顿排查 一栏;指标参数的设定值与合理范围,见 指标原理与参数 一栏。

通达信公式计算出错这类问题的特点是不报错,所以排查靠的是把中间值显出来看,而不是读代码找语法问题。把中间值输出这一步做扎实,多数问题在十分钟内能定位到。

文中目录名、文件后缀与菜单名按通达信 PC 版的常见形态描述;不同版本与券商定制版在目录结构、命名约定与菜单路径上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论操作步骤与文件机制,不构成任何投资建议。

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