如何避免“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 進行 有償 編寫!(不貴!點擊查看價格!)
相關文章
-
沒有相關內容