搜索
查看: 7266|回复: 9

飞狐内置循环、判断等控制语句入门三

[复制链接]
发表于 2004-12-17 12:42 |

飞狐内置循环、判断等控制语句入门三

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:南客 浏览:7266 回复:9

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
  上一讲《飞狐内置循环、判断等控制语句入门二》中,我们介绍了飞狐内置循环,这一讲,介绍条件(判断)语句。
  条件语句的语法如下:
IF条件语句
语法:IF cond THEN expr1 ELSE expr2
如果 cond 条件成立,则执行语句 expr1,否则执行 expr2 语句。
说明:
  1、在条件判断比较简单的情况下,ELSE expr2 子句可以省略。
  2、条件 cond 必须是单值变量,不能为序列变量。


  条件语句的语法比较简单,但使用时却容易出错,下面举若干示例。

  例1:修改成交量公式VOL,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式)

  1. VOL,VOLSTICK;

  2. MA1:MA(VOL,M1);
  3. MA2:MA(VOL,M2);
  4. MA3:MA(VOL,M3);
  5. if capital>0 and DATATYPE>=6 then
  6.    换手率:vol/capital; //日以上周期及非指数个股,显示换手率
复制代码

当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。

  以上是较简单的情况,没有使用 ELSE expr2 子句。上面代码稍加改进,使用复合语句,使之适用于任意周期:

  例2,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:

  1. VOL,VOLSTICK;
  2. MA1:MA(VOL,M1);
  3. MA2:MA(VOL,M2);
  4. MA3:MA(VOL,M3);

  5. IF CAPITAL>0 then //如果换手率>0,则
  6.   IF DATATYPE>=6 then //如果周期为日及以上的较长周期,则
  7.     b:=VOL/CAPITAL*100
  8.   else //否则
  9.   begin //复合语句开始,即以下3条语句,视为1条语句,end表示复合语句结束
  10.     tj:=DAY>REF(DAY,1) or BARSSINCE(CLOSE)=0;
  11.     ts:=BARSLAST(tj)+1;
  12.     b:=SUM(VOL,ts)/CAPITAL*100;
  13.   end;
  14. 换手率:b;
复制代码


  例3、通过参数N,控制调整均线数,代码参考如下:

  1. input:p1(5,0,300),p2(10,0,300),p3(20,0,300),p4(30,0,300),n(4,1,4);{参数定义}
  2. IF n>0 then MA1:MA(CLOSE,P1);{如果n>=1则输出ma1指标线}
  3. IF n>1 then MA2:MA(CLOSE,P2);{如果n>=2则输出ma1指标线}
  4. IF n>2 then MA3:MA(CLOSE,P3);{如果n>=3则输出ma1指标线}
  5. IF n>3 then MA4:MA(CLOSE,P4);{如果n>=4则输出ma1指标线}
复制代码



  在使用条件语句“IF cond THEN”中, cond 不能使用序列变量,这是最容易出错的地方,比如:

  1. {下面的代码是错误的}
  2. fc:=close;
  3. fo:=open;
  4. if fc>fo then  //这里的fc、fo是序列变量,因此是错误的语法
  5.   xx:=1
  6. else
  7.   xx:=0;
复制代码


  这里,if fc>fo then 这种写法的本意是,“如果收盘价大于开盘价则”,是针对序列变量的每个数据(相当于数组的每个元素),在飞狐中,正确的写法应该是这样的:


  1. //如果xx是单值变量,则代码参考如下
  2. fc:=close;
  3. fo:=open;
  4. for i=1 to datacount do //从第1根K线的位置,循环到最后1根K线的位置
  5.   if fc[i]>fo[i] then  //这里,fc[i]、fo[i]代表某一天的收盘、开盘价,是单值变量
  6.     xx:=1
  7.   else
  8.     xx:=0;
  9. y:xx;

  10. {以上代码,对单值变量xx有影响的部分仅是最后1根K线,因此上面的代码大多都进行了无效的计算。优化后的代码如下:}
  11. fc:=close;
  12. fo:=open;
  13. if fc[datacount]>fo[datacount] then
  14.   xx:=1
  15. else
  16.   xx:=0;
  17. y:xx;
复制代码

  1. //如果xx是序列变量,则代码参考如下
  2. fc:=close;
  3. fo:=open;
  4. for i=1 to datacount do
  5.   if fc[i]>fo[i] then
  6.     xx[i]:=1  //请注意这里跟上面代码的不同
  7.   else
  8.     xx[i]:=0;
  9. y:xx;
复制代码


练习:
1、如果是日以下的分钟周期,则显示“30周期均价线”,否则显示“60周期均价线”,请设计代码。
2、如果是日以下的分钟周期,则显示“30周期均价线”,否则如果是日周期则显示“60周期均价线”,比日更长的周期则显示“10周期均价线”请设计代码。
3、以下代码正确吗?为什么?请改成正确的代码。

  1. input:long(26,20,100),short(12,5,40),m(9,2,60);
  2. diff : ema(close,short) - ema(close,long);
  3. dea  : ema(diff,m);
  4. macd : 2*(diff-dea), colorstick;
  5. if diff>dea then
  6.   x:=1
  7. else
  8.   x:=0;
  9. y:x;
复制代码

签到天数: 1 天

发表于 2004-12-23 15:48 |
谢谢!看不太懂。一定学习。
发表于 2004-12-24 15:32 |
Runba

签到天数: 1 天

发表于 2005-4-17 21:19 |

强列建议 飞狐中的IF 语句,使用分析家一样的,

强列建议 飞狐中的IF 语句,使用分析家一样的, IF条件语句
语法:IF cond THEN expr1 ELSE expr2
如果 cond 条件成立,则执行语句 expr1,否则执行 expr2 语句。
说明:
  1、在条件判断比较简单的情况下,ELSE expr2 子句可以省略。
  2、条件 cond 必须是单值变量,不能为序列变量。


2、条件 cond 必须是单值变量,不能为序列变量。应改为 COND 可以为单值变量或序列变量!!!!!!
发表于 2005-6-17 21:00 |
非常感谢,学会了if then else 了
发表于 2007-6-19 18:33 |
谢谢。正在郁闷中。看了才明白。
发表于 2007-9-29 11:47 |
条件 cond 必须是单值变量,不能为序列变量。应改为 COND 可以为单值变量或序列变量!
-----------------------------------------------------------------------------
我碰到了问题,它俩的区别是什么?:)

签到天数: 34 天

发表于 2007-9-29 19:21 |
谢谢。正在郁闷中。看了才明白。
发表于 2009-2-20 01:51 |
谢谢南客老师,我收藏了。
发表于 2009-3-1 11:02 |
thanks a lot
本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

QQ|举报|意见反馈|手机版|MACD论坛

GMT+8, 2025-12-16 12:26 , Processed in 0.041756 second(s), 11 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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