




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大智慧股票公式之循环语句1. 为什么要循环循环是计算机程序中一个最重要的概念,它使计算机能够按照用户的意志重复执行某个任务,我们前面所提到的公式系统中存在的隐含循环也是一种沿时间变化的循环。其实我们的函数中也大量包含了循环的概念,比如SUM、MA等等。我们来看看循环的概念。如果我们计算从1加到100,写成公式:1+2+3+4+5+100;这个公式很长,而且写起来容易出错,如果我们是计算从1加到10000怎么办?这就需要用到循环,我们让计算机循环计算,总共循环10000次,其中第N次循环加N即可解决这个问题:FOR I=1 TO 10000 DOSU := SU+I;等一会儿我们再来解释它。我们看到,有了循环以后,许多繁杂的事情都可以轻松解决了。由于以前没有循环,我们必须在函数内部来实现一些循环,现在有了它,我们可以省去好多函数。例如,SUM表示计算N天数值的总和,写成公式C + REF(C,1) + REF(C,2)+ + REF(C,N-1);由于书写困难而且不灵活,我们引入SUM函数来计算。但是如果我们使用循环:SU := 0;FOR I=0 TO N-1 DOSU := 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 HRND := ND+1;HR := HR + REF(VOL,ND);ENDND就是结果。HR表示最近成交量累加,设初始值为当日成交量,然后循环直到它大于流通盘为止。循环体中,ND每次循环加1,HR每次循环加上ND天前的成交量,也就是说最近ND天的成交量累加。在循环中必须注意的是,循环条件在循环过程中一定要发生变化,并且会变成条件不成立,否则会形成死循环,也就是说循环条件永远成立,计算机不断地进行循环计算。在上例中,HR每次递增,当它增大到流通盘以上时,条件变成不成立,从而终止循环。另外一个我们没有注意到的问题是,如果今天是上市第一天,而且换手率没有达到100,则这个循环会出现问题,因为不论ND怎样增大,REF(VOL,ND)总是返回没有数值,也就是说HR的不到递增,也就永远无法破坏循环条件而终止循环,它也是一个死循环。因此我们需要改成:HR := VOL;ND := 1;WHILE HRHR := 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 BEGINIF HRHR := HR+REF(VOL,I);IF HR=CAPITALND := I+1;ENDEND我们用FOR循环来控制总的循环次数不超过数据总数,从而避免了死循环的发生。在循环中,如果换手未超过流通盘,则继续累加,当换手刚达到流通盘时,将循环次数赋给结果ND。4. 循环的终止我们看到,循环过程中必须要有一个终止循环的方法,WHILE语句中使用条件不满足来终止循环,FOR循环中使用变量递增递减来终止循环,是否还有其它的需要呢?我们看上面的例子,该循环有一个问题,就是无论是否计算出结果,循环都将继续下去,直到计算到上市第一天,这将大大降低效率。我们通过主动终止循环来解决这个问题:HR := 0;FOR I=0 TO BARPOS-1 DO BEGINHR := HR+REF(VOL,I);IF HR=CAPITAL BEGINND := I+1;BREAK;ENDEND执行BREAK语句将终止循环,无论循环中值条件是否达到。在本例中,当计算到结果,就停止循环。一般说来,BREAK语句总是与IF语句配合使用。使用BREAK语句可以使公式看起来更加简单。BREAK可以用来终止WHILE循环和FOR循环。5. 循环的嵌套我们可以在循环中再套入循环,这就叫做循环嵌套。例如我们想要找到最近100天中收盘价相同的天数:ND := 0;FOR I=0 TO 99 DO BEGINFOR J=I+1 TO 99 DO BEGINIF REF(CLOSE,I)=REF(CLOSE,J) THENND := ND+1;ENDEND我们分成内外两个循环,外层循环使用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 DOSU := 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 DOSU := SU + PROFFIN(5002+(I-1)*6,0);比例: SU/PROFFIN(1001,0)*100;在本循环中使用了一个技巧,我们发现第一、第二、第三股东持股量的代码是5002,5008,5014,它们之间间隔6,所以我们可以使用5002+(I-1)*6来表示这些代码分支1. 为什么要分支所谓分支,就是如果满足某个条件就执行某些指令,否则就指令另外一些指令。有了分支,计算机就有了智能,知道根据具体情况作出不同的动作,这是计算机最重要的功能之一。2. 以前我们是怎样实现分支的过去,我们也在函数中隐含地使用了一些分支概念,在函数中直接将分支包含进去。例如绘图函数DRAWTEXT(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,否则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这样一个语句来形成组合语句,也就是说将它们中间所包含的语句看作一个整体,一起执行。组合语句被认为是一个整体,在接下来的分支、循环等操作中均需要用到。例如:IF CLOSEOPEN THEN BEGINP := P+1;Q := MA(CLOSE,10);END它表示如果条件成立,将执行对P和Q的赋值语句,否则这两条语句均不执行。BEGINEND语句可以嵌套,END与之前面最接近的还没有配对的BEGIN进行配对。例如:IF CLOSEOPENTHEN BEGIN (1)P := P+1;IF CLOSE10 THEN BEGIN (2)P := P+1;Q := MA(CLOSE,10);END (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 CLOSEOPENTHEN (1)P := P+1;ELSE IF CLOSEQ := 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 CLOSEREF(CLOSE,1) THENUP := UP+1;ELSEIF CLOSEDN := DN+1;RATIO: IF(DN=0,0,UP/DN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 排水系统运维人员培训方案
- 分布式光伏系统防雷接地设计方案
- 污水管网材质选型与采购方案
- 低空经济产业园客户服务体系方案
- 校园餐成本精细化控制实施方案
- 综合管网与智慧城市系统对接技术方案
- 石英岩矿复垦绿化实施技术方案
- 环保设备合规性环保指标管理方案
- 污水处理厂土建工程施工组织方案
- 多部门协同办公的通讯录管理系统
- 2025北京京剧院招聘工作人员10人笔试备考题库及答案解析
- 配电柜组装基本知识培训课件
- 林业安全知识培训教育课件
- 工商注册知识培训课件
- 隐患排查治理奖励制度
- 学校食堂清洗消毒工作流程培训测试题及答案
- 计算机组装及维护试题库附带答案总结全面
- 武汉公积金基本知识培训课件
- 校园消防安全知识培训主要内容
- 校园垃圾清运应急预案演练(3篇)
- 楼盘销售技巧培训课件
评论
0/150
提交评论