- 金币:
-
- 奖励:
-
- 热心:
-
- 注册时间:
- 2001-11-27
|
|
发表于 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,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式)
- VOL,VOLSTICK;
- MA1:MA(VOL,M1);
- MA2:MA(VOL,M2);
- MA3:MA(VOL,M3);
- if capital>0 and DATATYPE>=6 then
- 换手率:vol/capital; //日以上周期及非指数个股,显示换手率
复制代码
当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。
以上是较简单的情况,没有使用 ELSE expr2 子句。上面代码稍加改进,使用复合语句,使之适用于任意周期:
例2,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:
- VOL,VOLSTICK;
- MA1:MA(VOL,M1);
- MA2:MA(VOL,M2);
- MA3:MA(VOL,M3);
- IF CAPITAL>0 then //如果换手率>0,则
- IF DATATYPE>=6 then //如果周期为日及以上的较长周期,则
- b:=VOL/CAPITAL*100
- else //否则
- begin //复合语句开始,即以下3条语句,视为1条语句,end表示复合语句结束
- tj:=DAY>REF(DAY,1) or BARSSINCE(CLOSE)=0;
- ts:=BARSLAST(tj)+1;
- b:=SUM(VOL,ts)/CAPITAL*100;
- end;
- 换手率:b;
复制代码
例3、通过参数N,控制调整均线数,代码参考如下:
- input:p1(5,0,300),p2(10,0,300),p3(20,0,300),p4(30,0,300),n(4,1,4);{参数定义}
- IF n>0 then MA1:MA(CLOSE,P1);{如果n>=1则输出ma1指标线}
- IF n>1 then MA2:MA(CLOSE,P2);{如果n>=2则输出ma1指标线}
- IF n>2 then MA3:MA(CLOSE,P3);{如果n>=3则输出ma1指标线}
- IF n>3 then MA4:MA(CLOSE,P4);{如果n>=4则输出ma1指标线}
复制代码
在使用条件语句“IF cond THEN”中, cond 不能使用序列变量,这是最容易出错的地方,比如:
- {下面的代码是错误的}
- fc:=close;
- fo:=open;
- if fc>fo then //这里的fc、fo是序列变量,因此是错误的语法
- xx:=1
- else
- xx:=0;
复制代码
这里,if fc>fo then 这种写法的本意是,“如果收盘价大于开盘价则”,是针对序列变量的每个数据(相当于数组的每个元素),在飞狐中,正确的写法应该是这样的:
- //如果xx是单值变量,则代码参考如下
- fc:=close;
- fo:=open;
- for i=1 to datacount do //从第1根K线的位置,循环到最后1根K线的位置
- if fc[i]>fo[i] then //这里,fc[i]、fo[i]代表某一天的收盘、开盘价,是单值变量
- xx:=1
- else
- xx:=0;
- y:xx;
- {以上代码,对单值变量xx有影响的部分仅是最后1根K线,因此上面的代码大多都进行了无效的计算。优化后的代码如下:}
- fc:=close;
- fo:=open;
- if fc[datacount]>fo[datacount] then
- xx:=1
- else
- xx:=0;
- y:xx;
复制代码
- //如果xx是序列变量,则代码参考如下
- fc:=close;
- fo:=open;
- for i=1 to datacount do
- if fc[i]>fo[i] then
- xx[i]:=1 //请注意这里跟上面代码的不同
- else
- xx[i]:=0;
- y:xx;
复制代码
练习:
1、如果是日以下的分钟周期,则显示“30周期均价线”,否则显示“60周期均价线”,请设计代码。
2、如果是日以下的分钟周期,则显示“30周期均价线”,否则如果是日周期则显示“60周期均价线”,比日更长的周期则显示“10周期均价线”请设计代码。
3、以下代码正确吗?为什么?请改成正确的代码。
- input:long(26,20,100),short(12,5,40),m(9,2,60);
- diff : ema(close,short) - ema(close,long);
- dea : ema(diff,m);
- macd : 2*(diff-dea), colorstick;
- if diff>dea then
- x:=1
- else
- x:=0;
- y:x;
复制代码 |
|
|