手里有一段别人写的公式源码,从第一行读到最后一行,只看到字母、括号和分号,该从哪里下手?通达信公式源码读法有一套能照做的顺序:先分行的类型,再认名字,再查函数,最后动手调试。顺序走对,一段几百字的源码可以拆成几条挂得上副图的线。

下面按这个顺序走一遍,涉及的入口与文件是公式管理器、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;

第一种是把赋值符看成输出符。源码里明明有这一行,副图上却少一条线,原因就在 := 只算不画;反过来,把只作中间量的行写成输出行,副图上会多出几条用不上的线。第二种是把跨指标引用当成普通变量。指标名加字段名的写法是引用另一个指标的输出值,前面的指标名必须在本机已经存在,后面的字段名是那个指标里的一条输出线;那个指标不在本机时,测试会提示标识符未定义,此时要么把它补进本机,要么把它的算法抄下来接到这段源码里。

接下来做一件具体的事:把这段源码里所有的输出行抄到最前面逐行列开,点「测试公式」过一遍语法,再把中间变量逐条改成输出线挂到副图,一条一条确认过去,最后改回原样并另存一份。走完这一遍,通达信公式源码读法就不再是纸面上的顺序,你手上有一段自己能改的源码。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。函数说明与提示措辞以本机版本为准,公式的取值属于写法设定,不属于对行情的结论。

站内还有 通达信公式编写教程 的其他条目,新手常见问答 里讲第一次写公式会遇到的问题,主图与副图 里讲输出线怎么挂到图上,可对照查看。

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