搜索
查看: 9321|回复: 18

〓〓 飞狐交易师 公式系统,循环、分支语句入门二 〓〓

[复制链接]

签到天数: 103 天

发表于 2004-8-1 10:00 | 显示全部楼层

〓〓 飞狐交易师 公式系统,循环、分支语句入门二 〓〓

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:冰火岛坐看云起 浏览:9321 回复:18

感谢南客老师!

飞狐公式系统,循环、分支语句入门二



  上一讲,介绍了序列变量、数组等概念,这一讲介绍循环语句。
  1、FOR递增循环:
先从一个的实例开始,求当前股票收盘价的2日算术平均价,为了方便起见,以刚上市不久的600340国祥股价来说明,首先定义序列变量fc为收盘价,根据上一讲我们知道,fc可以看成是一个数组,因此,数组fc的每一个元素如下表所示:

600340        国祥股份
             时间        收盘
fc[1]         2003/12/30        8.92
fc[2]         2003/12/31        8.96
fc[3]         2004/01/02        9.25
fc[4]         2004/01/05        9.64
fc[5]         2004/01/06        9.92
fc[6]         2004/01/07        9.74
fc[7]         2004/01/08        10.44
fc[8]         2004/01/09        9.99

  显然, 2日平均收盘价必须是从第2根K线即上市后第2日开始,到最后一天结束,设2日平均股价用序列变量ma2来表示,由于2日平均收盘价等于当日收盘价加昨收盘除以2,如果手工一行一行来写代码计算,则:
ma2[2]:=(fc[1]+fc[2])/2;  //今收盘与昨收盘之和除以2,等于今2日平均收盘价
ma2[3]:=(fc[2]+fc[3])/2;
ma2[4]:=(fc[3]+fc[4])/2;
ma2[5]:=(fc[4]+fc[5])/2;
ma2[6]:=(fc[5]+fc[6])/2;
ma2[7]:=(fc[6]+fc[7])/2;
ma2[8]:=(fc[7]+fc[8])/2;

  分析上面代码,2日平均价的计算特点是:
  ①从第2根K线开始计算的
  ②每天的均价都等于(今收盘+昨收盘)/2
  ③直到最后1根K线结束
  容易知道,如果有1000根K线,则要写999行代码,显然效率太低了。
我们来找找规律,如果是中间的某天即第i天,则上面的表达式可以写为ma2:=(fc[i-1]+fc)/2,这个i是从第2根K线开始直到最后1根K线。这些计算都是重复同样的计算,只不过i不同罢了。如果有一种方法,可以自动重复计算这些表达式,并且每重复一次,i自动增加1,就可以达到目的了。由此我们定义一种循环语句,可以自动循环重复运行某一行代码。在飞狐中,循环语句有2种,下面先介绍FOR循环语句

语法:FOR var=n1 TO n2 DO expr;
从 var=n1 开始到 var=n2 开始循环执行 expr 语句,每执行一次var加1。这里,var称之为循环变量。

  用循环语句表达上面计算2日平均收盘价,公式代码如下:
fc:=close;  //定义序列变量为收盘价
for  i=2  to  datacount  do  ma2 : (fc[i-1]+fc)/2;
//从i=2到i=datacount循环执行ma2 : (fc[i-1]+fc)/2

  在飞狐中新建一个主图叠加公式,如下图所示,正是我们所需要的结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 10:02 | 显示全部楼层
2、FOR递减循环:
  上面的FOR循环,循环变量是每次递增1,可称之为递增FOR循环。还有一种FOR循环是递减FOR循环,循环变量是每次递减1,语法如下:
  FOR var=n1 DOWNTO n2 DO expr2;
  从 var=n1 开始到 var=n2 开始循环执行 expr 语句,每执行一次var减1
  上面我们设计2日平均收盘价的公式时,是从前面往后面计算的,仔细想想,其实也可以从后面往前面计算,公式代码如下:
  
  fc:=close;
  for i=datacount downto 2 do ma2 : (fc[i-1]+fc)/2;
  
  新建一个公式,输入上面代码,验证一番,结果如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 10:06 | 显示全部楼层
咦?什么也没有显示,是怎么回事?
  问题出在ma2,ma2在这里事先没有定义,飞狐不知道ma2是什么变量,因此无法输出。改写公式代码如下:
  
ma2:=close;  //定义序列变量ma2等于收盘价
fc:=close;
for i=datacount downto 2 do ma2:(fc[i-1]+fc)/2;

[ Last edited by 冰火岛坐看云起 on 2004-8-1 at 10:09 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 10:07 | 显示全部楼层
现在有输出了,但仔细观察,还有点问题,第1根K线的位置应该没有输出才行,现在却有输出?
  
  3、序列变量下界语句:
  原因是我们把ma2定义成序列值收盘价,在上面的循环代码中,只是从第2根K线开始计算均价,第1根K线的位置没有计算,仍然保留了原来收盘价的数值。怎样去掉第1根K线位置的数值,使得ma2的起始有效位置是从第2根K线开始的?使用下面的语句就可以实现:
  
  设置序列变量下界(有效数据起始下标),函数返回序列下界
  用法:
  SETLBOUND(X,N),设置序列变量X的下界(最小下标),N为0或N超过上界则整个序列数据都无效例如:
  VAR1:C;n1:=SETLBOUND(VAR1,10);
  
  用“设置序列变量下界”语句setlbound(x,n),改写上面的公式,代码如下:
ma2:=close;  //定义序列变量ma2等于收盘价
aa:=setlbound(ma2,2); //设置序列变量ma2的下界为2,起始有效位置是从第2根K线开始
fc:=close;
for i=datacount downto 2 do ma2:(fc[i-1]+fc)/2;

[ Last edited by 冰火岛坐看云起 on 2004-8-1 at 10:08 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 10:08 | 显示全部楼层
这个结果就对了!但大家可能会有疑问了,在前面递增循环中,ma2同样没有事先定义,结果却是正确的,这是为什么?回顾一下前面递增循环的代码:
  fc:=close;  //定义序列变量为收盘价
  for  i=2  to  datacount  do  ma2 : (fc[i-1]+fc)/2;

  这里ma2是从前面往后面计算的,对于这种情况,即如果是前面往后计算,则第1次遇到ma2时,就默认把ma2定义成是序列变量,并把首次计算ma2的位置作为ma2的起始有效位置。如果是递减循环,就不会这样处理。
  至此我们体会到了循环语句的强大功能了,不过,大家可能还会产生一个疑问,上面的循环语句,只是让一条语句重复计算,如果我们想让多条语句同时进行重复计算,可以吗?
  
  4、复合语句:
  答案是肯定的,请看下面的语句:
  
  把多条语句看作一条语句
  语法:BEGIN...END
  这里,begin和end是成对出现的,被begin和end包围起来的语句可以有很多条,这些语句可以看成是一条复合语句。下面我们用begin…end来改写递增循环计算2日平均收盘价的公式:
  fc:=close;  //定义序列变量为收盘价
  for  i=2  to  datacount  do  
  begin
      a:= fc[i-1]+fc;  //定义一个临时的单值变量a,保存中间计算结果
    ma2 : a/2;
    end;
  
  这段代码,就是由2行代码组成的复合语句,被循环执行若干次。为了代码容易分辨,我们特别把复合语句中的2行代码,都向右缩了4格,表明这是2行复合语句,是被循环语句所控制的。以前对于这类分层次的语句,都要进行缩格,便于看懂代码,特别是复杂的代码,如果不进行缩格,时间久了,恐怕连自己都很难看懂,大家一开始就要养成好习惯。
  有人会问,书写代码不缩格行吗?不缩格公式会不会出错?答案是,缩格书写代码,仅仅是为了方便看清程序代码的逻辑层次,对公式的运行没有影响。
  有了复合语句,循环的功能就更加强大了,可以轻松实现多重循环,即循环中套循环。在计算N日的平均价时会用到,如果事先不知道N是多少,就要用到二重循环。对于循环中要执行的语句,如果重复太多,也可以使用多重循环来简化。以二重循环为例,大致结构如下:
  for i=n1 to n2 do
  begin
    语句;
    …
      for j=m1 to n2 do
      begin
          语句;
          …
      end;
      语句;
      …
  end;
  不举具体的例子了,留在练习中,让大家练习。
  小结:
1、 今天学习了FOR循环,包括递增循环、递减循环,其中包括序列变量的概念
2、 学习了设置序列变量下界的语句,即setlbound()函数。
3、 讲学习了复合语句begin…end;
4、 初步了解了多重循环
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 10:10 | 显示全部楼层
下面给若干思考与练习:
  思考1:循环语句,就是让某条语句循环执行若干次,每循环一次,循环变量就递增一次。这种说法对吗?
  思考2:循环语句,就是让某条语句循环执行若干次,循环变量总是从1开始,直到对应最后1根K线的位置。这种说法对吗?
  思考3:递增循环和递减循环的区别是什么?
  思考4:什么是复合语句,由何处开始,到何处结束?
  
  练习1:计算2日平均成交量,请用循环语句写出公式代码。
  练习2:计算5日平均收盘价,请用循环语句写出公式代码。
  练习3:计算20日平均收盘价,请用循环语句写出公式代码。
  练习4:有人写了下面一段代码,您能说出结果是什么吗?
Fc:=close;
A:=setlbound(fc,datacount/2);
Fc;

  练习5:读懂下面这段代码,用基本函数来写,相当是什么代码?这段代码可以简化吗?
Hh:=high;
For i=2 to datacount do
Begin
    Hh:=max(Hh[i-1],Hh);
End;
Hh;
  练习6:LLV(LOW,0);意思是求出上市以来的最低价,请用循环语句写出相同的代码来替换这行代码。

  练习7:下面代码,可以用循环语句来写吗?
a:=(3*c+l+o+h)/6;
b:(20*a+19*ref(a,1)+18*ref(a,2)+17*ref(a,3)+16*ref(a,4)+15*ref(a,5)+14*ref(a,6)
+13*ref(a,7)+12*ref(a,8)+11*ref(a,9)+10*ref(a,10)+9*ref(a,11)+8*ref(a,12)
+7*ref(a,13)+6*ref(a,14)+5*ref(a,15)+4*ref(a,16)+3*ref(a,17)+2*ref(a,18)+
ref(a,19))/210;
d:ma(b,m);
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

发表于 2004-8-2 15:43 | 显示全部楼层
xiexie!
金币:
奖励:
热心:
注册时间:
2004-6-2

回复 使用道具 举报

发表于 2004-10-26 19:29 | 显示全部楼层
俺来学学,谢谢。
金币:
奖励:
热心:
注册时间:
2004-6-4

回复 使用道具 举报

签到天数: 10 天

发表于 2004-10-26 20:14 | 显示全部楼层
老师辛苦
金币:
奖励:
热心:
注册时间:
2003-7-21

回复 使用道具 举报

发表于 2004-10-31 15:35 | 显示全部楼层
老师辛苦 ,俺来学学,谢谢
金币:
奖励:
热心:
注册时间:
2004-6-14

回复 使用道具 举报

发表于 2007-2-5 19:45 | 显示全部楼层
:*22*::*22*::*22*:可惜不全
金币:
奖励:
热心:
注册时间:
2007-1-29

回复 使用道具 举报

发表于 2007-2-23 09:51 | 显示全部楼层
强软件
金币:
奖励:
热心:
注册时间:
2006-12-10

回复 使用道具 举报

发表于 2007-4-12 20:35 | 显示全部楼层
呵呵,没学明白!!
金币:
奖励:
热心:
注册时间:
2004-4-15

回复 使用道具 举报

发表于 2007-4-16 20:57 | 显示全部楼层
:*19*: :*19*: vv
金币:
奖励:
热心:
注册时间:
2001-3-21

回复 使用道具 举报

发表于 2007-7-15 16:45 | 显示全部楼层
:) :mad: :P :*22*: :*19*:
金币:
奖励:
热心:
注册时间:
2007-3-27

回复 使用道具 举报

发表于 2008-2-23 23:32 | 显示全部楼层
谢谢,先下载下来,再看
金币:
奖励:
热心:
注册时间:
2003-4-29

回复 使用道具 举报

签到天数: 5 天

发表于 2008-3-5 17:17 | 显示全部楼层
感谢提供。。。。
金币:
奖励:
热心:
注册时间:
2002-1-10

回复 使用道具 举报

发表于 2008-3-8 23:32 | 显示全部楼层
看看,然后学学
金币:
奖励:
热心:
注册时间:
2004-6-5

回复 使用道具 举报

发表于 2008-3-24 08:59 | 显示全部楼层
水水水水水水水水水水水水水水水水水水水水水水水水灌灌灌灌灌灌灌灌灌水水水水
水水水水水水水水水水水水水水水水水水灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌水水水水
水水水水水水水水水水水水水水水灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌水水水水
水水水水水水水水水水水灌灌灌灌水灌灌灌灌灌灌灌灌灌灌灌水水水水水水水水水水
水水水水水水水水灌灌灌灌灌灌灌水灌灌灌水水灌灌灌灌灌水水水水水水水水水水水
水水水灌灌灌灌灌灌灌灌灌灌灌灌水水水水水水灌灌灌灌水水水水水水水水水水水水
水灌灌灌灌灌灌灌灌灌灌灌灌灌灌水水水水水水灌灌灌灌水水水水水水水水水水水水
水灌灌灌灌灌灌灌灌灌灌灌灌水水水水水水水灌灌灌灌灌灌灌灌灌灌灌水水水水水水
水灌灌灌灌灌灌灌灌灌灌灌灌水水水水水水灌灌灌灌灌灌灌灌灌灌灌灌灌灌水水水水
水水灌灌灌灌灌灌灌灌灌灌水水水水水灌灌灌灌灌灌水水水灌灌灌灌灌灌灌水水水水
水水水水水水水水灌灌灌灌水水水水水灌灌灌灌水水水水水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水水灌灌水水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水水灌灌灌灌水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水水灌灌灌灌水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水水灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水水灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水灌灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水灌灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水灌灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌灌水灌灌灌灌水水灌灌灌灌灌水水水水水
水水水水水水水水灌灌灌灌水水水水灌灌灌水水灌灌灌灌水水灌灌灌灌灌水水水水水
水水灌灌水水水灌灌灌灌灌水水水水灌灌灌水水灌灌灌水水水灌灌灌灌灌水水水水水
水水灌灌灌灌灌灌灌灌灌灌水水水水水灌灌水水灌灌水水水水灌灌灌灌灌水水水水水
水水水灌灌灌灌灌灌灌灌灌水水水水水水水水灌灌灌水水水水水灌灌灌灌水水水水水
水水水水水灌灌灌灌灌灌灌水水水水水水水水灌灌灌水灌灌灌灌水水水水水水水水水
水水水水水水灌灌灌灌灌灌水水水水水水水灌灌灌灌水水灌灌灌灌灌水水水水水水水
水水水水水水水水水灌灌灌水水水水水水灌灌灌灌灌水水水灌灌灌灌灌灌灌水水水水
水水水水水水水水水水水水水水水水灌灌灌灌灌灌水水水水水灌灌灌灌灌灌水水水水
水水水水水水水水水水水水水水水灌灌灌灌灌灌水水水水水水灌灌灌灌灌灌灌水水水
水水水水水水水水水水水水水水灌灌灌灌灌水水水水水水水水水灌灌灌灌灌灌水水水
水水水水水水水水水水水水水灌灌灌灌灌水水水水水水水水水水水灌灌灌灌水水水水
水水水水水水水水水水水水灌灌灌水水水水水水水水水水水水水水水灌灌灌水水水水
金币:
奖励:
热心:
注册时间:
2007-10-8

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-15 15:15 , Processed in 0.043051 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表