到奇狐勝券首頁 奇狐社區論壇 購買奇狐勝券 試用奇狐勝券
 
論壇首頁 你可以在這裡編輯你的資料,查看短訊,訂閱主題和論壇參數等等 免費會員註冊 會員列表 論壇幫助 論壇日曆 論壇搜索 加入我的最愛 登出論壇  
奇狐社區論壇 : Powered by vBulletin version 2.3.0 奇狐社區論壇 > 指標公式 > 問題交流 > [求救]陣列中求中位數值,出現越界
  上一主題   下一主題
作者
主題 發表新主題    回覆主題
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;

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 01:41
jaguar 現在離線 點選這裡查看 jaguar 的個人資料 點選這裡給 jaguar 傳送一條短訊 查找更多關於 jaguar 的文章 增加 jaguar 至你的好友列表 編輯/刪除訊息 引用回覆
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;

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 09:17
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
jaguar
初級會員

註冊日期: Apr 2021
來  自:
文章數量: 16

回覆: 回覆: [求救]陣列中求中位數值,出現越界

引用:
最初由 cgjj 發表
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;



這樣畫出來的是固定的水平線,不是我想要的,我想畫出來的應該是500日ewma中位數的移動平均線

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 10:15
jaguar 現在離線 點選這裡查看 jaguar 的個人資料 點選這裡給 jaguar 傳送一條短訊 查找更多關於 jaguar 的文章 增加 jaguar 至你的好友列表 編輯/刪除訊息 引用回覆
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;

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 11:51
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
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;



花了不少時間才看懂這程式碼,感謝總版主,實在太厲害了!
會出現下標越界會是那些狀況呢?編寫程式時要如何預先想到這一點?

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 20:22
jaguar 現在離線 點選這裡查看 jaguar 的個人資料 點選這裡給 jaguar 傳送一條短訊 查找更多關於 jaguar 的文章 增加 jaguar 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18116

回覆: 回覆: 回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界

引用:
最初由 jaguar 發表
花了不少時間才看懂這程式碼,感謝總版主,實在太厲害了!
會出現下標越界會是那些狀況呢?編寫程式時要如何預先想到這一點?


不客氣 ^^

舉實例解說:
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 代表該數列為一個無效數列(可用這方法來檢驗)

向版主報告此篇 | 查IP位址
Old Post 2024-12-24 21:25
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
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年,所以上面指標切換到週線就會很容易越界,非常感謝總版主的幫忙和教導

向版主報告此篇 | 查IP位址
Old Post 2024-12-25 00:02
jaguar 現在離線 點選這裡查看 jaguar 的個人資料 點選這裡給 jaguar 傳送一條短訊 查找更多關於 jaguar 的文章 增加 jaguar 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18116

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: [求救]陣列中求中位數值,出現越界

引用:
最初由 jaguar 發表
懂了懂了,關鍵就在定起點,而這起點要考慮指標運算的天數,像上面程式要算500天ewma,需要501天,起點前方就至少要留501天,在日線約2年,切換到週線就將近10年,所以上面指標切換到週線就會很容易越界,非常感謝總版主的幫忙和教導


不客氣^^

向版主報告此篇 | 查IP位址
Old Post 2024-12-25 00:30
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
全部時間均為台灣時間, 現在時間為04:02 發表新主題    回覆主題
  上一主題   下一主題
顯示可列印版本 | 訂閱此主題

論壇跳轉:
主題評分:

論壇規定:
你不可以發表新主題
你不可以回覆文章
你不可以上傳附件
你不可以編輯自己的文章
HTML語法禁止
vB 語法核准
表情符號核准
貼圖語法[IMG]核准
 

本站所有內容未經作者授權禁止轉貼節錄, 發表言論僅供參考勿作為投資決策依據。瀏覽本站請使用 IE 5.5 以上版本, 最佳瀏覽解析度 1024 x 768 全彩。

Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.

簡愛洋行 製作 Copyright 2003-. All Rights Reserved.  聯絡我們