長天期均線的搜尋與運用

  •   572 
  • 最後發表   morris8888  2024 七月 01
morris8888 發文於   2024/04/27

我想用選股功能,同時找出大於10年線 5年線 20個月均線 的個股,但會遭遇個股資料長度不足問題。

 

我在 選股中心以 月頻率 同時使用下列3個腳本

SetTotalBar(70);

input: X (60,"天期");

value1 = average(close,x);

condition1 = close > value1;

If condition1 then ret=1;

 

SetTotalBar(130);

input: X (120,"天期");

value1 = average(close,x);

condition1 = close > value1;

If condition1 then ret=1;

 

SetTotalBar(30);

input: X (20,"天期");

value1 = average(close,x);

condition1 = close > value1;

If condition1 then ret=1;

如果三項條件都成立,自然會篩選出來,但若是遇到個股資料長度不足10年,就會直接淘汰。而我希望獲得的資料是,因個股上市櫃的時間不足10年,所以沒有10年線,但若符合其它兩項條件也能同時篩選出來,而不需要分次篩選。

請問小編有什麼方式 能滿足我的篩選要求? 

另外 有沒有可能,貴公司提供的資料長度,從個股登錄興櫃就開始計算?

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/04/27

(1)請只使用一個SetTotalBar,若有好幾個,則只有最後一個有效。ret=1也是一樣,只用一個ret=1;

SetTotalBar(130);

SetBarFreq("M");

input: X (120,"月期"),Y (60,"月期"), Z(20,"月期");

value1= average(close,X);

value2= average(close,Y);

value3= average(close,Z);

condition1 = close > value1;

condition2 = close > value2;

condition3 = close > value3;

If condition1 and condition2 and condition3 then ret=1;

(2)使用GetFieldStartOffset可查詢欄位資料長度。

 

XS小編 發文於   2024/04/30

 Hello morris8888,

 

您可以使用 GetFieldStartOffset 來取得資料長度,並以此來判斷要計算多長的資料。

舉例來說:

input: X (120,"天期");

value1 = GetFieldStartOffset("Close", "M");

if value1 + 1 < X then value2 = average(close, value1 + 1) else value2 = average(close,x);

condition1 = close > value2;

If condition1 then ret=1;

這樣腳本就會先判斷資料長度是否足夠,如果足夠的話就計算120期,否則有多長就計算多長的平均。

 

另外您的腳本中並沒有用到變數的前期值,且選股執行時預設是將所有資料拉出,故資料讀取筆數設為1筆即可。

關於資料讀取筆數和資料引用筆數可以參考 資料讀取範圍與腳本執行的關係 的說明。

morris8888 發文於   2024/06/30

謝謝小編的耐心回覆

我希望找出來的個股是 如果個股資料長度大於120個月 腳本可以找出收盤價 同時 大於 120個月 60個月 20個月 平均線的個股。

若個股資料長度小於120個月 但大於60個月,腳本可以 略過 收盤價大於120個月平均線的搜尋條件,進而找出收盤價大於60個月及20個月平均線的個股,而不是有多長的資料就計算多長的平均線。

麻煩小編撥空指導

虎科大許教授 發文於   2024/06/30

input: X(120,"月期"), Y(60,"月期"), Z(20,"月期");

value4 = GetFieldStartOffset("Close", "M");

if value4>=X then

begin

value1= average(close,X);

value2= average(close,Y);

value3= average(close,Z);

condition1 = close > value1;

condition2 = close > value2;

condition3 = close > value3;

If condition1 and condition2 and condition3 then ret=1;

end

else if value4>=Y then

begin

value2= average(close,Y);

value3= average(close,Z);

condition2 = close > value2;

condition3 = close > value3;

If condition2 and condition3 then ret=1;

end;

outputField1(value1,numtoStr(X,0)+"月均線");

outputField2(value2,numtoStr(Y,0)+"月均線");

outputField3(value3,numtoStr(Z,0)+"月均線");

morris8888 發文於   2024/07/01

謝謝許教授耐心指導 由衷的感謝

發表回覆
Close