昭通市高速规划图:《分析家5.0新公式系统帮助文件》 - 闻香识女人的日志 - 网易博客

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 21:38:21
lsp     

日志

   闻香识女   加博友   关注他

最新日志

  • 2011年02月11日
  • 驾车如何判断左右前后车距
  • 魔兽十理由 让玩家钟爱一生
  • 游戏映射人生:WOW一定程度
  • 赛扬M440勇敢软超频25%!单
  • 用cci指标选出的股票

该作者的其他文章

    博主推荐

      相关日志

        随机阅读

          首页推荐

          • 梁洛施遭弃:灰姑娘童话破灭
          • 丰田又一次重美国轻中国?
          • 游越南遇翻船11死一生
          • 最具传奇色彩开国大将是谁
          • 春晚是赵家班世袭舞台?
          • 孙燕姿和妹妹私密合影
          更多>>





          对“推广广告”提建议

            《分析家3.0技术参考手册》  实战与指标

          《分析家5.0新公式系统帮助文件》

          公式探索 2009-06-01 10:50:28 阅读36 评论0   字号: 订阅

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

              例2:计算历史上阳线的平均涨幅和阴线的平均跌幅
               VARIABLE:UPR=0,UP=0,DNR=0,DN=0;
               R := CLOSE/REF(CLOSE,1)-1;
               IF CLOSE>OPEN THEN BEGIN
                          UPR := UPR + R;
                          UP := UP+1;
               END
               ELSE IF CLOSE                DNR := DNR + R;
                          DN := DN+1;
               END
               平均涨幅: IF(UP=0,0,100*UPR/UP);
               平均跌幅: IF(DN=0,0,100*DNR/DN);
          四.        循环
          1.        为什么要循环
              循环是计算机程序中一个最重要的概念,它使计算机能够按照用户的意
          志重复执行某个任务,我们前面所提到的公式系统中存在的隐含循环也是一
          种沿时间变化的循环。其实我们的函数中也大量包含了循环的概念,比如
          SUM、MA等等。我们来看看循环的概念。
              如果我们计算从1加到100,写成公式:
               1+2+3+4+5…+100;
              这个公式很长,而且写起来容易出错,如果我们是计算从1加到10000怎
          么办?这就需要用到循环,我们让计算机循环计算,总共循环10000次,其中
          第N次循环加N即可解决这个问题:
               FOR I=1 TO 10000 DO
                          SU := SU+I;
              等一会儿我们再来解释它。我们看到,有了循环以后,许多繁杂的事情
          都可以轻松解决了。由于以前没有循环,我们必须在函数内部来实现一些循
          环,现在有了它,我们可以省去好多函数。例如,SUM表示计算N天数值的总
          和,写成公式
               C + REF(C,1) + REF(C,2)+ … + REF(C,N-1);
              由于书写困难而且不灵活,我们引入SUM函数来计算。但是如果我们使用
          循环:
               SU := 0;
               FOR I=0 TO N-1 DO
                          SU := SU+REF(C,I);
              FOR循环表示,循环执行SU := SU+REF(C,I)这条语句,第一次循环变量I
          等于0,每次循环I递增1,直到大于N-1时循环结束。也就是说,REF(C,I)在
          每次循环中表示今天、昨天、前天…N-1天前的收盘价,将它们累加
          到SU变量中,完成了累加的功能。
              我们需要注意的是,此时的循环与公式中的隐含循环是不一样的,隐含
          循环不需要书写而且是不可避免的,而循环需要用循环语句写出来。循环语
          句所描述的循环,是针对某一根K线执行的,整个循环过程中其计算位置是不
          变的。因此,在整个隐含循环中,每进行一次隐含循环,就要执行一轮循环
          语句。因此,大量使用循环语句,尤其是嵌套循环语句将大大降低运算速度。
          我们可以来看看,如果某股票有3000根K线,我们在公式中包含一个100次的
          循环,则循环将执行3000*100=30万次,如果还存在循环嵌套,也就是循环套
          循环,如果内外均是100次的循环,则循环次数为3000*100*100=3000万次,
          其执行速度将非常缓慢。分析家系统限制总的循环次数要小于1亿次,否则不
          能得到计算结果。
              循环分为WHILE和FOR循环两种。
          2.        WHILE循环
                WHILE循环语法:WHILE [条件] DO [语句]
             它表示,如果条件成立则循环执行语句,直到条件不成立为止。例如我们
          计算最近多少天完成100%换手:
               HR := VOL;
               ND := 0;
               WHILE HR                ND := ND+1;
                          HR := HR + REF(VOL,ND);
              END
              ND就是结果。HR表示最近成交量累加,设初始值为当日成交量,然后循
          环直到它大于流通盘为止。循环体中,ND每次循环加1,HR每次循环加上ND天
          前的成交量,也就是说最近ND天的成交量累加。
              在循环中必须注意的是,循环条件在循环过程中一定要发生变化,并且
          会变成条件不成立,否则会形成死循环,也就是说循环条件永远成立,计算
          机不断地进行循环计算。
              在上例中,HR每次递增,当它增大到流通盘以上时,条件变成不成立,
          从而终止循环。另外一个我们没有注意到的问题是,如果今天是上市第一天,
          而且换手率没有达到100,则这个循环会出现问题,因为不论ND怎样增大,
          REF(VOL,ND)总是返回没有数值,也就是说HR的不到递增,也就永远无法破坏
          循环条件而终止循环,它也是一个死循环。因此我们需要改成:
               HR := VOL;
               ND := 1;
               WHILE HR                HR := HR + REF(VOL,ND);
                          ND := ND+1;
                END
             增加一个ND   从这些例子中我们看到,自己使用循环来实现算法,其功能是强大的,但
          是需要十分小心,避免死循环的发生。因此,我们能够使用函数来实现的功
          能,还是尽量使用函数来实现,避免不必要的复杂性。
          3.        FOR循环
              我们大多数的循环是指定循环次数的循环,而且我们证券计算也大量使
          用向前引用若干天的数据,因此 FOR循环将更加实用。
               FOR [变量]=[初值] TO [终值] DO [语句]
              它表示使用变量来控制执行循环语句,首先给变量赋初值,然后判断变
          量是否小于或等于终值,若满足条件则执行语句,然后将变量加1,循环判断
          变量是否小于等于终值并循环执行,直到条件不满足为止。例如
              FOR I=1 TO N DO…
             表示循环N次,循环变量从1到N,类似的
              FOR I=0 TO N-1 DO…
             也表示循环N次,但是循环变量从0到N-1。
             循环变量还可以从大循环到小,可以使用
              FOR [变量]=[初值] DOWNTO [终值] DO [语句]
             此时变量将从大到小变化,直到小于终值为止。
             我们在使用中需要注意递增还是递减变化,否则将形成死循环。
             使用FOR循环的一个最大的好处在于其循环次数可以控制,不像WHILE循环
          可能存在潜在的死循环。 还以WHILE循环中的换手100%为例:
              HR := 0;
              FOR I=0 TO BARPOS-1 DO BEGIN
                  IF HR        HR := HR+REF(VOL,I);
                  IF HR>=CAPITAL
                  ND := I+1;
                  END
              END
             我们用FOR循环来控制总的循环次数不超过数据总数,从而避免了死循环
          的发生。在循环中,如果换手未超过流通盘,则继续累加,当换手刚达到流
          通盘时,将循环次数赋给结果ND。
          4.        循环的终止
             我们看到,循环过程中必须要有一个终止循环的方法,WHILE语句中使用
          条件不满足来终止循环,FOR循环中使用变量递增递减来终止循环,是否还有
          其它的需要呢?
              我们看上面的例子,该循环有一个问题,就是无论是否计算出结果,循
          环都将继续下去,直到计算到上市第一天,这将大大降低效率。我们通过主
          动终止循环来解决这个问题:
               HR := 0;
               FOR I=0 TO BARPOS-1 DO BEGIN
                  HR := HR+REF(VOL,I);
                  IF HR>=CAPITAL BEGIN
                          ND := I+1;
                          BREAK;
                  END
               END
              执行BREAK语句将终止循环,无论循环中值条件是否达到。在本例中,当
          计算到结果,就停止循环。一般说来,BREAK语句总是与IF语句配合使用。使
          用BREAK语句可以使公式看起来更加简单。
               BREAK可以用来终止WHILE循环和FOR循环。
          5.        循环的嵌套
             我们可以在循环中再套入循环,这就叫做循环嵌套。例如我们想要找到最
          近100天中收盘价相同的天数:
              ND := 0;
              FOR I=0 TO 99 DO BEGIN
                  FOR J=I+1 TO 99 DO BEGIN
                  IF REF(CLOSE,I)=REF(CLOSE,J) THEN
                          ND := ND+1;
                          END
              END
             我们分成内外两个循环,外层循环使用I作为循环变量,它从0到99循环,
          得到之前每一天的收盘价REF(CLOSE,I),而内层循环使用J作为循环变量,
          它I+1到99循环,表示从第I+1天前开始查找等于第I天数值的K线,若找到
          (条件REF(CLOSE,I)=REF(CLOSE,J)满足),则将ND加1。
              使用循环嵌套,我们可以做许多过去无法做的事情了。但是使用嵌套一
          定要注意,不要是循环次数太大,否则运行速度会很慢。
          6.        循环举例
             例1.计算N日均线
              SU := 0;
              FOR I=0 TO N-1 DO
                  SU := SU+REF(CLOSE,I);
              SU / MIN(N,BARPOS);
             该例子中有两个技巧,其一,没有可以去避免向前循环超过上市日的问题,
          因为发生这样情况时SU的数值不会增加,也就是说SU等于上市到现在的总和;
          其二,如果当前位置小于N,则SU的数值表示上市到现在的总和而不是N日总
          和,所以平均价格应该为SU/BARPOS,因此我们使用了SU / MIN(N,BARPOS);
              例2.计算前十大股东占总股本的比例
               SU:=0;
               FOR I=1 TO 10 DO
                  SU := SU + PROFFIN(5002+(I-1)*6,0);
              比例: SU/PROFFIN(1001,0)*100;
             在本循环中使用了一个技巧,我们发现第一、第二、第三…股东持股量的
          代码是5002,5008,5014…,它们之间间隔6,所以我们可以使用5002+(I-1)*6
          来表示这些代码
          五.        新交易系统
          1.        新交易系统的设计目标
             在分析家过去的版本中,已经引入了交易系统这个概念,那时的交易系统
          实际上更象一个有买入和卖出条件的选股系统,主要解决了在什么情况下买
          入,在什么情况下卖出的问题。然而在实际交易的过程当中,我们必须要考
          虑仓位、资金、交易系统对当前股票的适应情况等等问题,从而决定我们应
          当在什么样的条件下,买入或卖
          出多少股票,在连续出现信号的情况下又该如何处理。
              新交易系统就是为了解决这些问题提出来的,它为我们提供了一整套交
          易需要的交易执行、交易状态函数,从而使我们能够根据当前行情状况、资
          金状况、持仓状况、盈利亏损状况等不同的情况,来决定我们应当如何操
          作,操作的价格和量都可以直接控制。
             可以说,新交易系统的提出,缩小了计算机交易和人为交易之间的差异,
          为用户实现系统交易方法提供了有力的保证。
          2.        新交易系统的买入和卖出
             新交易系统引入了四个买卖函数,它们分别是
              BUY(V,Type,P):买入
              SELL(V,Type,P):卖出
              BUYSHORT(V,Type,P):空头买入
              SELLSHORT(V,Type,P):空头卖出
             使用这四个函数是区别于新旧交易系统的关键,若需要使用旧交易系统则
          不能出现这四个函数。
             函数中第一个参数V表示买入量,它可以是一个具体的量或者是最大买入
          (卖出)量的某一比例。例如,BUY(1000)表示买入1000股,而BUY(30%)则表示
          用当前资金量的30%买入,SELL(100%)则表示将当前持仓量卖出。这个参数可
          以省略,若省略则表示100%。买入和卖出量如果超过资金量或持仓量,则按
          照最大可买入(卖出)量执行,买入量会自动取整到每手股数的整数倍,具体
          到A股就是100股及其整数倍,若少于100股则不买入。
             函数中第二个参数表示交易单据类型,它可以是以下几种:
          1.        THISCLOSE,收市价单,表示按照本周期收盘价交易;
          2.        MARKET,市价单,表示按照次周期开盘价交易;
          3.        LIMIT,限价单,表示次周期按照好于指定价格进行交易;
          4.        STOP,停损单,表示次周期按照差于指定价格进行交易;
             若本参数省略,则表示THISCLOSE。
             对于第3、4两种交易类型,还需要指定一个价格,那就是第三个参数P,
          它表示限定的价格是多少,可以使用任意合法的公式语句来设定。对于1、2两
          种交易类型,不能有第三个参数。例如BUY(100,LIMIT,CLOSE+0.1)表示在当
          前收盘价+0.1元的位置设定限价单,若次周期股价等于或低于这个价格,则
          买入100股。
             对于收市价单和市价单,它们所指定的价格是股价必然能够达到的,因此
          这两种单据是一定能够成交的,若考虑市场容量的问题,也只会影响到能够
          成交多少,但价格是可以保证的。有关市场容量的问题请参阅下一节中
          关于“市场容量”的描述。
             然而对于限价单和停损单,则不一定能够成交,因为我们设定了一个价
          格,若股价不能达到该限定价格,则这个单据将不能成交,我们称之为未成
          交交易。在系统指示中,这种交易将被显示成灰色,表示下了单但是没有
          成交。
             我们再来研究一下限价单和停损单的区别,我们说限价单就是要求成交价
          格好于指定价格,而好于这个概念对于买入和卖出,多头和空头是不一样的。
          对于买入来说,好于就是以更低的价格买入,而对于卖出来说就是以更高的
          价格卖出;对于空头买入卖出来说又正好相反,空头买入希望以更高的价格
          买入,以更低的价格卖出。在这里我们不用死记硬背,只要确定一点,那就
          是限价单表示成交的价格只能是期望价格更好,而停损单则指比期望价格更差。
             有人要问,更差的价格要来干什么?我们举个例子来看看,假如我们预计
          明天是一个转折点,若股价上涨则其涨幅可以达到8%以上,但如果不涨则可
          能下跌,此时我们应当设定一个停损单,设定价格在CLOSE*1.01,表示上涨1%
          后我再买入,这样就可以保证只有在上涨的情况下才进行交易。
             既然有了这些限制,所以限价单和停损单就有可能不能成交,例如我们设
          定收盘价限价单,但次日股价跳空上涨,其最低价都高于我们设定限价,当
          然也就不能成交。需要注意的是,使用限价单和停损单,有可能成交价格不
          是我们设定的价格,当开盘价满足我们的限定条件,则按照开盘价成交。例
          如设定10元的限价单,次日开盘价为9.5元,它已经满足条件,当然就按照
          它成交。
             这四个函数并不存在一般函数中的条件项,只要出现这个函数就立即执行
          买入或卖出,因此它们一般都会
          与IF语句相结合。总是以这种形式出现:
               IF cond THEN
                          BUY;
             表示当天价格满足的时候就买入。
             若当天出现多个买入语句,则每个买入语句均会被执行,因此用户需要注
          意区分不同情况。例如:
               IF CLOSE>OPEN THEN
                          BUY(1000);
               IF CLOSE>OPEN*1.02 THEN
                          BUY(2000);
             此时,若第二个条件满足则第一个也肯定同时满足,系统将下了两个买入
          单,共买入3000股。若这不是您所
          希望的,那么可能需要这样写:
              IF CLOSE>OPEN*1.02 THEN
                  BUY(2000);
              ELSE IF CLOSE>OPEN THEN
                  BUY(1000);
             另外,循环中不能有交易函数。
          3.        新交易系统设置
             资金问题:新交易系统引入了资金概念,也就是说可以设定初始投入资金
          量,该资金量将影响到每一次交易能否正常进行。每次买入,资金量减少,
          卖出则资金量又增加,若买入资金量不足,则在资金量允许的范围内调整买
          入量,甚至取消买入。这样就与我们实际操作更加接近。资金投入设定请按
          “设定”按钮进行设置。
             市场容量问题:设想交易系统发出信号,买入100000股某股票,但该股票
          当日成交量仅有80000股,则这个买入单是不能够成交的。一般认为,只要你
          的交易量达到当日成交量的10%以上,就会影响到该股票的走势,因此我们一
          般设定当日交易量要小于成交量的10%。交易量限制设定请按“设定”按钮进
          行设置。
             交易系统设置
             止损问题:过去,交易系统止损按照收盘价进行,这与实际情况有一定的
          差异,试想,若设定10%止损价位应当是当股价达到10%损失的时候就进行止
          损,而不是等到收盘再进行。因此,新交易系统的止损原则是,若开盘价达
          到止损条件,则按照开盘价止损,否则按照最接近止损设定的价格进行。连
          续买入和连续卖出问题:过去,交易系统发出买入信号,我们就全额买入,
          之后再发出信号就不再买入;发出卖出信号则全部卖出,不存在连续买入和
          卖出的问题。在测试平台中,引入了连续买入的概念,但其设置相对固定,
          不能模拟出更加精细的设置。新交易系统改变了这种状态,你可以不断地买
          入或卖出,只要资金或持仓条件满足。当然,这也就引出了一个成本计算的
          问题,如果经过多次交易后,我们的持仓成本是多少,这一单的利润是多少?
              成本问题:我们计算成本的方法是,每次买入就将新买入的股票与持有
          的股票进行加权平均,也就是
          (买入价*买入量+持仓量*持仓成本)/(买入量+持仓量);卖出时,无论盈利
          与否,当前持仓股票的成本不变。我们所有的盈利计算、止损价格计算均基
          于这个原则。
          4.        新交易系统状态函数
              这些状态函数描述了交易系统当前的状态,您可以根据这些状态来决定
          您的交易策略。状态函数包括:
               ENTERPRICE:买入价格,表示上次交易的买入价格。
               EXITPRICE:卖出价格,表示上次交易的卖出价格。
               CASH:现金存量,表示当前的现金存量。
               OPENPROFIT:浮动盈亏,表示当前持股的浮动盈亏,也就是当前持仓市
          值与持仓成本之差。
            HOLDING:当前持仓量,表示当前持有的股票股数。
            AVGENTERPRICE:平均买入成本,表示当前持有股票的平均买入成本
            ENTERBARS:买入位置,表示上次买入到当前的周期数。
            EXITBARS:卖出位置,表示上次卖出到当前的周期数.
            BESTTRADE:最大盈利,表示当前位置之前所有交易中盈利最大一次的利润额。
            BESTPERCNET:最大利润率,表示当前位置之前所有交易中利润率最大一次
                         的利润率。
            WORSTTRADE:最大亏损,表示当前位置之前所有交易中亏损最大一次的亏
                         损额。
            WORSTPERCENT:最大亏损率,表示当前位置之前所有交易中亏损率最大一
                          次的利润率。
            TOTALTRADE:交易次数,表示当前位置之前总共有多少次交易,注意每一
                         次卖出算一次交易,而买入不算。
            NUMWINTRADE:盈利交易次数,表示当前位置之前总共有多少次盈利的交易。
            NUMLOSSTRADE:亏损交易次数,表示当前位置之前总共有多少次亏损的交易。
            NUMSEQWIN:当前连续盈利次数,表示当前位置之前连续有多少次盈利的
                        交易。
            NUMSEQLOSS:当前连续亏损次数, 表示当前位置之前连续有多少次亏损的
                         交易。
            MAXSEQWIN:最大连续盈利次数,表示当前位置之前连续盈利交易的最大
                        次数。
            MAXSEQLOSS,最大连续亏损次数,表示当前位置之前连续亏损交易的最
                         大次数。
            PERCENTWIN,交易胜率,表示当前位置之前盈利交易占总交易次数的比例,
                         其数值在0—1之间。
          5.        新交易系统的K线指示
             使用系统指示功能,在K线图上显示新交易系统的交易指示与以往有些不
          同,主要表现在:
          1.交易指示的下面可以标注买卖量,买入用Bxxx表示买入若干股,而卖出
          用Sxxx表示卖出若干股。配合标注箭头旁的切入点指示小三角,可以方便地
          让用户看到每一个交易的交易价格和交易量。可以通过鼠标右键点取指示箭
          头并选择“系统指示显示买卖量”用来隐藏或显示买卖量。
          2.显示未成交的交易,过去只要条件满足,就显示买卖箭头,而不管该箭头
          是否能够成交;现在我们将不能够成交指示用灰色来显示,方便用户分析。
          可以通过鼠标右键点取指示箭头并选择“系统指示显示未成交交易”以隐藏
          或显示它们。
          3.设定资金投入日期,由于加入的资金策略,在什么时间开始计算(即投入
          资金时间)将会直接影响交易系统的计算,因此可以设定资金投入时间,方
          法是鼠标右键点取指示箭头并选择“设定系统指示开始计算时间”。缺省情
          况下使用股票上市时间。
          4.与新交易系统指示配合,系统加入3个内嵌指标,他们用来显示系统指示
          中第一个新交易系统的收益、利润、持仓状态。这三个指标分别是:PROFIT
          利润指标,显示交易系统的历史总盈利和持仓股票的浮动利润;MARKET浮动
          市值指标,显示交易系统的浮动市值和总市值,其区别在于后者只有卖出时
          才重新计算,而前者是随着股价的变化随时计算;HOLDING持仓量指标,显
          示持仓量的历史变化情况。这三个指标只有在交易系统指示中存在新交易系
          统是才有效。
          6.        新交易系统的测试
              新交易系统将资金模型、连续买入模型都已经放到公式中进行设定,因
          此在系统测试平台中有关资金模型、连续买入模型都被禁止,全市场模型也
          被禁止。
          7.        新交易系统指标
             配合新交易系统,分析家V5.0内嵌了三个指标,
          MARKET,PROFIT,HOLDING,当主图上系统指示中存在新交易系统时,用于指
          示该新交易系统的市场状态。
              MARKET指标描述了交易系统市值,它有浮动市值和总市值两条指标线。
          浮动市值表示现金+持有股票的市值,而总市值表示每次卖出后的总资产情况,
          而买入及持仓过程中的浮动市值不计算在内。PROFIT指标描述了每次交易的
          利润情况,它有利润和浮动利润两条指标线,利润表示每次卖出所产生的利
          润的累计,而浮动利润则表示当前持仓的浮动利润。
              HOLDING指标描述了持仓量,它表示当前持有股票的数量。
          8.        新交易系统举例
              例1:涨幅超过5%则以30%资金买入,超过8%则以50%资金买入,跌幅超过
          4%则卖出50%,跌幅超过8%则全部卖出。买入使用限价单,卖出使用收市价单:
               PR := (CLOSE/REF(CLOSE,1)-1)*100;
               IF PR>8 THEN
                  BUY(50%,LIMIT,CLOSE);
              ELSE IF PR>5 THEN
                  BUY(30%,LIMIT,CLOSE);
              ELSE IF PR<-8 THEN
                  SELL(100%);
              ELSE IF PR<-4 THEN
                  SELL(50%);
             例2:若5日均线与20日均线金叉,则增加持仓量一倍,至少买入1000股。
               IF CROSS(MA(CLOSE,5),MA(CLOSE,20)) THEN
                  BUY(MAX(HOLDING,1000));
             这样碰到连续买入信号时,其买入量为1000股,1000股,2000股,4000股…
          六.        字符串
          1.        字符串的定义
             在公式中,我们有时候需要输出一些文字,这就需要使用字符串。字符串
          常量我们在过去的版本中已经存在,就是使用单引号“’”括起来的字符,
          这些字符可以在文字输出函数等地方直接使用。
             在分析家5.0新公式系统中,我们引入字符串变量这个概念,它可以像数值
          变量一样自由改变,可以根据具体情况赋给不同的数值。字符串变量和普通变
          量一样可以赋值、运算、赋初始值等等。例如:
              S := 'CCC’;
             我们将变量S赋值'CCC’;
              VARIABLE: S=’ABC’;
             表示我们定义了一个字符串变量S,给它赋初始值'ABC’;
              S := STKNAME+ ' ’ + STKLABEL;
             字符串S等于股票名称后跟股票代码。
             我们可以像使用字符产常量一样使用字符串变量,例如在DRAWTEXT函数中。
          2.        字符串的计算
             字符串可以进行计算,包括字符串比较、求字符串子串、大小写转化、字
          符串查找等等。字符串的比较是以字母表为顺序的,越靠后的越大,小写字
          母都大于大写字母。例如:
              STRCMP('ABC’,’abc’);
             比较两个字符串,显然小写字母大于大写字母,所以函数返回1。
             在分析家公式系统中引入字符串加法的概念,就是将后面的字符串连接到
          前面字符串的尾部,我们使用的一个简单的办法:用加号,例如
              S := STKNAME+ '的代码是’ + STKLABEL;
             使用加号直接将后面字符串接到前面字符串的尾部,对于浦发银行来说,
          字符串S等于“浦发银行的代码是600000”。
             更为强大的是,字符串加法还可以直接加数值型的数据。例如:
              S := ’今天收盘价:’ + CLOSE;
             系统会将收盘价CLOSE的数值转化为字符串连接进来。所以,当我们看到
          一个字符串加上数值的时候,千万不要以为这是普通的加法。除了这种隐含
          的转化方法外,我们还可以用函数NUMTOSTR将数值强制转化为字符串,例如:
               S := NUMTOSTR(CLOSE);
             或者将字符串转化为数值STRTONUM。
          七.        数组
             本节内容较复杂,一般用户可以跳过本节。
             所谓数组,就是一个容器,它可以存放多个数据,我们可以通过序号来访
          问这些数据。一般说来我们总是将一些相关的数据组织在一起放到数组中,
          当我们在使用循环的时候,数组就可以发挥它的优势。分析家公式系统目前
          支持一维数组。数组在使用之前一定要先声明:


               VARIABLE: V[20]=0;
             表示定义一个数值型数组V,它总共有20个元素,这些元素的初始值为0。
               VARIABLE: S[10]=’A’;
             表示定义一个字符串型数组S,它总共有10个元素,这些元素的初始值
          为’A’。数组变量声明以后,就可以像普通变量一样使用了。在使用数组变
          量时,需要在变量名后面带上序号,表示引用数组中的第几个元素,元素的
          序号从1开始。例如:
               P:= V[5]*CLOSE;
             表示V的第5号元素乘以收盘价。
             数组和普通变量有一个重要的区别,数组是不能够引用过去的数值的,对
          数组进行引用过去数值的操作将会得到它当天的数值,就是说数组只存在当
          天的数值,从某种意义上来说它更像一个可以重新赋值的常量。因此,
              REF(V[3],1);
              MA(V[2],10);
             等均会返回一个常数。如果你需要引用过去的数值,可以将数组元素赋值
          给一个普通变量,例如:
              P:=V[3];
              MA(P,10);
          使用数组以后,我们可以利用数组的序号来访问数据,这给循环带来了方便,
          我们通过循环可以遍历整个数组了。
          八.        专业财务数据
             在分析家机构版中,内嵌了二百多项专业财务数据。这些专业财务数据包
          含了每只股票历史上的每一次变化,对于注重基本分析的用户,我们提供了
          一整套结合技术分析、基本分析的公式平台。
             专业财务数据包括七个函数,分别用来访问、设定专业财务数据。所有的
          财务数据均带有一个数据类型参数,它表示需要访问具体哪一个数据,
          例如1001表示总股本,5001表示第一大股东名称等等。这些函数包括:
             PROFFIN(N,M), PROFSTR(N,M)访问专业财务数据的数值,它们的区别在于
          前者得到数值型的财务数据,后者得到字符型的财务数据。N表示数据类型,
          M表示哪一期数据,0表示最近一期,1表示前一期。
             PROFFINON(N,Y,MD), PROFSTRON(N,Y,MD)访问指定日期的财务数据,它们
          的区别在于前者得到数值型的财务数据,后者得到字符型的财务数据。N表示
          数据类型,Y表示年,MD表示月日,
             例如PROFFINON(1001,2001,0101)表示2001年1月1日的总股本。
            SETPROFFIN(X)用来设定财务数据属性。财务数据包括季报、中报和年报,


          适用本函数可以决定是否需要它们中的哪一些类型。X是一个五位数,每一位
          表示不同的含义,最高位表示是否调整中报季报数据(分别对1季报、中报和3
          季报的部分财务指标做乘以3、2、4/3的处理),次高位表示是否包含最新财务
          指标,最低三位表示是否包含季报、中报和年报。这些位置如果为1就表示设
          置,如果为0就表示不需要。例如:01111就表示不对季报中报调整,数据包
          含全部的年报中报和季报;00001表示只需要年报。使用本函数后,其它专业
          财务数据函数将受到它的影响。
          九.        其它
          1.        数据二
             我们经常需要分析两只股票之间的关系,比如它们之间的相关性、贝塔系
          数等,新公式系统引入数据二概念,它在公式中代表另外一只股票,这只股
          票可能是K线图上叠加的股票,或者相关性分析中的相关股票。语法:
             DATA2.[数据]
             其中数据可以是CLOSE、OPEN、HIGH、LOW、VOLUME或AMOUNT,表示引用数
          据二的开盘价、收盘价等。例如我们可以计算两只股票收盘价之比:
              CLOSE/DATA2.CLOSE;
             数据二对于相关性分析很重要,所谓相关性就是两个数据的相似程度,该
          数值分布在-1到+1之间,若等于+1表示两者完全相同,若等于-1表示两者完
          全相反,若等于0表示二者无关。一般说来,两只股票收盘价的相关性会
          在0—1之间。相关函数:
              RELATE(P1,P2,N);
             表示P1和P2之间在最近N天的相似程度。
            使用相关性分析不同的数据,得到的意义是不一样的。例如收盘价相关性:
              RELATE(CLOSE,DATA2.CLOSE,60);
            他描述了两只股票价格走势的相似性,也就是说基本形态走势相像。而涨
          跌幅相关性:
              RELATE(CLOSE/REF(CLOSE,1),DATA2.CLOSE/REF(DATA2.CLOSE,1),60);
             表示每日涨跌的相似性。使用该指标所得到的结果可能看起来走势不是十
          分相似,但在多数情况下它们的涨跌情况是接近的,也就是说同涨同跌。
             如果用其它的指标来计算相关性,则其结果可能更难理解,但是真正掌握
          两只股票某种属性的相似可能会对你的投资带来很的大改变。
          2.        自定义数据
             分析家机构版V5.0引入自定义数据概念,用户可以利用该功能自己设定若
          干数据。自定义数据可以从F10资料中提取,可以使用公式计算得到,可以从
          文本文件引入,也可以自己手工输入。该数据是基于日线的,也就是说我们


          只能在日线分析周期中使用它。
             自定义数据分为四类,分别是
          1.        股票相关序列数:每一只股票均有它自己的一组数据,每天一个数
          据,它和扩展数据非常类似,我们可以用它来存储每日成交笔数、某公式计
          算结果等数据。
          2.        股票无关序列数:所有股票共用一组数据,每天一个数据,它主要
          用来存储与市场相关的数据,例如每天的流通市值等。
          3.        单值数据:每一只股票均有它自己的一个数据,该数据并不随时间
          发生变化,例如我们可以用它来存储发行价、中签率等。
          4.        字符串数据:每一只股票均有它自己的一个字符串数据,该数据并
          不随时间发生变化,例如我们可以用它来存储板块类别、法人代表等。
          用户可以根据自己的需要,设定自定义数据类型,对于从F10提取或使用公式
          计算得到的自定义数据,可以设定自动更新,当执行收盘作业时,系统将自
          动执行自定义数据的刷新工作。每一个自定义数据均有一个名称,我们总是
          通过它来访问自定义数据。在公式系统中,使用SELFDATA来访问数值型的自
          定义数据,而使用SELFSTRING来访问字符串型的自定义数据。在动态显示牌
          中,我们也可以直接显示自定义数据,方法是用鼠标右键点击标题栏,选择
          自定义数据并且选中需要的项目即可。
          3.        交易系统介入点设定
             分析家新公式系统中,新增交易系统介入点设定关键字,放在买入、卖出
          条件之后,用逗号将它们隔开,描述方法类似颜色、线型描述符。接入点关
          键字分为前后两个部分,前半部分描述时本周期介入还是次周期介入,后半
          部分描述以什么价格介入,具体如下:
             前半部分:THIS—本周期;NEXT—次周期。
             后半部分:MID—中价;CLOSE—收盘价;OPEN—开盘价;HIGH—最高价;
          LOW—最低价。
             前后两部分直接连接,中间不能有间隔。例如:
               ENTERLONG: CLOSE>OPEN, NEXTOPEN;
             表示如果收阳线,则在次日以开盘价买入。
          4.        数据引用
             公式中会大量使用数据引用函数REF,比较麻烦。现在可以在函数调用之
          后加上方括号表示向前引用,起作用和REF函数一样。例如:
              REF(CLOSE,10)可以写成CLOSE[10]
              REF(MA(CLOSE,10),100)可以写成MA(CLOSE,10)[100]
             需要注意方括号在数据引用与数组下标之间的区别。二者形式一样,但方
          括号跟在函数后面就是引用,而跟在数组变量后面就是下标。
          5.        坐标设定
             分析家新公式系统中,坐标设定采用公式来实现,方法是:
              REFLINE:L1,L2,…LN;
             表示在L1、L2、…LN处绘制水平坐标线。
          6.        宏定义
             在许多计算机语言中,均提供了宏定义,用于简化公式中大量重复语句的
          书写,提高程序的可读性。分析家新公式系统也提供了宏定义给用户使用,
          语法是:  #define X Y 它表示,将Y定义为X,今后凡是书写X,就把它当作
          Y来处理。宏必须定义在整个公式代码的最前面。
              比方说 #define MMA  MA(MA(CLOSE,10),10) 表示今后凡是需要
          MA(MA(CLOSE,10),10)计算的地方均可以用MMA来代替,直接写MMA即可。宏定
          义也可以带参数,在公式编译的时候将宏定义中的参数用实际参数来替代。
          例如以下定义: #define MMA(x,y) MA(MA(CLOSE,x),y)x,y就是宏参数,在
          使用时需要用实际的参数来替代,
          例如:MMA(10,20)就表示MA(MA(CLOSE,10),20),再宏展开时用10代替了参
          数x,用20代替了参数y。如果我们需要定义的宏很长,在一行里书写比较困
          难,可以用续行符“\”放在需要许行的最后位置,就可以将下一行接到宏定
          义中。
             例如:#define BBY(x)  IF CLOSE>OPEN THEN BEGIN\
                          IF CLOSE>OPEN*1.08 THEN \
                     BUY(2*x); \
              ELSE \
                  BUY(x); \
                  END
             由于每一行的结尾均有一个续行符“\”,因此BBY宏就代表了整个这六行
          代码。今后凡是需要书写着六行代码,只需要书写BBY即可。
             对于需要重复书写的代码,可以采用宏定义,将重复的代码定义为宏,这
          样可以大大减少代码量,同时也可以提高公式的可读性。
          十.        调试
          1.        为什么需要调试
             公式系统是一个简单的程序设计环境,只要是程序设计就有可能出现差错,
          有可能出现没有想到的问题,因此多数程序设计工具均提供一个调试工具,
          让用户可以一步一步地执行程序,查看中间结果等等。
             分析家新公式系统为用户提供了一个强大的设计环境,当然需要提供一个
          调试器用以查找错误。利用分析家公式调试器,你可以单步执行公式程序、
          连续单步执行、查看变量数值、设置断点,可以方便查看到公式中的任何数
          值是怎样计算出来的,分支是怎样执行的,循环指定了多少次等。
          2.        调试前的准备工作
             当你使用专业公式编辑器写完一个公式,或者打开一个现有的公式,即可
          进入调试。若你的公式没有语法错误,从菜单、工具条选择调试功能,或者
          直接按F6即可进入调试。进入调试状态后,公式编辑窗口下面出现两个小窗
          口,分别是变量窗口和图形窗口。
             左边的窗口是变量窗口,变量窗口显示公式中所有的变量及其属性、
          数值,鼠标双击变量可以弹出窗口显示该变量的详细数值,而在执行过程中
          若数值发生变化就会用红色来显示数值。右边的窗口是图形窗口,它的上半
          部分显示待计算的股票K线图,下半部分显示变量数值曲线。在变量窗口中打
          勾的变量将被显示,用鼠标点击变量前的方块可以改变其显示属性。用鼠标
          点击图形窗口右侧的股票名称、分析周期可以改变待计算的股票或分析周期。
             此时公式第一行的左侧线是一个黄色箭头,它表示当前正在准备执行该语
          句。我们在整个调试过程中可以看到该标志随着执行过程不断在移动。
          3.        运行
          调试准备好以后,按F5就可以执行了,此时公式将很快被执行完,然后停在
          程序的最后一行,此时你可以查看变量内容和图形。
             如果按Ctrl+F5表示重新执行程序,系统将重新启动公式并且停留在第一
          行等待执行。
             如果按Shift+F5表示停止执行,这对于跳出一个长时间的循环非常有用。
          4.        单步运行
             从菜单、工具条选择单步执行,或者按F11可以单步执行,此时每按一次
          执行一条语句,在执行过程中可以方便地了解到变量的计算过程,程序的执
          行流程等。我们还可以选择连续单步执行来让电脑自动进行单步运行,此是
          可以将双手解放出来。我们会发现,当公式执行到最后一行以后,它有跳回
          到第一行执行,这和一般的程序可不一样!细心的你可能已经发现,在右下
          角图形成口中的红色箭头已经悄悄地向右移动了一天,这就是我们所说的隐
          含循环。程序从第一行执行到最后一行,然后计算第二天的数据,又从程序
          第一行开始执行了。
          5.        执行到指定目标
             有时候程序比较长,或者循环太多,使用单步太慢,可以使用执行到指定
          目标,移动光标到你需要的程序行,然后按F7,公式将执行到该行后停下。
          6.        设置断点
             断点就是程序每次执行到该行就停下,与F5连续执行配合可以提高工作效
          率。将光标移到需要设定断点的位置,按F9可以设定或取消断点。断点所在
          行的左边会有一个紫红色的圆形,表示该行被设置了断点。
          7.        查看变量内容
             当程序运行到某处停下来后,鼠标双击变量窗口的某变量,可以查看变量
          内容。对于简单变量,变量窗口中已经显示了它的数值,但对于序列数、数
          组等变量,可以使用本功能详细了解变量的每一个元素的内容。
          8.        运行到指定时间
             我们说过,公式中存在一个隐含循环,公式是一天一天执行的。当我们需
          要执行到时间相对靠后的数据时,可能需要的循环次数就很多,此时可以有
          鼠标右键点击图形窗口中的你所需要的K线的位置,从弹出菜单中选择执行到
          该K线或者指定到指定日期就可以跳过前面不必要的循环。
          十一.        综合举例
          1.        均线系统
             在以往均线系统的编制需要用到函数MA(X,N),该函数表示求X的N日内平
          均值。在新公式系统中,没有函数照样可以实现MA(CLOSE,N)。
              INPUT:N(5,1,300); {参数申明}
              VARIABLE:K=0; {变量申明}
              FOR I=0 TO N-1 DO K:=K+REF(CLOSE,I);{把最近 N 天的收盘价累加}
              MA1:K/N; {实现MA(C,N)}
              K:=0;
          2.        指数平滑移动平均线
             指数平滑移动平均线与上面的简单均线系统相比,主要在于均线的算法略
          有区别,简单均线只是将N日内的收盘价相加然后平均,而指数平滑移动平均
          线中包含昨日的该数值,因此理论上比简单平均更有价值。
             指数平均的算法为:
              若Y=EMA(X,N),
             则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。
             如果不使用EMA函数, EMA(CLOSE,N)在新公式系统中可以这样书写:
              INPUT:N(5,1,300);
              VARIABLE:EMA1=0; {初始化变量}
              EMA1:(2*C+(N-1)*EMA1)/(N+1);  {新公式系统中可以直接迭代,表示指
          标EMA1由昨天的EMA1的一种算法得到
          3.        宝塔线(鬼变脸)
             如果昨天宝塔线是红的,以“昨顶端”为“今开端”,以“昨底端”为
                “今敏感”;
             如果昨天宝塔线是绿的,以“昨底端”为“今开端”,以“昨顶端”为
                 “今敏感”;
             如果昨天宝塔线是变色的,则以“昨敏感”为“今敏感”,以强化宝塔线
          的“隔日纠错功能”。
             要实现上面的功能,需要根据昨天宝塔线的状态来画今天的宝塔线,在老
          公式系统中无法实现这样的功能。在新公式系统中,可以通过分支语句和迭
          代的方式实现:
             VARIABLE:SENSITIVY=-1,TOWERO=0,TOWERC=0,DIRECTION=1;
             IF BARSCOUNT(C)=0 THEN BEGIN
               TOWERO:=O;
               TOWERC:=C;
             END;
             IF TOWERC>TOWERO AND NOT(BETWEEN(SENSITIVY,TOWERO,TOWERC)) THEN
               DIRECTION:=1;
          ELSE IF TOWERC     DIRECTION:=0;
             ELSE DIRECTION:=REF(DIRECTION,1);
             IF NOT(REF(BETWEEN(SENSITIVY,TOWERO,TOWERC),1)) THEN BEGIN
               TOWERO:=REF(TOWERC,1);TOWERC:=C;
               SENSITIVY:=REF(TOWERO,1);
             END ELSE BEGIN
               TOWERO:=REF(TOWERC,1);TOWERC:=C;
               SENSITIVY:=REF(SENSITIVY,1);
             END;
            IF BETWEEN(SENSITIVY,TOWERO,TOWERC) THEN BEGIN
               STICKLINE(BETWEEN(SENSITIVY,TOWERO,TOWERC),MAX(TOWERO,TOWERC),
                 SENSITIVY,7,0), COLORRED;
               STICKLINE(BETWEEN(SENSITIVY,TOWERO,TOWERC),MIN(TOWERO,TOWERC),
                 SENSITIVY,7,0), COLORGREEN;
            END ELSE BEGIN
               STICKLINE(SENSITIVY     STICKLINE(SENSITIVY>TOWERC,TOWERO,TOWERC,7,0), COLORGREEN;
            END;
          STICKLINE((TOWERC=TOWERO OR SENSITIVY=TOWERC) AND DIRECTION=1,
               TOWERO,TOWERC,7,0),COLORRED;
          STICKLINE((TOWERC=TOWERO OR SENSITIVY=TOWERC) AND DIRECTION=0,
               TOWERO,TOWERC,7,0),COLORGREEN;
          4.        自动在MACD指标图上标注现在是处于0轴以下的第几次金叉]
              INPUT:LONG(26,20,100,1),SHORT(12,5,40,1),M(9,2,60);
              VARIABLE:I=0;
              DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG);
              DEA  : EMA(DIFF,M);
              MACD : 2*(DIFF-DEA), COLORSTICK;
              JC:=CROSS(DIFF,DEA);
              SC:=CROSS(DEA,DIFF);
              JCCOUNT:=COUNT(JC,BARSLAST(DEA>0));
              TEXT:=NUMTOSTR(JCCOUNT);
              DRAWTEXT(DEA<0 AND JC,DEA*0.8,TEXT); 0人  |  分享到:          阅读(36)| 评论(0)| 引用 (0) |举报    《分析家3.0技术参考手册》  实战与指标

          历史上的今天

          相关文章

          • 循环结构2010-10-16 06:51:04
          • 变量、常量2007-12-07 22:53:01
          • 第九讲 循环语句2010-09-15 15:03:52
          • (七) for 循环2010-10-22 23:16:43
          • 水晶报表公式必读2010-10-29 15:18:11

          最近读者

          登录后,您可以在此留下足迹。

          评论

          点击登录|昵称: