您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

如何避免“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  有需要帮忙请点击这里留言!!!进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容