查看完整版本: 飞狐内置循环、判断等控制语句入门三

南客 2004-12-17 12:12

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

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

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

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

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

MA1:MA(VOL,M1);
MA2:MA(VOL,M2);
MA3:MA(VOL,M3);
if capital>0 and DATATYPE>=6 then
   换手率:vol/capital; //日以上周期及非指数个股,显示换手率
[/code]
当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。

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

  例2,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:
[code]
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;
[/code]

  例3、通过参数N,控制调整均线数,代码参考如下:
[code]
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指标线}
[/code]


  在使用条件语句“IF cond THEN”中, cond 不能使用序列变量,这是最容易出错的地方,比如:
[code]
{下面的代码是错误的}
fc:=close;
fo:=open;
if fc>fo then  //这里的fc、fo是序列变量,因此是错误的语法
  xx:=1
else
  xx:=0;
[/code]

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

[code]
//如果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;
[/code]
[code]
//如果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;
[/code]

练习:
1、如果是日以下的分钟周期,则显示“30周期均价线”,否则显示“60周期均价线”,请设计代码。
2、如果是日以下的分钟周期,则显示“30周期均价线”,否则如果是日周期则显示“60周期均价线”,比日更长的周期则显示“10周期均价线”请设计代码。
3、以下代码正确吗?为什么?请改成正确的代码。
[code]
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;
[/code]

股市骑兵00 2004-12-17 12:18

真高兴!又看见南客老师的学习贴。谢谢!
第一顶!:clap:

zxc 2004-12-17 12:20

学习了,谢谢!!!

bajatje 2004-12-17 12:59

学习,非常感谢!!

joneslee 2004-12-17 14:10

学习,非常感谢!!

bzjz 2004-12-17 20:53

谢谢!!!

股市骑兵00 2004-12-18 01:44

俺来学习了!试试对不对。

[code]
1)
if DATATYPE<6 and DATATYPE>0 then
a:=ma(c,30);
else
a:=ma(c,60);
a;

2)
if DATATYPE<6 and DATATYPE>0 then
a:=ma(c,30);
else
if DATATYPE=6 then
a:=ma(c,60);
else
if DATATYPE>6 then
a:=ma(c,10);
a;

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;
ff:=diff;ff1:=dea;
for i=1 to DATACOUNT do
if ff[i]>ff1[i] then
  x[i]:=1
else
  x[i]:=0;
y:x;

[/code]

[color=Teal][align=right] 本贴由 股市骑兵00 于 2004-12-18 02:45 最后编辑 [/align][/color]

股市骑兵00 2004-12-18 01:46

为什么贴发上代码会变的?

admin 2004-12-18 01:55

不要 禁用 Discuz! 代码,可用 [code] 而不用 [quote]

股市骑兵00 2004-12-18 02:38

[quote][i]admin[/i] 于 2004-12-18 01:55 AM 写道:
不要 禁用 Discuz! 代码,可用 [code] 而不用 [quote] [/quote]
没成功,不会弄:@算了!

admin 2004-12-18 02:41

最后结束用用 [/code] ,再编辑试试

股市骑兵00 2004-12-18 02:46

[quote][i]admin[/i] 于 2004-12-18 02:41 AM 写道:
最后结束用用 [/code] ,再编辑试试 [/quote]
OK啦,谢谢又学了招!
你谁啊,怎么没看见过你啊。

PBQY1898 2004-12-19 06:01

xuex

kjyhao 2004-12-19 15:52

看来单语句和复合语句的写法还不一样!!!

darbo 2004-12-23 21:56

学习

lhl311 2004-12-24 08:52

非常感谢南客老师!

南客 2004-12-26 01:19

[quote][i]股市骑兵00[/i] 于 2004-12-18 01:44 AM 写道:
俺来学习了!试试对不对。

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;
ff:=diff;ff1:=dea;
for i=1 to DATACOUNT do
if ff[i]>ff1[i] then
  x[i]:=1
else
  x[i]:=0;
y:x;
[/quote]
不错!

[code]for i=1 to DATACOUNT do
if diff[i]>dea[i] then
  x[i]:=1
else
  x[i]:=0;
y:x;[/code]

不一定要再开辟2个序列变量ff和ff1,diff和dea本身就是序列变量,可以直接引用其数组元素。

股市骑兵00 2004-12-27 17:34

南客老师刚开始我和你写的一样的,可是通不过,后来才改成这样的。:(
请老师再指点,谢谢!

hx817 2004-12-27 23:49

for ... do begin
...
end;

试试

南客 2004-12-28 01:22

[quote][i]股市骑兵00[/i] 于 2004-12-27 05:34 PM 写道:
南客老师刚开始我和你写的一样的,可是通不过,后来才改成这样的。:(
请老师再指点,谢谢! [/quote]

谢谢骑兵兄!
帮忙发现了一个隐藏很深的BUG!
飞狐在检测 if 语句时有点问题,只要变量中含有有 if 字样的变量,就无法通过。
这个例子中,diff变量名称中,恰好包含了 if 这样的组合,因此就会出错。

股市骑兵00 2004-12-28 19:18

[quote][i]南客[/i] 于 2004-12-28 01:22 AM 写道:
谢谢骑兵兄!
帮忙发现了一个隐藏很深的BUG!
飞狐在检测 if 语句时有点问题,只要变量中含有有 if 字样的变量,就无法通过。
这个例子中,diff变量名称中,恰好包含了 if 这样的组合,因此就会出错。 [/quote]
南客老师您客气了!你是我尊敬的好老师。在你贴中学到很多东西。
这个问题也是在学习中无意发现的,我水平差,也不能确定是BUG。
只好再来问问你了。希望能及时改进,使飞狐不断进步!:cool:

股市骑兵00 2004-12-28 19:32

南客老师上次问您关于C++编译器跳出来的问题,我也问了几个好朋友,我水平差看不懂,下面是他们给我留言和例子请你有空看看。我也不知是否对?

[code]
骑兵你的问题我已碰过二次,还不知原因,还未解决,后来都是先用VB解决,我不知内建循环是否用VB去编译,果如此,那内建循环尚存有许多BUG,截至目前我已发现二个有关VB的重大问题,]
一是,3.6以下的VB比3.8以上的版本更稳定.
二是,变量重复定义时,若变量有给VB使用,那VB会错乱(会编译错误或计算值会乱掉)
说明一:
3.6可以这样定义,注意”:=”,但3.8以上如这样定义,计算值会乱掉
xqwsarl:=(ema(L,9)+ema(L,8))/2,linethick0;
xqwsarh:=(ema(H,9)+ema(H,8))/2,linethick0;
xqwsart:=l,linethick0;
fxqwc:=c,linethick0;
fxqwh:=h,linethick0;
fxqwl:=l,linethick0;
<%
vc=ffl.vardata("fxqwc")
vh=ffl.vardata("fxqwh")
vl=ffl.vardata("fxqwl")
vsarh=ffl.vardata("xqwsarh")
vsarl=ffl.vardata("xqwsarl")
vsart=ffl.vardata("xqwsart")
vcc=ffl.vardata("fxqwc")
vee=ffl.vardata("fxqwh")
3.8以上应该这样定义, 注意”:”
xxqwsarl:(ma(L,85)+ma(L,85))/2,linethick0;
xxqwsarh:(ma(H,85)+ma(H,85))/2,linethick0;
xxqwsart:l,linethick0;
fxxqwc:c,linethick0;
fxxqwh:h,linethick0;
fxxqwl:l,linethick0;
<%
vc=ffl.vardata("fxxqwc")
vh=ffl.vardata("fxxqwh")
vl=ffl.vardata("fxxqwl")
vsarh=ffl.vardata("xxqwsarh")
vsarl=ffl.vardata("xxqwsarl")
vsart=ffl.vardata("xxqwsart")
vcc=ffl.vardata("fxxqwc")
vee=ffl.vardata("fxxqwc")

我给你二次还未解决的内建循环,让你去试吧,
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
short:=5;
long:=35;
ma1:=MA((H+L)/2,5),linethick1;
ma2:=MA((H+L)/2,35),linethick1;
oscc:ma1-ma2,colorstick;
// var1:=c,linethick0;
// var2:=c,linethick0;
{var1:=if(ma1>=ma2,ma1-ma2,0);}
{var2:=if(ma1<ma2,ma1-ma2,0);}
// FOR I=2 to datacount do
// begin
//   if ma1>=ma2 then var1:=ma1-ma2;
//    if  ma1<ma2  then var2:=ma1-ma2;
// end;
upx:5*ema(VAR1,38),colorred;
dnx:5*ema(VAR2,38),colorgreen;

hac[1]:=0;
atta:=hac[1];
attb:=c;
addx:=c;
fc:=c;
con1:20*(c<ref(c,3) and ref(c,1)<ref(c,4) and ref(c,2)<ref(c,5) and ref(c,3)<ref(c,6) and ref(c,4)<ref(c,7)),colorwhite;
con2:=30*(c<ref(c,2)),linethick2;

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
// FOR i= 5 TO  datacount  do
//    begin
  //      if vcon1>0  then  vaddx:=0;
   //     if vcon1=0  then  vaddx:=1;
   //     if vcon1[i-1]>0 and vcon1=0  then  atta:=1;
   //      if vcon1=0 and vaddx=1 and vcon2>0 then  atta:=atta+1;
//         attb:=atta;
//    end;

<%
vatta=ffl.vardata("atta")
vattb=ffl.vardata("attb")
vaddx=ffl.vardata("addx")
vcon1=ffl.vardata("con1")
vcon2=ffl.vardata("con2")
vc=ffl.vardata("fc")
last=ubound(vc)
atta=0
for i=3 to last
        if vcon1(i)>0  then  vaddx(i)=0
        if vcon1(i)=0  then  vaddx(i)=1
        if vcon1(i-1)>0 and vcon1(i)=0  then  atta=1
        if vcon1(i)=0 and vaddx(i)=1 and vcon2(i)>0 then  atta=atta+1
        vattb(i)=atta
next

ffl.vardata("attb")=vattb
%>

attb,linethick2;
drawnumber(c>1,l*0.98,attb,0),coloryellow;

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
[/code]

南客 2004-12-29 13:23

没看懂是什么问题?

南客 2004-12-29 13:25

“C++编译器跳出来的问题”,具体是什么公式?方便的话,传上来,并描述何时会出问题。

股市骑兵00 2004-12-29 16:32

南客老师上面的代码是朋友给我,我又看不懂,只有下次我问清楚再和你讲了。
C++编译器跳出来公式,就是上次请你帮忙的分笔公式,什么时候跳出来好象没规律的,这几天又好了,不知怎么搞的。我再试试看了。不行我再来请教您。谢谢!

hxx816 2005-1-2 18:05

您的举手之劳,对我们是无上的帮助。

lhl311 2005-1-10 21:07

谢谢!

ken 2005-1-16 13:37

学习

清风斜阳 2005-1-25 00:07

谢谢老师

[quote][i]南客[/i] 于 2004-12-17 12:12 PM 写道:
飞狐内置循环、判断等控制语句入门三

  上一讲《飞狐内置循环、判断等控制语句入门二》中,我们介绍了飞狐内置循环,这一讲,介绍条件(判断)语句。
  条件语句的语法如下:


  条件语句的语法比较 ... [/quote]

as5333 2005-1-26 19:15

多谢!

ryn 2005-1-29 19:35

谢谢!!!

cdstnt 2005-1-31 13:50

请教问题

已知N天的均线,看看某天的均线值,很方便;但是,已知某天的均线值,要看看是N天的均线如何看?也就是要知道这根线到底是几天的均线?怎样编写指标?我用循环语句编,可是不支持系列变量,那么该如何编写呢?烦请高手帮忙解答一下,本人不胜感激。

万股枯 2005-2-4 10:52

[swf]http://source.flashw.com:9092/swf/happynewyear12.swf[/swf]

犇犇 2005-2-4 22:31

努力学习

股海/淘金 2005-2-10 09:49

ok

原野 2005-2-23 13:16

好贴,收藏学习。

peter109 2005-2-28 14:13

三份都已完成备份 再次多谢

qlk90 2005-3-11 08:56

非常感谢南客老师!

股龙王 2005-3-26 11:04

非常感谢南客老师!

天高任鸟飞 2005-3-27 20:52

非常感谢南客老师!
看帖学习,顶帖拿分!!!!!!!
页: [1] 2
查看完整版本: 飞狐内置循环、判断等控制语句入门三