通达信不画线公式这个说法,指的是一类需求:算出来的中间量要参与后续判断,但不想让它以线条形式出现在图上。常见的处理方式是算完之后再想办法把线藏起来,结果要么藏不干净,要么把数值本身改坏了。正确顺序是反过来——在算之前就说清楚这条不画。
下面按「输出与中间量的区别 — 不画的两种实现思路 — 三条路径的写法 — 验证」展开。文中函数名与语法按通达信 PC 版的公式系统常见写法描述,不同版本与券商定制版在函数签名与绘图行为上存在差异,请以你所用客户端帮助文档为准。
一、冒号与等号:从源头决定画不画
通达信公式里,语句用冒号还是等号,决定了这个量会不会画到图上。这是控制显隐的第一层,也是成本最低的一层。
{冒号:输出线,会画到图上}
参考线:MA(CLOSE,20);
{等号:中间变量,不画线}
原始值:=MA(CLOSE,20);
上面两条算的是同一个值,差别只在符号。用等号声明的量只参与后续计算,不出现在图上。这是通达信里实现「算而不画」的基本方式。
| 符号 | 是否绘图 | 能否被后续语句引用 | 典型用途 |
|---|---|---|---|
| 冒号 | 画 | 能 | 最终要展示的线 |
| 等号 | 不画 | 能 | 中间计算量 |
| 冒号加等号组合 | 按版本约定 | 能 | 需要按版本确认 |
第三行的写法在不同版本上的行为可能不同,写之前先在编辑器里测一次,看它有没有画线。
二、通达信不画线公式的第二种实现:图形层面的抑制
有些量必须用冒号输出,例如需要它出现在图例里、或需要它在数据窗口中可查询。这时用等号就达不到目的,只能从图形层面处理。
图形层面的处理有三条路径,适用条件不同。
路径一:把值的区段处理成无效值
{思路:在不想显示的区段上,把值替换成空值}
原始线:EMA(CLOSE,20);
{只在条件成立处保留原值,其余位置给空}
展示线:IF(条件,原始线,空值);
{注意:不同版本对空值的写法与接受方式不同}
这条路径的代价是数值被改动了。原来那条线的取值在这条语句之后就不再完整,任何依赖它做后续计算的语句都会受影响。用它之前要确认后面没有别的语句引用这条线。
路径二:把线宽设为不可见
部分版本提供线宽参数,把宽度设为零或不画线的值,可以让线不显示。这条路径不改数值,但依赖版本是否支持该参数。
路径三:改用不带绘制的函数
把绘图类函数换成纯计算类函数,只取数值不绘制。这条路径同样不改数值,但需要确认后续逻辑是否依赖该函数的绘图属性。
三、常见的写错顺序
错误顺序是:先按正常方式把线画出来,发现图面太乱,再回头去处理显隐。这样做的直接后果是源码里同时存在两种意图的表达,读起来互相矛盾。
{错误的写法:先画后藏,数值已被处理过}
主:EMA(CLOSE,20);
藏起来的主:IF(条件,主,空值);
{后面若还有语句引用 主,取到的是处理前的值}
{若引用 藏起来的主,在条件不成立处会取到空值,结果不可用}
正确顺序是在写每一行之前先判断这个量的用途:要展示的用冒号,只参与计算且不需要在图例中出现的用等号,需要出现在图例但不能画线的走图形层面处理。这个判断在写之前做,成本最低。
四、需要出现在图例里但不画线的一种折中
有一种需求同时要求两件事:这条量要在数据窗口里能查到值,但不能在图上画出线。这个需求在通达信里有一个折中方向:把值输出成一条水平参考线之外的单点标记,或者把该量挂在一个不遮挡行情的副图坐标上,再配合不画线设置。
{折中思路}
{把值输出到副图,图面上不占主图位置}
{再按版本支持的方式抑制线条绘制}
量值:计算表达式;
{验证:图面上看不到线,数据窗口里能查到该量的取值}
这类折中写法依赖具体版本的能力,落地之前先在编辑器里测一遍。测试的判据是两个:图面上是否真的看不到线,数据窗口里是否真的能查到值。
五、验证通达信不画线公式的四个动作
- 看图面:该量对应的线条是否完全不出现,不留下残留的线头或孤立的点。
- 看数据窗口:若该量需要可查询,确认它的取值正常,没有被处理成空值。
- 看后续语句:凡引用了这条量的语句,取值是否仍与预期一致。
- 看切换效果:改变参数或切换周期后,线与不线的状态是否保持。
第三项是这一套里最关键的一项。数值被改坏的写法,图面上看不出问题,只在后续计算结果上表现出来。
| 验证项 | 通过的表现 | 不通过说明 |
|---|---|---|
| 线条不出现 | 图面上找不到该量的线 | 抑制写法没生效或位置不对 |
| 取值正常 | 数据窗口里取值完整 | 数值被无效值处理过 |
| 后续不受影响 | 引用了它的语句结果不变 | 该项被改动的写法影响了后续 |
| 状态保持 | 换参数、换周期后仍不画 | 抑制写法只在部分条件下生效 |
六、参数与周期的两处影响
第一处是参数变化。以条件驱动的抑制写法,条件本身若依赖窗口长度,改窗口会改变被抑制的区段,图面效果跟着变。核对时把窗口调大调小各看一次。
第二处是周期切换。同一个抑制条件在日线与分钟图上的行为不同,因为每根代表的时间不同。跨周期使用时,抑制的区段会整体重新分布,需要重新确认。
{周期切换的核对方式}
1. 在日线图上确认抑制效果
2. 切到 60 分钟图,再看一次
3. 比较两处被抑制的区段占全图的比例
4. 若比例差别明显,说明条件依赖的数据密度不同
{处理方向:把条件改成与周期无关的写法,或接受差异}
通达信不画线公式的核心就是把显隐意图提前表达出来。写之前先分清这条量要不要展示、要不要可查询、后面有没有被引用,三个问题答完,写法自然确定。
七、显隐控制与其他显示问题分开看
图面上出现异常时,要区分是显隐控制没生效,还是别的显示设置引起的问题。两类问题的表现有时很像。
| 表现 | 属于哪一类 | 处理方向 |
|---|---|---|
| 整条线不出现 | 显隐控制生效 | 符合预期的不用处理 |
| 线条只出现一小段 | 抑制条件在部分区段不成立 | 检查条件的成立范围 |
| 线出现但颜色异常 | 颜色设置或图形参数 | 检查颜色相关设置 |
| 线出现但与另一条重叠 | 坐标范围或数值区间 | 检查两条线的量级是否一致 |
| 切换周期后突然出现 | 抑制条件依赖数据密度 | 把条件改成与周期无关的写法 |
前三行与显隐控制直接相关,后两行属于其他显示设置。把它们分开之后,排查范围会缩小一半。
八、把显隐意图写进注释
不画线的语句在源码里没有明显标记,几个月后回看,会看不出这条量为什么用等号而不是冒号。补一行注释可以解决这个问题。
{注释写法}
{中间量:参与下方判断,不单独作图}
参考量:=MA(CLOSE,20);
{展示线:需在图例中出现,因此用冒号}
最终线:参考量*系数;
{此处若改为冒号,图面会多出一条线,除非确需展示否则不要动}
注释的内容不用长,说明这条量为什么这样声明即可。改动源码时,注释能避免把等号误改成冒号。
九、什么时候应该反过来做
有一类情况需要把原本不画的量改成画出来。典型场景是排查问题:某条中间量的取值不符合预期,需要把它单独显示出来观察。这时把它临时改成冒号,确认之后改回等号。
{临时显示的写法}
调试用:中间量; {临时改成冒号,观察取值}
{确认后改回}
中间量:=计算表达式;
临时显示的写法要记得改回。留在源码里的调试输出线,会让后续使用者无法判断这条线是设计内的还是遗留的。这与注释的作用是同一件事的两面。
相关语法可以对照 通达信公式编写教程 一栏;图面显示类问题的其他排查方向见 主图副图指标 一栏;抑制写法改动数值后引发的异常定位见 报错与卡顿排查 一栏。
判断自己写法对不对,有一个成本很低的检查:把该量临时改回冒号,看图上出现的是什么形状。形状与你预期一致,说明数值没被改坏,抑制只是没生效;形状与预期不同,说明数值在之前就被处理过了。
文中函数名与语法按通达信 PC 版公式系统的常见写法描述;不同版本与券商定制版在符号约定、空值写法与参数支持上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式语法与显示机制,不构成任何投资建议。
