如何避免“FOR,WHILE,IF,ELSE中包含序列函数,可能存在潜在的逻辑错误。” [开拓者 TB]
- 咨询内容:
如FOR,WHILE,IF,ELSE中包含序列函数,导致条件不满足时,序列函数的赋值就没有被执行,缺省继承了上一个序列值即x=x[1]; 解决的方法是将序列函数放在FOR,WHILE,IF,ELSE之外赋值,而在FOR,WHILE,IF,ELSE语句内引用相关变量。如:
Vars
NumericSeries myBar;
Begin
If (myBar/2==IntPart(myBar/2))
{ myBar = CurrentBar;
// 其他语句
}
Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
End
在这个程序中,由于myBar = CurrentBar; 语句是偶数时被赋值,因此显示的是连续的偶数对。
把赋值语句放到IF语句之前之外,则能解决不能每个Bar都赋值的问题,如下:
Vars
NumericSeries myBar;
Begin
myBar = CurrentBar;
If (myBar/2==IntPart(myBar/2))
{
// 其他语句
}
Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
End
- TB技术人员:
如果函数中含有序列函数,当有条件调用函数时,也会出现序列函数不完全赋值的情况,如:
// 应用主程序 Test1
Vars
NumericSeries myBar;
Begin
myBar = CurrentBar;
Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
if (myBar/2==IntPart(myBar/2)) Test2(myBar); //调用函数Test2
End
/ 函数 Test2
Params
NumericSeries myBar;
Vars
Begin
if (myBar/2==IntPart(myBar/2)) Return False;
Commentary ("myBay2 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum2: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
Return True;
End
此时,显示如下图:
Test1.JPG (24.64 KB, 下载次数: 0) 2013-9-14 08:11:22 上传 下载次数: 0
如何将序列函数完整的传递给子函数呢?可把条件调用改为无条件调用,而把相应条件放入子函数中,如下示例:
// 应用主程序 Test1a
Vars
NumericSeries myBar;
Begin
myBar = CurrentBar;
Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
test2a(myBar); //无条件调用test2a
End
// 函数 Test2a
Params
NumericSeries myBar;
Vars
Begin
if (myBar/2 ==IntPart(myBar/2)) Return False; //当条件满足是返回
Commentary ("myBay2 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
Commentary ("Sum2: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
Return True;
End
结果如下图:
Test2.JPG (25.66 KB, 下载次数: 0) 2013-9-14 08:19:08 上传 下载次数: 0
- TB客服:
仔细观察这连个图,发现有一个错误:第一个程序在偶数Bar上显示,而第二个程序却在奇数Bar上显示,显然逻辑上发生了错误。
原因是小可在修改程序时疏忽而至。由于Test1a是有条件调用Test2a,因此把条件移到函数中时,要把逻辑值取反,即把
if (myBar/2 == IntPart(myBar/2)) Return False;
改为
if (myBar/2 != IntPart(myBar/2)) Return False;
是不是这样?
分享给大家,也借此经常提醒自己,程序中尽量要避免编译时出现“FOR,WHILE,IF,ELSE中包含序列函数......”的警示提示。
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 1145508240 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容