1、分析家 V5.0 公式系统使用与提高版权所有 2003 深圳市汇天奇电脑有限公司2本手册是分析家公式设计指南的补充手册,是对分析家V5.0 公式系统新增功能的说明,其基本操作请参阅 公式设计指南 。深圳市汇天奇电脑有限公司对分析家软件及本手册的内容不做任何形式的保证。用户在使用本软件及手册的过程中造成的必然或偶然之过失,深圳市汇天奇电脑有限公司概不负责。未经深圳市汇天奇电脑有限公司事先书面许可,本手册的任何部分不得以任何形式进行增删、改编、节选、翻译、翻印或仿制。本手册的全部内容深圳市汇天奇电脑有限公司可能随时加以更改,此类更改将不另行通知。本手册的著作权属于深圳市汇天奇电脑有限公司3分析家
2、V5.0 公式系统分析家 V5.0 公式系统在兼容旧版本公式系统的基础上,引入了一些全新的概念,为书写、描述更为复杂的公式提供了强有力的工具。对于有一定公式编写基础的用户,可以学习以下内容,掌握分析家新公式系统的强大功能。一 分析家新公式系统简介你是否在编写公式的过程中有以下困惑:1) 书写很长的而且大量重复的公式2) 为怎样描述一个特殊的概念而伤透脑筋3) 希望增加公式系统的函数数量4) 希望了解计算过程中,中间结果的数值5) 希望自己编写函数如果有,那么你就需要使用分析家 V5.0 公式系统了,新的公式系统全面兼容以前的公式系统,同时还给你带来许多革命性的特性。新公式系统的增加的主要内容有
3、:1) 新增迭代、分支、循环等标准程序语言语法2) 强大的字符串和数组运算3) 内建调试器,方便公式查错分析家新公式系统为用户提供了两个公式编辑器:一个是专业公式编辑器,通过公式管理器可以进入,它提供了公式编辑、编译、调试等多种功能,是一个功能强大的编辑器;另一个是标准编辑器,它与过去版本界面类似,通过除了公式管理器以外的位置均进入到这个标准编辑器,它短小精干,易于使用。这些新增的内容有一定的难度,适合具有计算机编程知识的用户阅读。通过下面章节的学习,你将会逐步了解到这些新特性将给4你带来的方便。二 隐含在公式中的循环1. 计算的顺序在公式系统中,每一个公式是按照语句顺序执行的,例如:V0:=
4、MA(CLOSE,5);V1:=MA(CLOSE,10);将首先执行 5 日均线的计算,然后再计算 10 日均线,但是我们忽略了一个问题,那就是其中还隐含了一个时间顺序的问题,也就是说先计算昨天的数值再计算今天的数值。这样,我们就有了两个顺序语句顺序和时间顺序,我们到底以哪一个顺序为优先呢?答案是以时间顺序为优先,也就是说计算第一天的 V0,第一天的V1,然后是第二天的 V0,第二天的 V1。对于上面这个例子,由于前后语句之间不存在相互影响,所以到底哪个顺序优先并不影响结果,因此很多人都忽略了这个问题,认为因该首先计算完所有的 V0,然后再计算 V1。但是在看下面例子:V0:=IF(V1CLO
5、SE,CLOSE,V1);V1:=MA(CLOSE,10);前面的语句引用了后面的数据,这样 V1 昨天的计算结果就会影响到 V0 的计算,此时就必须以时间顺序为优先。有了这个时间顺序优先,我们就可以解决过去前后数据互相引用、变量重新赋值、迭代计算等问题了。因此我们应当按照这样的方式思考:我们用公式描述一天的情况,而不是描述一条曲线,整个公式又隐含着一个时间循环,当算完一天的数据后,又重新回到公式起点,计算第二天的数据,如此循环直到计算完所有的数据。需要注意的是,这个隐含循环中可能存在前面语句引用后面数据的问题,如上例中第一个语句中引用了V1 变量,而 V1 变量需要到第二句才有赋值,所以此时
6、它的数值是在上一轮循环中第二条语句所赋值的,也就是昨天的 10 日均线5数值。这是不是有点太复杂了,但是我们将看到这种循环为我们带来的好处。2. 迭代计算我么在分析中经常会用到迭代的概念,比如说指数平滑移动平均线 EMA,今日均线等于昨日均线 *(N-1)加上近日收盘价*2 ,然后再除以 N+1。这样的问题还包括 SMA、DMA 等等。所谓迭代就是用上一周期的数值来计算本周期的数值。过去由于公式系统不能直接支持迭代,所以只能用函数来实现这些迭代功能,而是用心公式系统后,迭代变得可以自己实现了,而且非常简单。以 EMA 为例:V1 := (V1*(N-1) + CLOSE*2) / (N+1);
7、就这么简单,直接按照其原理书写就可以了。我们来分析一下为什么可以这样写。赋值符号 := 左边的 V1 表示本周期的数值,而右边的 V1 由于还没有赋值,还保持着上一周期的数值,因此这个 V1 就还维持着上次计算的结果,也就是上周期的数值,此时它等同于 REF(V1,1)。同样的, SMA 可以表述为:V1 := (V1*(N-1) + CLOSE) / N;需要注意的是,在本语句之后,由于 V1 已经被赋值,所以它的数值也就变成本周期的数值了。类似的例子还包括:若上周期V1 值大于收盘价,则 V1 等于最高价,否则等于最低价:V1:= IF(V1CLOSE, HIGH, LOW);前面的例子:
8、V1 := (V1*(N-1)+CLOSE)/N;我们可能会问,计算第一天的时候,V1 的数值是多少。如无特殊说明,变量的初始数值等于 0。显然在这个问题中这个设定是不正确的,因为 V1 等于 0 的话,计算结果就等于 CLOSE/N,显然他不等于第一天的均值,因此我们需要这样说明:V1 :=IF(BARPOS=0,CLOSE, (V1*(N-1)+CLOSE)/N);当计算第一天的时候,V1 等于收盘价,随后等于指数平滑移动平均。6迭代这个概念理解起来有一定的难度,但如果能够很好地应用它能为我们解决很多问题。3. 初始数值及变量声明任何变量在使用之前必须先赋值,那么迭代就有可能出现一个问题:
9、变量还没有赋值怎么使用。我们需要用变量声明来解决这个问题:直接说明变量的初始数值和变量的类型,其语法如下:VARIABLE: P=1;表示声明一个变量 P,设定其初始数值为 1,也就是说在计算的第一天,它的数值为 1。这样就可以在迭代中使用变量 P 了。变量声明必须写在任何语句之前,但如果有 INPUT 参数说明,则应当放在它的后面。一个完整的指数平滑移动平均线公式可以写成:VARIABLE: V1=0;V1 :=IF(BARPOS=0,CLOSE, (V1*(N-1)+CLOSE*2)/(N+1);再举个例子,我们需要知道当前正在计算第几根 K 线?第一天为 1,第二天为 2,我们可以写成:
10、VARIABLE: P=0;P := P+1;使用迭代,方便地描述了这个要求,今天的数值等于昨天的数值+1 。这个例子也很好地说明了迭代的简洁和功能强大。在这里需要特别指出的是,变量声明设定的初始值表示计算的第一天的数值,今后每次计算新的一天并不对该变量设定初始值,例如:VARIABLE: V1=0;V2:=0;V1:=V1+1;V2:=V2+1;这当中 V1、V2 的计算结果将截然不同,V1 设定了初始数值0,每次隐含循环加 1,他的计算结果为 1、2、3、4,是一个递增的序列;而 V2 则由于每次循环均被重新设定为数值 0,因此7V2:=V2+1 这条语句将 V2 设置为 1。因此,如果我
11、们需要每天决设定初始数值,则需要一条赋值语句来设定;如果我们不需要每天设初始值而是第一天需要,则使用 VARIABLE 语句声明变量并且赋予初始数值。4. 参数说明新公式系统引入参数说明语句:INPUT: 参数名(默认值,最小值 ,最大值,测试步长);其中默认值是必需的,其他值若没有指定,则使用其默认值0,100 和 1。参数说明语句必须放在公式的最前面。参数说明等同于在公式编辑器中直接在参数输入框中输入参数。系统将参数输入框中和 INPUT 语句说明的参数累加起来,其总数不能不超过 16 个。使用参数说明语句,可以使公式程序放在一段文字中,可以方便一部分喜欢这种方式的用户。你可以使用两种方法
12、中的任意一种,他们不存在区别。我们可以在 INPUT 语句中说明多个参数,它们之间用逗号分隔。例如:INPUT: P1(10,0,20), P2(20,0,100);5. 总结新公式系统的核心在于:我们只需要描述每一天的行为,如果当天没有改变一个变量,则该变量维持昨天的数值不变。三 分支1. 为什么要分支所谓分支,就是如果满足某个条件就执行某些指令,否则就指令另外一些指令。有了分支,计算机就有了智能,知道根据具体情况作出不同的动作,这是计算机最重要的功能之一。2. 以前我们是怎样实现分支的过去,我们也在函数中隐含地使用了一些分支概念,在函数中8直接将分支包含进去。例如绘图函数 DRAWTEXT
13、(Cond,Price,Text),表示如果 Cond 条件满足就输出文字。再例如, IF(Cond,V1,V2)表示如果 Cond 条件成立就返回 V1,否则就返回 V2。但是这种包含在函数中间的条件也有许多缺陷,那就是它只能控制一条语句,而且只在有限的几个函数中包含条件,这极大地限制了分支的应用。例如,我们就无法描述如果条件成立,V1 就等于 CLOSE,否则 V2 就等于 CLOSE。3. 分支的描述方法我们使用 IF 条件 THEN 语句 来描述如果条件成立就执行语句这样一个逻辑,例如IF CLOSEOPEN THENP := P+1;它表示如果收盘价大于开盘价,P 的数值就增加 1,
14、否则 P 值维持不变,也就是说统计历史阳线的数量。需要注意,IF 语句和 IF 函数使用同样的关键字,区分它们的办法是在 IF 语句之后必然存在 THEN 语句,而 IF 函数则没有。因此我们不能在 IF 语句条件部分包含 IF 函数,例如:IF IF(CLOSEOPEN, OPEN, CLOSE)10 THENP := P+1;该语句将混淆两个 IF 的作用,可以使用以下方法来解决:C1 := IF(CLOSEOPEN, OPEN, CLOSE)10;IF C1 THENP := P+1;如果我们想要在条件满足的情况下多做几件事情怎么办?在此我们引入 BEGINEND 这样一个语句来形成组合
15、语句,也就是说将它们中间所包含的语句看作一个整体,一起执行。组合语句被认为是一个整体,在接下来的分支、循环等操作中均需要用到。例如:IF CLOSEOPEN THEN BEGINP := P+1;9Q := MA(CLOSE,10);END他表示如果条件成立,将执行对 P 和 Q 的赋值语句,否则这两条语句均不执行。BEGINEND 语句可以嵌套,END 与之前面最接近的还没有配对的 BEGIN 进行配对。例如:IF CLOSEOPEN THEN BEGIN (1)P := P+1;IF CLOSE10 THEN BEGIN (2)P := P+1;Q := MA(CLOSE,10);END
16、(3)END (4)其中,2-3 是配对的,1-4 是配对的。分支语句还有以下形式:IFTHENELSE,他表示如果条件满足就执行某件事,否则就执行另外一件事。例如:IF CLOSEOPEN THENP := P+1;ELSEQ := Q+1;这段公式表示,如果今天收阳线,则将 P 的数值增加 1,否则将 Q 的数值增加 1,需要注意的是,ELSE 必须与 IF 配对,而且中间只能有一条语句或用 BEGINEND 包围起来的组合语句。IFTHENELSE 可以嵌套,ELSE 与之前最接近的未配对的 IF语句进行配对,例如:IF CLOSEOPEN THEN (1)P := P+1;ELSE IF CLOSEREF(CLOSE,1) THENUP := UP+1;ELSE IF CLOSEOPEN THEN BEGINUPR := UPR + R;UP := UP+1;ENDELSE IF CLOSEOPEN THEN BEGINDNR := DNR + R;DN := DN+1;END平均涨幅: IF(UP=0,0,100*UPR/UP);平均跌幅: IF(DN=0,0,100*DNR/DN);四 循环