CrossOver/CrossUnder 運算規則求解
作者:開拓者 TB 來源:cxh99.com 發布時間:2013年09月22日
- 咨詢內容:
有 Ma1/Ma2 是序列變量;
問題1:CrossOver(Ma1,Ma2),編譯提示警告,說函數內有序列變量可能有錯誤是什么意思?
CrossOver不能用序列變量? 還是什么意思?應該怎么用?
問題2:CrossOver(Ma1,Ma2) 和 ( Ma1[1] < Ma2[1] && Ma[0]>Ma2[0]) 等價么?
實測兩個不等價,為什么?
問題3:CrossOver(Ma1,Ma2) 和 CrossOver(Ma1[1], Ma2[1]) 運算結果是不是應該相差1根K線?
實測兩個不等價(期望是相差1根K線,實際運結果不同),為什么?
- TB技術人員:
本帖最后由 小米 于 2013-7-17 15:10 編輯
首先,要確認一下,你下述三個問題的代碼在校驗過程中,都出了可能有邏輯錯誤的警告嗎??
如果有出,那你的上述這些測試結果基本上沒有什么參考價值。
1. crossover( ),crossunder()等函數的運算中,計算的參數是需要序列值的。
如果這類函數的賦值運算放在條件里或是受限制,那么可能會因為取值范圍的限制而不能得正確的計算結果。
遇到這類的函數,請嘗試加上一個中間變量,在條件外賦值,再代入條件內的判斷使用。例如:- vars
- bool aa;
- begin
- aa = crossover(ma1,ma2);
- if(aa) ......
復制代碼2. 如前面提示的,你的驗證代碼若是按第1條里那樣寫的,基本上可以將這兩個寫法視作等價的。
略有不同,是在等到ma1[1]==ma2[1]時,crossover會順延到下一個bar判斷,若下一個bar的ma1[1]<ma2[1]成立,則crossover滿足(具體運算規則可見系統內建函數的代碼)。而你所寫的 Ma1[1] < Ma2[1] && Ma[0]>Ma2[0]則會在ma1[1]==ma2[1]時將這個布爾為否了。。
3. 在前面所說的正確方式下進行的運算,這兩個寫法的結果應該是相差一個K線的。- vars
- bool aa;
- bool bb;
- begin
- aa = crossover(ma1,ma2);
- bb = crossover(ma1[1],ma2[1]);
- ....
復制代碼