![]() |
在這個頁面顯示本主題全部的 18 個文章 |
奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- 請問指標問題 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=22991)
請問指標問題
請問版主,我根據下圖
寫了公式如下:
UD:=(H-L)-ABS(O-C);
LF:=POW(UD,4);
ZD:SUM(C*V*LF,20)/SUM(V*LF,20);
在日線還好,但是在一分線會出現嚴重偏離現象(如下圖),請問是哪裡寫錯了?
回覆: 請問指標問題
引用:
最初由 Rosetta 發表
請問版主,我根據下圖
寫了公式如下:
UD:=(H-L)-ABS(O-C);
LF:=POW(UD,4);
ZD:SUM(C*V*LF,20)/SUM(V*LF,20);
在日線還好,但是在一分線會出現嚴重偏離現象(如下圖),請問是哪裡寫錯了?
![]()
回覆: 回覆: 請問指標問題
引用:
最初由 cgjj 發表
按你給的圖
UD:=(H-L)-ABS(O-C);
應修正為 UD:=ABS(C-O)-(H-L);
不過那個只會影響到UD正負
嚴重偏離?
每個指標有每個指標的特性
這個算法!
當除號兩邊的元素,數值差異很大時就會出現您所謂的 "偏離",並非是算錯!
適不適用於1分線,以及適不適用所有商品,需要去視該指標的特性,自己審慎評估抉擇!
回覆: 回覆: 回覆: 請問指標問題
引用:
最初由 Rosetta 發表
將程式改為:
UD:=ABS(O-C)-(H-L),linethick0;
LF:=POW(UD,4),linethick0;
LF1:=MAX(LF,1),linethick0;
ZD1:=SUM(CLOSE*VOL*LF1,N),linethick0;
ZD2:=SUM(VOL*LF1,N);
ZD:ZD1/ZD2;
以6244茂迪,2020年3月23日為例:
當N=1時,ZD、ZD1、ZD2每個數值皆為正
當N=2時,ZD數值開始出現負值
檢查之後,發現是ZD1造成,但是ZD2是正值,但是裡面個別的數值都不可能為負值,每天的數值也不可能為負值,那如何產生負值的?
回覆: 回覆: 回覆: 回覆: 請問指標問題
引用:
最初由 cgjj 發表
測試了一下,確實是有點問題!
初步尋找原因,應該是 POW 函數引起的問題!
發生在POW在第一個參數為數列,且數值為零或負數時。
傳回的零可能不是一個絕對的零(精度差異)
細部還要請工程師確認,確認後會進行修正
回覆: 回覆: 回覆: 回覆: 回覆: 請問指標問題
引用:
最初由 Rosetta 發表
如果將
LF:=POW(UD,4);
改為
LF:=UD*UD*UD*UD;
這樣不涉及POW函數,但是結果沒變
應該是 SUM(CLOSE*VOL*LF1,N) 計算過程中,產生巨大的數,超過極限值。導致無法繼續正常計算~~
將各自多乘上個數,縮小巨值,即可正常!
UD:=ABS(O-C)-(H-L),linethick0;
LF:=POW(UD,4),linethick0;
LF1:=MAX(LF,1),linethick0;
ZD1:=SUM(CLOSE*VOL*LF1*0.1,N),linethick0;
ZD2:=SUM(VOL*LF1*0.1,N);
ZD:ZD1/ZD2;
其實乘上 LF1 是多餘的,根本沒必要!!!
可直接簡化為這樣!
ZD1:=SUM(CLOSE*VOL,N),linethick0;
ZD2:=SUM(VOL,N);
ZD:ZD1/ZD2;
乘太多東西,容易引起巨數,可能會超過軟體能處理的巨數極限!
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 請問指標問題
工程師已經查明原因了!
是SUM函數算法中的單精度浮點誤差引起的攪動,造成了計算失真。
我手邊的最新測試版本,已經修正了這個問題,已經可正常算出數值。
下次軟體升級就會包含此部分的功能修正!
若有急需可先私訊,可先提供新的版本EXE
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 請問指標問題
引用:
最初由 cgjj 發表
工程師已經查明原因了!
是SUM函數算法中的單精度浮點誤差引起的攪動,造成了計算失真。
我手邊的最新測試版本,已經修正了這個問題,已經可正常算出數值。
下次軟體升級就會包含此部分的功能修正!
若有急需可先私訊,可先提供新的版本EXE
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 請問指標問題
引用:
最初由 Rosetta 發表
將公式改為:
UD:ABS(O-C)-(H-L),linethick0;
LF:POW(UD,4),linethick0;
LF1:MAX(LF,1),linethick0;
ZD1:MA(CLOSE*VOL*LF1,N)*N,linethick0;
ZD2:MA(VOL*LF1,N)*N,linethick0;
ZD:ZD1/ZD2;
避開SUM函數,結果一樣
我手邊的最新測試版本,已經修正了MA這個問題,已經可正常算出數值。
並非有累加成分的函數都有這個問題存在~~
是SUM 和 MA 這兩個函數,有用到了相同的累加優化算法,該算法會有單精度浮點計算累計誤差的問題,現在都已改正。
下次軟體升級就會包含此部分的功能修正!
基本上這問題只有累加到數值大小超過單精度有效位數範圍以上時,才會開始有累計誤差。故不常見!
引用:
最初由 cgjj 發表
我手邊的最新測試版本,已經修正了MA這個問題,已經可正常算出數值。
並非有累加成分的函數都有這個問題存在~~
是SUM 和 MA 這兩個函數,有用到了相同的累加優化算法,該算法會有單精度浮點計算累計誤差的問題,現在都已改正。
下次軟體升級就會包含此部分的功能修正!
基本上這問題只有累加到數值大小超過單精度有效位數範圍以上時,才會開始有累計誤差。故不常見!
引用:
最初由 Rosetta 發表
請問版主,有沒有辦法將
ZD1:SUM(CLOSE*VOL*LF1,N)*N,linethick0;
不用SUM、MA函數而可以表達的方式,謝謝
原碼:
ZD1:=C*0; CV:=CLOSE*VOL*LF1; for i=N to datacount do begin for j=i downto i-N+1 do begin ZD1[i]:=ZD1[i]+CV[j]; end; end; ZD1:=ZD1*N; x:=SETLBOUND(ZD1,N);
引用:
最初由 cgjj 發表
是可以用迴圈自行去累加去實現這部分(範例如下)
但速度會比用內建的 SUM 算來的慢。故不建議! (尤其在資料量大時)
預計最快這周就會發佈軟體升級!
原碼:
ZD1:=C*0; CV:=CLOSE*VOL*LF1; for i=N to datacount do begin for j=i downto i-N+1 do begin ZD1[i]:=ZD1[i]+CV[j]; end; end; ZD1:=ZD1*N; x:=SETLBOUND(ZD1,N);
引用:
最初由 Rosetta 發表
1.請問版主,x:=SETLBOUND(ZD1,N);代表什麼意思,怎麼看他都等於N
2.將公式改為
UD:ABS(O-C)-(H-L),linethick0;
LF:POW(UD,4),linethick0;
LF1:MAX(LF,1),linethick0;
ZD1:=C*0; CV:=CLOSE*VOL*LF1;
for i=N to datacount do begin
for j=i downto i-N+1 do begin
ZD1[i]:=ZD1[i]+CV[j];
end;
end;
ZD1:ZD1*N,linethick0;
X:SETLBOUND(ZD1,N),linethick0;
ZD2:SUM(VOL*LF1,N),linethick0;
ZD:ZD1/ZD2;
雖然ZD1為正值了,但是看起來還是有問題,還不如用原始程式+還權圖來的好
3.如果要將其寫入選股系統,又不想在選項內將權息校正勾選,要加上哪段程式碼,謝謝
引用:
最初由 cgjj 發表
我手邊的最新測試版本,已經修正了MA這個問題,已經可正常算出數值。
並非有累加成分的函數都有這個問題存在~~
是SUM 和 MA 這兩個函數,有用到了相同的累加優化算法,該算法會有單精度浮點計算累計誤差的問題,現在都已改正。
下次軟體升級就會包含此部分的功能修正!
基本上這問題只有累加到數值大小超過單精度有效位數範圍以上時,才會開始有累計誤差。故不常見!
引用:
最初由 cgjj 發表
已發佈軟體修正更新,請見:
http://www.chiefox.com.tw/bbs/showt...&threadid=23018
引用:
最初由 Rosetta 發表
感謝版主
全部時間均為台灣時間, 現在時間為00:06 | 在這個頁面顯示本主題全部的 18 個文章 |
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved.