 |
Rosetta
資深會員
註冊日期: Sep 2014
來 自:
文章數量: 117 |
回覆: 回覆: 請問指標問題
引用: 最初由 cgjj 發表
按你給的圖
UD:=(H-L)-ABS(O-C);
應修正為 UD:=ABS(C-O)-(H-L);
不過那個只會影響到UD正負
嚴重偏離?
每個指標有每個指標的特性
這個算法!
當除號兩邊的元素,數值差異很大時就會出現您所謂的 "偏離",並非是算錯!
適不適用於1分線,以及適不適用所有商品,需要去視該指標的特性,自己審慎評估抉擇!
將程式改為:
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是正值,但是裡面個別的數值都不可能為負值,每天的數值也不可能為負值,那如何產生負值的?
|
|
向版主報告此篇 |  |
|
2021-06-01 07:52 |
|
|
|  |
 |
Rosetta
資深會員
註冊日期: Sep 2014
來 自:
文章數量: 117 |
回覆: 回覆: 回覆: 回覆: 請問指標問題
引用: 最初由 cgjj 發表
測試了一下,確實是有點問題!
初步尋找原因,應該是 POW 函數引起的問題!
發生在POW在第一個參數為數列,且數值為零或負數時。
傳回的零可能不是一個絕對的零(精度差異)
細部還要請工程師確認,確認後會進行修正
如果將
LF:=POW(UD,4);
改為
LF:=UD*UD*UD*UD;
這樣不涉及POW函數,但是結果沒變
|
|
向版主報告此篇 |  |
|
2021-06-01 11:01 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18128 |
應該是 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;
乘太多東西,容易引起巨數,可能會超過軟體能處理的巨數極限!
|
|
向版主報告此篇 |  |
|
2021-06-01 13:22 |
|
|
|  |
 |
Rosetta
資深會員
註冊日期: Sep 2014
來 自:
文章數量: 117 |
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 請問指標問題
引用: 最初由 cgjj 發表
工程師已經查明原因了!
是SUM函數算法中的單精度浮點誤差引起的攪動,造成了計算失真。
我手邊的最新測試版本,已經修正了這個問題,已經可正常算出數值。
下次軟體升級就會包含此部分的功能修正!
若有急需可先私訊,可先提供新的版本EXE
將公式改為:
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函數,結果一樣
|
|
向版主報告此篇 |  |
|
2021-06-02 06:34 |
|
|
|  |
 |
Rosetta
資深會員
註冊日期: Sep 2014
來 自:
文章數量: 117 |
引用: 最初由 cgjj 發表
我手邊的最新測試版本,已經修正了MA這個問題,已經可正常算出數值。
並非有累加成分的函數都有這個問題存在~~
是SUM 和 MA 這兩個函數,有用到了相同的累加優化算法,該算法會有單精度浮點計算累計誤差的問題,現在都已改正。
下次軟體升級就會包含此部分的功能修正!
基本上這問題只有累加到數值大小超過單精度有效位數範圍以上時,才會開始有累計誤差。故不常見!
請問版主,有沒有辦法將
ZD1:SUM(CLOSE*VOL*LF1,N)*N,linethick0;
不用SUM、MA函數而可以表達的方式,謝謝
|
|
向版主報告此篇 |  |
|
2021-06-02 14:20 |
|
|
|  |
 |
Rosetta
資深會員
註冊日期: Sep 2014
來 自:
文章數量: 117 |
引用: 最初由 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);
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.如果要將其寫入選股系統,又不想在選項內將權息校正勾選,要加上哪段程式碼,謝謝
|
|
向版主報告此篇 |  |
|
2021-06-03 08:03 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18128 |
引用: 最初由 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.如果要將其寫入選股系統,又不想在選項內將權息校正勾選,要加上哪段程式碼,謝謝
x:=SETLBOUND(ZD1,N);
是將 ZD1 這個數列的下界(有效起點)設為第N根
目前:
用已還權的資料做選股,一定要在系統選項中勾選[選股,交易系統權息]校正
若是應用在日線,且是採用未還權的資料做日線選股
才可以透過 SEQDATA 函數取得未還權的日線資料,例如:
未還權日線之收盤價:SEQDATA('','DAY','CLOSE');
|
|
向版主報告此篇 |  |
|
2021-06-03 09:52 |
|
|
|  |
本站所有內容未經作者授權禁止轉貼節錄, 發表言論僅供參考勿作為投資決策依據。瀏覽本站請使用 IE 5.5 以上版本, 最佳瀏覽解析度 1024 x 768 全彩。
|
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved. 聯絡我們
|