在setbarfreq("D")的情況下,選股script中,如何撰寫大戶持有率的變化

  •   451 
  • 最後發表   好朋友888  2019 三月 07
好朋友888 發文於   2019/02/20

小幫手您好,

在setbarfreq("D")的情況下, 我在選股的script中,想要查出某兩天對應的400大戶持有率, 進而算出其中變化, 請問如何撰寫.

例如: 今天是20190220, 而我要

1.查出20190109(或是今天是第0根K棒,20190109是第23根K棒)那周的400大戶持有率

2. 查出20190212(或是今天是第0根K棒,20190212是第6根K棒)那周的400大戶持有率

3. 進而算出持股變化

請協助,謝謝!

排序方式: 標準 | 最新
XQ小幫手 發文於   2019/02/20

Hi 好朋友888,

您好,可以使用序列資料來取得歷史資料,例如:

今天是20190220,而要

1. 查出 20190109 那週的400大戶持有率,因 20190109 那週距 20190220 這週,為 5 期序列資料,

故可以使用 GetField("大戶持股比例","W",param := 400)[5] 取得 20190109 那週的大戶持股比例資料。

2. 查出 20190212 那週的400大戶持有率,因 20190212 那週距 20190220 這週,為 1 期序列資料,

故可以使用 GetField("大戶持股比例","W",param := 400)[1] 取得 20190212 那週的大戶持股比例資料。

 

如附檔選股策略匯出檔,以上方向供您參考,謝謝。

附加文件

好朋友888 發文於   2019/02/20

小幫手,

您說的我都了解,但如何能夠在script中,能夠自動轉換從日K期序,轉換成周期序?而非用人工計算.這才是我問的重點. 也就是如何分別將日K棒期序23與6,;利用程式碼轉換成周K棒期序5與1.

也就是實際的狀況,是在一般撰寫程式碼時,我找到某一K棒期序為m,他所對應的周K棒期序為何?

謝謝您!

XQ小幫手 發文於   2019/02/21

Hi 好朋友888,

您好,或許可以使用 xf_getdtvalue 函數,經由傳入的日期判斷指定頻率的期別是否有異動,

如有異動則代表跨週,跨週的時候變數進行累加,應該就能代表週期別的序列,

有了週期別的序列,就能使用序列資料引用大戶持股比例資料,

如附檔選股策略範例,以上方向供您參考,謝謝。

附加文件

好朋友888 發文於   2019/02/21

小幫手謝謝您,

我run了您附過來的的程式,的確是我要的結果,很感謝您,只是,我無法理解您的程式碼的邏輯,我也把這過程的變數也用outputfield打印出來研究,問題如下:

1. if value1 <> value1[1] then value99 += 1; 這行我的理解是相當於if value1 <> value1[1] then value99 = value99+1, 其中value99並未有任何的初始值設定,也無其他的運算,為何outputfield 的結果value99是"7".在我的理解value99可能結果應該不是0,就是1

2.value2 和value3,除了

if date = date1 then value2 = value99;

if date = date2 then value3 = value99;

這兩行有關係,我的理解是,由於date1,date2和date日期都不一樣,這行實際上應該是沒有執行,value2和value3也沒有其他的任何運算,為何outputfield 的結果是分別是value2=6, value3=2,百思不得其解.

以上兩個問題,請解惑,再次麻煩您!謝謝!

p.s. 附上您的程式碼如下

setbarfreq("D");

input:date1(20190212,"YYYYMMDD"), date2(20190109,"YYYYMMDD");

value1 = xf_getdtvalue("W",date);

if value1 <> value1[1] then value99 += 1;

if date = date1 then value2 = value99;

if date = date2 then value3 = value99;

value4 = GetField("大戶持股比例","W",param := 400)[value99-value2];

value5 = GetField("大戶持股比例","W",param := 400)[value99-value3];

 

ret = 1;

//==============outputfield1-outputfield8是我自己加上去,驗證用的============

outputfield1(date,"date");

outputfield2(date1,"date1");

outputfield3(date2,"date2");

outputfield4(value1,"value1");

outputfield5(value1[1],"value[1]");

outputfield6(value99,"value99");

outputfield7(value2,"value2");

outputfield8(value3,"value3");

//====================================

outputfield11(value4, "date1大戶持股比例");

outputfield12(value5, "date2大戶持股比例");

  • 按讚來自於
  • ta17061
XQ小幫手 發文於   2019/02/22

Hi 好朋友888,

也把這過程的變數也用outputfield打印出來研究

您好,現在 Print 語法有支援選股腳本,建議使用 Print 來檢驗數值會比較方便檢驗


 

1. if value1 <> value1[1] then value99 += 1; 這行我的理解是相當於if value1 <> value1[1] then value99 = value99+1, 其中value99並未有任何的初始值設定,也無其他的運算,為何outputfield 的結果value99是"7".在我的理解value99可能結果應該不是0,就是1

因為 xf_GetDTValue 語法可以經由傳入的日期判斷指定頻率的期別是否有異動,所以用以下兩行程式碼,

在換週的時候,會累加變數 value99,建議使用 Print 語法檢驗相關數值,有較完整的區間顯示,比較好對照查看。

value1 = xf_getdtvalue("W",date);
if value1 <> value1[1] then value99 += 1;

 

2.value2 和value3,除了

if date = date1 then value2 = value99;

if date = date2 then value3 = value99;

這兩行有關係,我的理解是,由於date1,date2和date日期都不一樣,這行實際上應該是沒有執行,value2和value3也沒有其他的任何運算,為何outputfield 的結果是分別是value2=6, value3=2,百思不得其解.

date1、date2 和 date 日期是會有可能一樣的,因為XS選股架構,是會依據資料筆數或資料日期開始每一期執行一次腳本,

故資料日期設為 20190101 的期況下,每次交易日皆執行一次腳本,而 date 會隨著交易日的變動而改變數值,

這部分也建議使用 Print 語法,較好檢驗區間數值,來驗證釐清。

 

有關 Print 語法範例如下,記得在選股中心勾選「啟動腳本內Print指令」,以上說明與方向供您參考,謝謝。

print("date=",date,"value99=",value99,"value2=",value2,"value3",value3);

  • 按讚來自於
  • ta17061
好朋友888 發文於   2019/02/22

小幫手謝謝您,

我用print功能,已完全了解這script運作過程,date 這個函數,是從今年的20190102自動開始計算,一直計算到今天為止,但我還是面臨到兩個問題,

1. 若是欲查詢的日期不是在今年,如20180718,或20170913請問該如何處理?

2.由於XQ一般在運算中,都是以K-bar的第幾根作為基礎,例如,我找到了某個滿足條件為日K-bar "18" 我試著用date1=date[18],作為比較基礎,但這卻是行不通,因為我發覺,script在 run時,date1會自動先從20190102往前推18根,然後每次運算再往後加1天,變成了一個不固定值,而無法做比對(也就是說,在if date = date1 then value2 = value99;中date與date1都變成了變數),所以請問如何將日K bar "18"轉成日期,且固定,以作為比較基準 ?

以上又要麻煩您了!

XQ小幫手 發文於   2019/02/26

Hi 好朋友888,

1. 若是欲查詢的日期不是在今年,如20180718,或20170913請問該如何處理?

您好,小幫手會使用 setfirstvardate 函數,將最先前的日期(例如:20170913)當作是資料讀取筆數的初始日期,

這樣應該就能欲查詢到不是在今年的大戶持股比例資料,

如附檔選股策略匯出檔範例,以上方向供您參考,謝謝。


 

2.由於XQ一般在運算中,都是以K-bar的第幾根作為基礎,例如,我找到了某個滿足條件為日K-bar "18" 我試著用date1=date[18],作為比較基礎,但這卻是行不通,因為我發覺,script在 run時,date1會自動先從20190102往前推18根,然後每次運算再往後加1天,變成了一個不固定值,而無法做比對(也就是說,在if date = date1 then value2 = value99;中date與date1都變成了變數),所以請問如何將日K bar "18"轉成日期,且固定,以作為比較基準 ?

date[18] 這個是日期的序列資料,在XS執行選股時,他會取得每根K棒的 date[18] 所以這個不會是固定值,

請問您的固定值日期為何?我們可以討論看看可否用其他方式做到,謝謝。

好朋友888 發文於   2019/02/26

小幫手謝謝您,

我舉一個實際我需求的例子如下, 我的目的是找出一段時間內最高價,最低價和其對應的大戶持股率, 並且是在股價下跌過程中,持股反向增加 . 

 

input: N(89, "設定找尋日數");

 

setfirstbardate(20180901);

settotalbar(N+10);

setbarfreq("D");

var: date1(0),date2(0);

value5=highestbar(H,N);

value6=lowestbar(L,N);

 

value15=high[value5];

value16=low[value6];

 

date1=date[value5];

date2=date[value6];

 

value1=xf_getdtvalue("w",date);

if value1 <> value1[1] then value99 += 1;

if date = date1 then value2 = value99;

if date = date2 then value3 = value99;

 

value11 = GetField("大戶持股比例","W",param := 400)[value99-value2];

value12 = GetField("大戶持股比例","W",param := 400)[value99-value3];

value8 = value12 - value11;

 

if value5>value6 and value8>0 then ret = 1;//股價下跌,但大戶持有增加

 

outputfield1(date,"date");

outputfield2(date1,"date1");

outputfield3(date2,"date2");

outputfield4(value15,"最高價");

outputfield5(value16,"最低價");

 

outputfield11(value4, "date1大戶持股");

outputfield12(value5, "date2大戶持股");

outputfield14(value8,"高低大戶持股變化");

XQ小幫手 發文於   2019/02/27

Hi 好朋友888,

您好,謝謝您提供相關資訊,

待小幫手查看研究後再向您說明,謝謝。

XQ小幫手 發文於   2019/03/06

Hi 好朋友888,

是在股價下跌過程中,持股反向增加

您好,想與您討論一下這段的想法,

小幫手覺得用都用週資料來做可能會較好些,

觀點是「大戶持股反向增加」僅能在換週才有可能達到,

故股價也用週資料來判斷會比較好做到,以上是小幫手淺見,供您參考,謝謝。


 若您要使用日頻率跨週頻率取相關資料,以下這兩段程式碼

if date[i] = date1 then value2 = value99[i];
if date[i] = date2 then value3 = value99[i];

要加上 For 迴圈來取得大戶持股週資料序列,才有可能做到

for i = 0 to N begin
    if date[i] = date1 then value2 = value99[i];
    if date[i] = date2 then value3 = value99[i];
end;

缺點是跑選股會有點慢(尤其是普通股全部下去跑),因為使用 for 迴圈吃的資源會較多,

如範例附檔,以上方向供您參考,謝謝。

 

附加文件

顯示更多回應 發表回覆
Close