上一讲《飞狐内置循环、判断等控制语句入门二》中,我们介绍了飞狐内置循环,这一讲,介绍条件(判断)语句。 条件语句的语法如下:
引用:
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; 股票论坛 www.55188.com
|