手里有一段别人写的公式源码,从第一行读到最后一行,只看到字母、括号和分号,该从哪里下手?通达信公式源码读法有一套能照做的顺序:先分行的类型,再认名字,再查函数,最后动手调试。顺序走对,一段几百字的源码可以拆成几条挂得上副图的线。
下面按这个顺序走一遍,涉及的入口与文件是公式管理器、Ctrl+F 和 T0002 目录。文中以通达信金融终端个人版为准,不同版本的函数列表与提示措辞可能有差异。
一、先分三类行,把输出行挑出来
源码的第一遍不读算式,先读行的类型。同一段源码里的行分三类,标记互不相同,认标记比认算式快。
{ 一段源码里的三类行 }
N(5,60,20) { 第一类:参数声明行 }
快线 := MA(CLOSE, N); { 第二类:中间赋值行,:= 只算不出线 }
慢线 := MA(CLOSE, 60);
DIF: 快线 - 慢线, COLORRED; { 第三类:输出行,: 出线 }
金叉: CROSS(快线, 慢线), COLORYELLOW;
参数声明行写在最前面,形如名称加一对括号,括号里是下限、上限与默认值。中间赋值行用 :=,算出一个值留在内存里,不往图上画。输出行用 :,冒号后面的表达式会被画成一条线,逗号后面跟的是颜色与线型。读一段陌生源码的第一件事,就是把输出行全部挑出来抄到一边,其余的中间量都是为这几行服务的。
| 行的类型 | 标记 | 读法 | 能不能删或改 |
|---|---|---|---|
| 参数声明行 | 名称(下限,上限,默认值) | 先看默认值,再看上下限框住的取值范围 | 可改。改完界面上的可调范围跟着变,正文里引用它的地方不用动 |
| 中间赋值行 | := 结尾是分号 |
算出中间值,不进图;看它被后面的哪一行引用 | 可删,前提是后面没有行再引用它;删了引起报错时先看引用关系 |
| 输出行 | : 加表达式,逗号后跟显示参数 |
这一段才是你在图上看得见的东西 | 可改。逗号后面的颜色与线型可删可换,删掉不影响取值 |
二、名字不靠猜:从引用处反推含义
通达信公式源码读法卡住人的一步是名字。A1、AA、X、W 这类名字没有含义,两个字母的拼音缩写也要小心,同一个缩写在不同人手里指的东西不一样,猜是最费时间的办法。
{ 名字是作者的缩写,算式才是含义 }
ZDF := (CLOSE - REF(CLOSE, 1)) / REF(CLOSE, 1) * 100; { 名字像涨幅缩写,算式也是涨幅 }
JX := CROSS(快线, 慢线); { 缩写对应金叉,算式说明方向 }
{ 反推的办法:搜一遍这个名,看它被谁引用 }
条件: ZDF > 3 AND JX, COLORRED;
反推的做法是在编辑框里搜一遍这个名,看它出现在哪几行。名字出现在某一行算式的右半边,说明这一行拿它当输入;名字出现在别的输出行引用的位置上,说明它是那一行的前置条件。看过两三处,含义就定下来了,此时可以在注释里补一句自己的理解,也可以把它改成看得懂的名字。
三、函数参数顺序:对着函数说明查,以本机版本为准
函数的参数顺序不要凭印象。公式管理器的编辑窗口旁边就是函数列表,点开任意一个函数会看到参数说明,第一个参数是什么、第二个是什么,写明在那一栏里。不同版本之间函数有增减,写法也有微调,以本机这一份列表为准。
{ 同一个函数的第一个参数换了字段,结果完全不同 }
均量 := MA(VOL, N); { 第一个参数是量,算出量能的均线 }
均价 := MA(CLOSE, N); { 第一个参数是价,算出价格的均线 }
{ CROSS 的左右顺序决定方向 }
上穿 := CROSS(快线, 慢线);
参数个数写错时,测试会给出提示,措辞形如「函数中参数个数不对」或「缺少分号」,不同版本的提示文字可能不一样。看到提示先回那一行数一遍逗号:函数调用里的逗号个数加一,就是这一处的参数个数。括号没配平的情况也会出现,提示指的行号有时指向下一行。
还有一类属于函数存在但用法不对:REF 的第二个参数要给一个根数,写成表达式在某些场景下也能算,但取值会跟着每一根变化,读的时候要分清它是常数还是变量。
四、括号、分号、逗号,各管一件事
标点在这里不是装饰。这三种符号分别管运算顺序、语句边界和显示参数,读源码时按它们切句比按行切更准。
{ 括号:一层括号里的表达式先算,嵌套的从里往外 }
均线 := MA(CLOSE, 20);
偏离 := (CLOSE - 均线) / 均线; { 括号里先做减法 }
{ 分号:一条语句结束 }
数值 := IF(偏离 > 0.03, 偏离 * 100, 0); { 少一个分号,报错行会指向下一行 }
{ 逗号:在输出行里,后面跟的是颜色与线型,不参与计算 }
幅度线: 数值, COLORRED;
括号读的是配对关系,从最里面的一层往外一层层写下来,算式就拉开了。分号是语句的终点,一行写完忘了它,下一行会被当成上一行的延续,报错提示指向的位置与真正出错的位置差一行。逗号在两类行里含义不同:中间赋值行里的逗号是函数参数的分隔,去掉它这一处就算不出来;输出行里的逗号后面跟的是颜色、线型这类显示参数,去掉它只影响这条线看起来的样子,取值不变。
五、调试:先过语法,再把中间变量挂到副图
通达信公式源码读法到这里还停在纸面上,下一步要落到软件里确认:第一步过语法,第二步逐条看图,顺序不要换。语法不过,挂上去看到的空白与语法无关;语法过了不看图,写法的对错仍然停在纸面上。
{ 调试时把 := 临时改成 : ,一条一条看 }
原样 快线 := MA(CLOSE, N);
调试 快线: MA(CLOSE, N), COLORRED;
慢线: MA(CLOSE, 60), COLORGREEN;
操作入口是 Ctrl+F 打开公式管理器,选中要读的那一条,点编辑,在编辑窗口里点「测试公式」。通过之后点确定保存,再把它挂到副图上:一屏只放一条线,看它的形态落在什么样的位置上。一条确认完,把这一行的冒号改回 :=,换下一条。动别人的公式之前,先把 T0002 目录复制一份,或者用另存为留一个副本,改坏了能回到原样。
六、两种读错的方式
前面几步做完,还剩两类错误会撞上,两者的表现都落在少一条线或报未定义上,原因却分在语法与引用两边。
{ 读错一:把 := 当成 : }
写着 快线 := MA(CLOSE, N); { 只算不画,副图上没有这一条 }
改成 快线: MA(CLOSE, N); { 这一条才会出现在副图上 }
{ 读错二:把指标名.字段名当成未定义变量 }
大周期DIF := MACD.DIF; { MACD 是已有指标名,DIF 是它的输出名 }
共振: 金叉 AND 大周期DIF > 0, COLORRED;
第一种是把赋值符看成输出符。源码里明明有这一行,副图上却少一条线,原因就在 := 只算不画;反过来,把只作中间量的行写成输出行,副图上会多出几条用不上的线。第二种是把跨指标引用当成普通变量。指标名加字段名的写法是引用另一个指标的输出值,前面的指标名必须在本机已经存在,后面的字段名是那个指标里的一条输出线;那个指标不在本机时,测试会提示标识符未定义,此时要么把它补进本机,要么把它的算法抄下来接到这段源码里。
接下来做一件具体的事:把这段源码里所有的输出行抄到最前面逐行列开,点「测试公式」过一遍语法,再把中间变量逐条改成输出线挂到副图,一条一条确认过去,最后改回原样并另存一份。走完这一遍,通达信公式源码读法就不再是纸面上的顺序,你手上有一段自己能改的源码。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。函数说明与提示措辞以本机版本为准,公式的取值属于写法设定,不属于对行情的结论。
站内还有 通达信公式编写教程 的其他条目,新手常见问答 里讲第一次写公式会遇到的问题,主图与副图 里讲输出线怎么挂到图上,可对照查看。
