南客 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
谢谢!
清风斜阳 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-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
非常感谢南客老师!
看帖学习,顶帖拿分!!!!!!!