函數不能在IF控制語句中被引用的原理和解決方案 [金字塔]
- 咨詢內容:
金字塔的公式系統在處于逐周期模式計算時,像例如REF,MA等帶有統計性質的函數以及指標公式引用無法直接使用在IF語句之中(序列運行模式可以),因為帶變量判斷的IF語句會在某些周期無法調用這些統計函數而導致計算結果出現錯誤。解決辦法是將這些函數放到IF語句之外去執行。
目前有下列函數受此限制:"RET","LOD","HOD","VALUEWHEN","MD","LAST","ANY","SETVAL","FILTERX","BARSCOUNT","BARSLAST","BARSSINCE","COUNT","HHV","HHVBARS","LLV","LLVBARS",
"MA","DMA","EMA","FILTER","REF","WMA","TMA","SMA","SUM","SUMBARS","CROSS","LONGCROSS","AVEDEV","DEVSQ","FORCAST","SLOPE","STD","STDP","VAR","VARP","SAR","BETA","COVAR","ALL",
"BACKSET","REFX","PARTLINE","SFILTER","RELATE","ALIKE","FILLRGN","NEWHBARS","NEWLBARS","DRL","GEOMEAN","HARMEAN","KURT","SKEW","PEARSON","RSQ",
"STEYX","INTERCEPT"例如:
input:atrn1(1,1,10),atrn2(5,2,20);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATRn_1:= MA(TR1,atrn1);
ATRn_2:= MA(TR1,atrn2);
end;上述公式語句由于將REF和MA函數放在了IF語句之中,所以該公式無法正常編譯。解決辦法是將他們放到IF語句之外去執行:
input:atrn1(1,1,10),atrn2(5,2,20);
[此貼子已經被作者于2010-11-15 20:54:19編輯過]
A1:=REF(CLOSE,1);
MA1:=MA(TR1,atrn1);
MA2:=MA(TR1,atrn2);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
ATRn_1:= MA1;
ATRn_2:= MA2;
end;
這樣經過修正的公式就可以正常編譯了,此外公式還將兩次REF語句引用合并到一個語句中,這樣做還可以提高公式系統的運行效率,因為REF統計語句只執行了一次。 - 金字塔客服:
以下是引用admin在2009-11-2 10:19:35的發言:
金字塔的公式系統由于支持IF語句的變量運行,所以像例如REF,MA等帶有統計性質的函數無法直接使用在IF語句之中,因為帶變量判斷的IF語句會在某些周期無法調用這些統計函數而導致計算結果出現錯誤。解決辦法是將這些函數放到IF語句之外去執行。
目前有下列函數受此限制:"RET","LOD","HOD","VALUEWHEN","MD","LAST","ANY","SETVAL","FILTERX","BARSCOUNT","BARSLAST","BARSSINCE","COUNT","HHV","HHVBARS","LLV","LLVBARS",
"MA","DMA","EMA","FILTER","REF","WMA","TMA","SMA","SUM","SUMBARS","CROSS","LONGCROSS","AVEDEV","DEVSQ","FORCAST","SLOPE","STD","STDP","VAR","VARP","SAR","BETA","COVAR","ALL",
"BACKSET","REFX","PARTLINE","SFILTER","RELATE","ALIKE","FILLRGN","NEWHBARS","NEWLBARS"例如:
input:atrn1(1,1,10),atrn2(5,2,20);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATRn_1:= MA(TR1,atrn1);
ATRn_2:= MA(TR1,atrn2);
end;上述公式語句由于將REF和MA函數放在了IF語句之中,所以該公式無法正常編譯。解決辦法是將他們放到IF語句之外去執行:
input:atrn1(1,1,10),atrn2(5,2,20);
[此貼子已經被作者于2009-11-2 10:22:11編輯過]
A1:=REF(CLOSE,1);
MA1:=MA(atrn1,atrn1);
MA2:=MA(atrn2,atrn2);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
ATRn_1:= MA1;
ATRn_2:= MA2;
end;
這樣經過修正的公式就可以正常編譯了,此外公式還將兩次REF語句引用合并到一個語句中,這樣做還可以提高公式系統的運行效率,因為REF統計語句只執行了一次。input:atrn1(1,1,10),atrn2(5,2,20);
A1:=REF(CLOSE,1);
MA1:=MA(atrn1,atrn1);
MA2:=MA(atrn2,atrn2);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
ATRn_1:= MA1;
ATRn_2:= MA2;
end;
這紅色的語句有問題吧 - 用戶回復:
呵呵呵,你好眼力,是筆誤。自己看幫助就知道了。。。。。
- 網友回復:
還有一處好象有問題!
input:atrn1(1,1,10),atrn2(5,2,20);
[此貼子已經被作者于2010-5-22 11:02:21編輯過]
A1:=REF(CLOSE,1);
MA1:=MA(tr1,atrn1); //語句順序錯了!這樣tr1會提示沒有定義的!應直接把TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));也放在IF語句外面,并在MA1前面!
MA2:=MA(tr1,atrn2);
if atrn1<atrn2 and vol>20000 then
begin
TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
ATRn_1:= MA1;
ATRn_2:= MA2;
end; - 網友回復:
有思路,想編寫各種指標公式,程序化交易模型,選股公式,預警公式的朋友
可聯系技術人員 QQ: 262069696 進行 有償 編寫!(不貴!點擊查看價格!)
- 上一篇:前日最高、最低、收盤價如何表示?
- 下一篇:漲跌停板可以高亮顯示么?
相關文章
-
指定的模型還沒有相關內容!