小幫手您好,
在setbarfreq("D")的情況下, 我在選股的script中,想要查出某兩天對應的周400大戶持有率, 進而算出其中變化, 請問如何撰寫.
例如: 今天是20190220, 而我要
1.查出20190109(或是今天是第0根K棒,20190109是第23根K棒)那周的400大戶持有率
2. 查出20190212(或是今天是第0根K棒,20190212是第6根K棒)那周的400大戶持有率
3. 進而算出持股變化
請協助,謝謝!
小幫手您好,
在setbarfreq("D")的情況下, 我在選股的script中,想要查出某兩天對應的周400大戶持有率, 進而算出其中變化, 請問如何撰寫.
例如: 今天是20190220, 而我要
1.查出20190109(或是今天是第0根K棒,20190109是第23根K棒)那周的400大戶持有率
2. 查出20190212(或是今天是第0根K棒,20190212是第6根K棒)那周的400大戶持有率
3. 進而算出持股變化
請協助,謝謝!
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 那週的大戶持股比例資料。
如附檔選股策略匯出檔,以上方向供您參考,謝謝。
小幫手,
您說的我都了解,但如何能夠在script中,能夠自動轉換從日K期序,轉換成周期序?而非用人工計算.這才是我問的重點. 也就是如何分別將日K棒期序23與6,;利用程式碼轉換成周K棒期序5與1.
也就是實際的狀況,是在一般撰寫程式碼時,我找到某一K棒期序為m,他所對應的周K棒期序為何?
謝謝您!
小幫手謝謝您,
我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大戶持股比例");
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);
小幫手謝謝您,
我用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"轉成日期,且固定,以作為比較基準 ?
以上又要麻煩您了!
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] 所以這個不會是固定值,
請問您的固定值日期為何?我們可以討論看看可否用其他方式做到,謝謝。
小幫手謝謝您,
我舉一個實際我需求的例子如下, 我的目的是找出一段時間內最高價,最低價和其對應的大戶持股率, 並且是在股價下跌過程中,持股反向增加 .
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,"高低大戶持股變化");
Hi 好朋友888,
您好,謝謝您提供相關資訊,
待小幫手查看研究後再向您說明,謝謝。
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 迴圈吃的資源會較多,
如範例附檔,以上方向供您參考,謝謝。
12 評論