歷史資料用Array帶入有誤

  •   265 
  • 最後發表   好朋友888  2022 一月 25
好朋友888 發文於   2022/01/12

小幫手您好,

請參閱附件程式碼,當我將程式碼中疑問程式碼部分,標記起來,可以找到符合條件的股票有1620支,可當我加入疑問程式碼部分,將歷史資料帶入array中,只剩下1250支股票,不知原因為何? 又如何解決,謝謝!

另外,我如果想取歷史資料中,每年的平均收盤價(用月或周收盤價平均),不知如何寫法? 謝謝!

      好朋友 敬上

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/01/17

Hello 好朋友888,

 

選股中心的選股結果可以切換顯示的商品。

如果您切換到執行錯誤的商品就可以看到錯誤訊息。(參考附圖)

就小幫手看來錯誤訊息大多為除以零和欄位資料不存在。

您可以針對value21, value33, ArrPe和ArrYield等有用到處法的部分作調整,舉例來說:

if GetField("每股稅後淨利(元)", "Y") <> 0 then value21=GetField("收盤價", "Y")/GetField("每股稅後淨利(元)", "Y") else value21 = 0; //PE

if GetField("收盤價", "Y") <> 0 then value33=100*GetField("股利合計", "Y")/GetField("收盤價", "Y") else value33 = 0; //yield

if GetField("每股稅後淨利(元)", "Y")[i-1] <> 0 then ArrPe[i]=GetField("收盤價", "Y")[i-1]/GetField("每股稅後淨利(元)", "Y")[i-1] else ArrPe[i] = 0;

if GetField("收盤價", "Y")[i-1] <> 0 then ArrYield[i]= 100*GetField("股利合計", "Y")[i-1]/GetField("收盤價", "Y")[i-1] else ArrYield[i] = 0;

這樣大部分除以零的錯誤就可以去除掉。

 

您可以使用 average 函數來取得平均值,舉例來說:

average(getfield("Close", "W"), 50) 就會是過去50週平均。

average(getfield("Close", "M"), 12) 就會是過去12個月的平均。

附加文件

好朋友888 發文於   2022/01/20

小幫手,

謝謝!您的說明 對於平均價,我是指須指定期間,或日期 如今天是2022/1/20, 我想取

1. 2016-2020這段期間,每年的周平均價

2.或我想取2016的"年"開盤價, 年中價,及收盤價

以上這兩個例子,該如何撰寫,謝謝!

XQ小幫手 發文於   2022/01/25

Hello 好朋友888,

 

1.

您可以使用 GetBarOffset 來取得開始與結束日期的相對位置,然後對這段時間的價格做平均。

舉例來說,在週頻率下:

value1 = getbarOffset(20160101);

value2 = getbaroffset(20161231);

value4 = 0;

value5 = 0;

 

for value3 = value2 to value1 begin

    value4 += 1;    //期間有幾筆 (相當於 value1 - value2 + 1)

    value5 += close[value3];    //期間加總

    end;

 

則 value5 / value4 就會是這段期間內的平均。

 

2.

您可以使用 GetField 來跨頻率取值,搭配 Year 來搜尋年分。

舉例來說:

value1 = 0;

while year(getfield("Date", "Y")[value1]) <> 2016 begin

    value1 += 1;

    if value1 = 15 then break;

    end;

 

這樣 getfield("Close", "Y")[value1] 就會是2016年的收盤價,getfield("Open", "Y")[value1] 則是當年的開盤價。

至於年中價,您可以使用 GetBarOffset 來抓取相對應日期的資料。

 

須注意資料讀取筆數要設的夠長才行,至少要等同於您開始計算的日期。

且由於有使用到迴圈,可以加上條件 islastbar 讓其只在最新一根Bar運作,避免運算過久而逾時。

發表回覆
Close