分享

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

 海天云骞 2017-05-16
上一讲《飞狐内置循环、判断等控制语句入门二》中,我们介绍了飞狐内置循环,这一讲,介绍条件(判断)语句。
  条件语句的语法如下:
引用:
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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多