通达信公式赋值规则里,只有一个符号的差别最容易出错:冒号与冒号加等号。多打一个等号,这个变量就从「画出来」变成「藏起来」,图上少一条线,图例里少一行,引用的结果也可能跟着变。读懂这个差别,那些看似莫名其妙的显示问题会直接对上原因。
下面按两种符号的作用、为什么重要、顺序与引用、命名规则、参数与变量的分工、常见写法问题与核对清单七步讲。文中符号写法、函数名与菜单名称为通达信客户端的通用描述,不同版本与券商定制版对输出项的显示处理存在差别,请以你所用客户端的实际界面与官方说明为准。
一、两种符号各自的作用
公式里的每一次赋值都要选一种符号,两者的差别在输出上。
{ 两种赋值的写法与效果 }
变量: 表达式; —— 冒号赋值,结果参与输出
变量 := 表达式; —— 冒号等号赋值,结果作为中间量
{ 计算过程一样,差别在结果是否被画出来 }
冒号赋值的结果会进入输出列表,被画成线或柱,也会出现在图例与数值显示里。冒号等号赋值的结果不进入输出列表,只作为后续表达式可以引用的中间量。两者的计算过程没有区别,分叉点在赋值动作之后。
二、为什么这个区别值得单独记
这个差别影响三处,每一处都能在图上看到。
| 影响面 | 冒号赋值 | 冒号等号赋值 |
|---|---|---|
| 图上呈现 | 画出对应曲线或柱 | 不画任何图形 |
| 图例与数值显示 | 出现该条目及其取值 | 不出现 |
| 被后续表达式引用 | 可以引用 | 可以引用 |
第三行说明一件事:中间量与输出量在「能否被引用」上没有差别,差别只在于是否对外呈现。因此用哪一种,依据是「这个量需不需要被看到」,而不是「这个量是不是中间结果」。
第二处影响容易被忽略。调试阶段把中间量写成冒号赋值,可以逐个看到每个阶段的值,这是核对口径的主要手段;定稿后把这些量改回冒号等号,图例会干净下来。这一步不做,一张图上会挂着七八条线,读起来分不清哪条是主输出。
三、赋值顺序与引用范围
公式按从上到下的顺序解析,引用只能出现在赋值之后。写在前面引用后面才赋值的变量,编译时会提示该名称未定义。
{ 顺序敏感的两个例子 }
先赋值后引用 —— 正常
先引用后赋值 —— 提示名称未定义
{ 提示说的是定义位置,不是拼写问题 }
看到「未定义」这类提示时,先按顺序核对一遍,比逐个检查拼写更快。名称本身是写对的,只是它的赋值语句排在引用之后。也有一种情况是变量名与函数名撞了,编译器把它当函数去解析,同样报未定义或参数不匹配,这一项放在命名规则里讲。
同一变量被赋值两次时,后面的赋值覆盖前面的。这种写法不会报错,但会让中间过程不可见,读公式时容易把前一次赋值的含义套到后一次上。需要分阶段计算时,用不同的变量名比重复赋值清楚。
顺序敏感这一点在调试时作用明显。把公式按阶段切成若干段,每段的结果单独输出一次,从上往下看值的变化,能定位到哪一段开始偏离预期。反过来从头猜,要在几处之间来回改。
赋值语句的数量也要控制。一条公式里出现二十个以上的中间变量时,说明它承担了过多的判定,这时候拆成两条公式分别输出,比继续堆在一条里更容易核对。
四、变量命名规则
通达信公式赋值规则里对命名的约束不多,但有两处需要避开。
第一处是不要与字段名重合。收盘、开盘、最高、最低、成交量这些在公式里有固定含义,用作变量名时编译器按内置含义解析,公式的行为会与写的时候的想法不一致,而这类问题不会报错。
第二处是不要与函数名重合。用函数名当变量名,后面跟括号时会被当成函数调用,参数个数对不上就报参数错误。
名称可以是中文,这给可读性留了余地。中间量的名字取成能读出含义的短语,过一段时间回来看公式时,不用重新推一遍每一段在算什么。缺点是中文名在跨平台转换时可能需要改写,这一点在跨平台的文章里另有说明,见 跨平台对比与公式转换 一栏。
五、参数与变量不是一回事
参数写在公式头部,用于暴露可调项;变量写在正文里,用于承载计算中间量。两者的作用位置不同。
| 项目 | 参数 | 变量 |
|---|---|---|
| 出现位置 | 公式头部声明区 | 正文的赋值语句 |
| 是否对外可调 | 挂载时可在参数表里改 | 只能在公式里改 |
| 改动后的效果 | 整条公式按新取值重算 | 需要重新保存公式 |
把不该固定的值写成参数,公式的复用性会上来;把只在一处用到的常数写成参数,参数表会变得冗长。判断依据是「这个值需不需要在挂载时调整」,需要就写成参数,不需要就写成常量或中间变量。
参数与变量的第二个差别在改动方式上。改参数不需要打开公式编辑器,在挂载界面的参数表里直接改即可,改动后整条公式重算;改变量必须回到编辑器里改并保存。这个差别决定了调试时的效率:需要反复试的取值写成参数,试好之后固定下来,就不用每次都进出编辑器。
六、几处常见的写法问题
第一处是句末漏分号。编译器读到下一行才发现上一句没有结束,提示位置会指向下一行,位置与真正的问题错开一行。
第二处是冒号与冒号等号混用。本该隐藏的中间量写成了冒号赋值,图上多出一条线;本该输出的主结果写成了冒号等号,图上什么都没有,看起来像公式失效。
第三处是把赋值写进了条件参数的位置。条件参数要的是比较表达式,写进赋值符号后语法解析走向另一种结构,提示的位置未必落在这一处。
第四处是注释没闭合。花括号只写了一半,后面的正文会被当成注释吞掉,公式能保存但结果与预期不同。这类问题在长公式里出现时,症状是「后半段完全没起作用」,而不是报错。
这四处的共同点是不报错,或者提示指向别处。遇到公式能保存但结果不对的情况,按上面的顺序回看一遍符号用法,比从计算结果反推更快。通达信公式赋值规则这一层的问题大多属于这类:不阻止公式运行,只改变运行结果。
七、核对清单
- 主输出用的是冒号赋值吗,保存后图上能看到吗。
- 调试用的中间量是否已改回冒号等号赋值。
- 每一条赋值语句都以分号结束了吗。
- 变量名有没有与字段名、函数名重合。
- 引用是否都出现在赋值之后。
- 花括号注释都成对吗。
- 该在挂载时调整的值,是否已经写成参数。
符号层面的问题解决之后,接下来是条件与取值的写法。条件函数的三段结构与嵌套写法见 通达信公式编写教程 一栏;字段与函数的分工、按根求值的含义见 通达信新手入门问答 一栏。把通达信公式赋值规则这一层弄扎实,读别人的公式时就少了一类需要猜的地方。
文中符号写法、函数名与菜单名称为通达信客户端的通用描述;不同版本与券商定制版对输出项的图例显示、参数表的取值保存与中文变量名的支持存在差异,具体请以你所用客户端的实际界面与官方说明为准。本文只讨论赋值符号的语法含义与写法约定,不构成任何投资建议。
