 |
jaguar
初級會員

註冊日期: Apr 2021
來 自:
文章數量: 16 |
[求救]陣列中求中位數值,出現越界
下列公式想畫出500日EWMA的中位數的線,想法是設一個陣列,排序後取中間值,執行時出現指標數組下標越界或超出有效範圍區間,請問該如何修改
LD:=0.06;
R:=(c/ref(c,1)-1)*100;
Rt:=POW(R,2);
EWMA:SQRT(DMA(Rt,ld)*250)linethick2;
VARIABLE:ewmaArray[500]=0;
for i = 1 to 500 DO
ewmaArray[i] = EWMA[i];
SORT(ewmaArray,0,1,500);
median: (ewmaArray[250 - 1] + ewmaArray[250]) / 2;
|
|
向版主報告此篇 |  |
|
2024-12-24 01:41 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18116 |
回覆: [求救]陣列中求中位數值,出現越界
引用: 最初由 jaguar 發表
下列公式想畫出500日EWMA的中位數的線,想法是設一個陣列,排序後取中間值,執行時出現指標數組下標越界或超出有效範圍區間,請問該如何修改
LD:=0.06;
R:=(c/ref(c,1)-1)*100;
Rt:=POW(R,2);
EWMA:SQRT(DMA(Rt,ld)*250)linethick2;
VARIABLE:ewmaArray[500]=0;
for i = 1 to 500 DO
ewmaArray[i] = EWMA[i];
SORT(ewmaArray,0,1,500);
median: (ewmaArray[250 - 1] + ewmaArray[250]) / 2;
K棒很少剛剛好等於500根的(可能不足,或超過)
如果您要算的是近期的500根,方法如下:
LD:=0.06;
R:=(c/ref(c,1)-1)*100;
Rt:=POW(R,2);
EWMA:SQRT(DMA(Rt,ld)*250)linethick2;
KN:=500;
if datacount<KN then exit; //K棒不足跳過不執行
tmpEWMA:=EWMA;
StKNo:=datacount-KN+1;
x:=sort(tmpEWMA,0,StKNo,datacount);
MM:=(StKNo+datacount)/2;
median: (tmpEWMA[floor(MM)] + tmpEWMA[ceiling(MM)]) / 2;
|
|
向版主報告此篇 |  |
|
2024-12-24 09:17 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18116 |
回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界
引用: 最初由 jaguar 發表
這樣畫出來的是固定的水平線,不是我想要的,我想畫出來的應該是500日ewma中位數的移動平均線
本公式計算負荷重,請視負荷狀況與需求調整KN值
原碼: LD:=0.06;
R:=(c/ref(c,1)-1)*100;
Rt:=POW(R,2);
EWMA:SQRT(DMA(Rt,ld)*250)linethick2;
N:=500;
KN:=2000;//限制僅算最近2000根的median值
StNo:=lbound(EWMA)+N-1;
if datacount-KN+1>=StNo then StNo:=datacount-KN+1;
if StNo>datacount or lbound(EWMA)=0 then exit; //K棒不足跳過不執行
median:EWMA*0;
x:=setlbound(median,StNo);
for i=StNo to datacount do begin
tmpEWMA:=EWMA;
x:=sort(tmpEWMA,0,i-N+1,i);
MM:=(2*i-N+1)/2;
median[i]:=(tmpEWMA[floor(MM)]+tmpEWMA[ceiling(MM)])/2;
end;
|
|
向版主報告此篇 |  |
|
2024-12-24 11:51 |
|
|
|  |
 |
jaguar
初級會員

註冊日期: Apr 2021
來 自:
文章數量: 16 |
回覆: 回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界
引用: 最初由 cgjj 發表
本公式計算負荷重,請視負荷狀況與需求調整KN值
原碼: LD:=0.06;
R:=(c/ref(c,1)-1)*100;
Rt:=POW(R,2);
EWMA:SQRT(DMA(Rt,ld)*250)linethick2;
N:=500;
KN:=2000;//限制僅算最近2000根的median值
StNo:=lbound(EWMA)+N-1;
if datacount-KN+1>=StNo then StNo:=datacount-KN+1;
if StNo>datacount or lbound(EWMA)=0 then exit; //K棒不足跳過不執行
median:EWMA*0;
x:=setlbound(median,StNo);
for i=StNo to datacount do begin
tmpEWMA:=EWMA;
x:=sort(tmpEWMA,0,i-N+1,i);
MM:=(2*i-N+1)/2;
median[i]:=(tmpEWMA[floor(MM)]+tmpEWMA[ceiling(MM)])/2;
end;
花了不少時間才看懂這程式碼,感謝總版主,實在太厲害了!
會出現下標越界會是那些狀況呢?編寫程式時要如何預先想到這一點?
|
|
向版主報告此篇 |  |
|
2024-12-24 20:22 |
|
|
|  |
 |
jaguar
初級會員

註冊日期: Apr 2021
來 自:
文章數量: 16 |
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界
引用: 最初由 cgjj 發表
不客氣 ^^
舉實例解說:
MM:MA(C,100); 這條均線
用 lbound(MM) 可取得該數列有效範圍起點(下界)為100
用 ubound(MM) 可取得該數列有效範圍終點(上界)
ubound(MM) 會與 datacount 同值 (因為MM數列與K棒相關)
當您使用 MM[n] 的方式,存取MM數列單一元素時,要注意n 必須要在有效範圍內
超過就會出現越界!
與K棒相關的數列
一般來說只需要注意起點,終點必為datacount
與K棒不相關,自行宣告的數列
一樣可用 lbound 和 ubound 取得上下界
例如:
VARIABLE:ARR[10]=0;
lbound(ARR);
ubound(ARR);
要注意的是~~
數列不一定都是有效的!!!
例如:barslast(barpos=0)
因為 barpos=0 是永遠不可能成立的
所以 barslast(barpos=0) 會得到一個無效數列
無效數列就不能以 數列[n] 這種形式去存取它
若 lbound(數列)=0 代表該數列為一個無效數列(可用這方法來檢驗)
懂了懂了,關鍵就在定起點,而這起點要考慮指標運算的天數,像上面程式要算500天ewma,需要501天,起點前方就至少要留501天,在日線約2年,切換到週線就將近10年,所以上面指標切換到週線就會很容易越界,非常感謝總版主的幫忙和教導
|
|
向版主報告此篇 |  |
|
2024-12-25 00:02 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18116 |
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界
引用: 最初由 jaguar 發表
懂了懂了,關鍵就在定起點,而這起點要考慮指標運算的天數,像上面程式要算500天ewma,需要501天,起點前方就至少要留501天,在日線約2年,切換到週線就將近10年,所以上面指標切換到週線就會很容易越界,非常感謝總版主的幫忙和教導
不客氣^^
|
|
向版主報告此篇 |  |
|
2024-12-25 00:30 |
|
|
|  |
本站所有內容未經作者授權禁止轉貼節錄, 發表言論僅供參考勿作為投資決策依據。瀏覽本站請使用 IE 5.5 以上版本, 最佳瀏覽解析度 1024 x 768 全彩。
|
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved. 聯絡我們
|