如何撰寫"N日前突破糾結均線"的選股腳本?

  •   704 
  • 最後發表   皓子  2024 七月 15
皓子 發文於   2024/07/08

XS選股機器人中,有 "突破糾結均線" 的選股腳本,但是如果想要指定突破糾結均線的時間點是 N 日前,該如何修改?

例如 "四日前突破糾結均線",然後可以篩出下圖這檔。

4日前突破糾結均線

排序方式: 標準 | 最新
鍵盤上的小白兔 發文於   2024/07/08

我是初學者 , 試著寫看看 , 如果要所有均線朝上 , 再自行加一下條件

var:ma5(0);

var:ma10(0);

var:ma20(0);

var:ma60(0);

var:B5DHigh(0);

 

ma5=average(c,5);

ma10=average(c,10);

ma20=average(c,20);

ma60=average(c,60);

B5DHigh=maxlist(ma5[5],ma10[5],ma20[5],ma60[5]);

 

condition1=trueall(ma5>ma10,4);

condition2=trueall(ma10>ma20,4);

condition3=trueall(ma20>ma60,4);

condition4=ma5[5]<>B5DHigh;

 

if condition1 and condition2 and condition3 and condition4 then

  ret=1;

  • 按讚來自於
  • HOWDZLIN
虎科大許教授 發文於   2024/07/08

(1)用input宣告N。讓程式更有彈性。

(2)確認均線有哪幾條均線,它們的天數各多少。

(3)用input定義糾結的天數。

(4)找出N+1天往前的糾結天數中,這些均線的最高與最低數值。

(5)N+1天前的收盤價在(4)的最高與最低數值之間。

(6)N天前收盤價高於所有均線。

  • 按讚來自於
  • HOWDZLIN
鍵盤上的小白兔 發文於   2024/07/08

謝謝教授的回答 , 剛剛一覺醒來 , 也覺得其中一個條件式不夠嚴謹

(4)(5)我今天消化消化 , 解讀一下其中的用意 , 再來修改看看

 

虎科大許教授 發文於   2024/07/08

很高興有人願意在這個論壇裡面,將別人的問題當作練習題來做,這樣程式的功力會進步很快。皓子的問題不需要每根K棒都做運算,比較有效率的寫法是在最後一根K棒才做判斷。用isLastBar控制只有在最後一根K棒才做運算。

  • 按讚來自於
  • HOWDZLIN
鍵盤上的小白兔 發文於   2024/07/09

學到了 , isLastBar , 謝謝許教授

晚上我改一下 , 再麻煩教授有空上來時順便看一下

 

皓子 發文於   2024/07/09

抱歉,因為只有晚上下班才有時間上論壇、研究腳本,回覆晚了;

感謝許教授指點!!

(1) ~ (5) 大致都理解意思,就是要先找出糾結、然後(6)代表突破了,

但是還不太清楚怎麼透過 isLastBar 來達到 N 天前的條件,

我再去做點功課、觀摩一下其他前輩的腳本!

小白兔學長,感謝回覆,再拜託您分享一下 isLastBar 的應用,感激不盡!!

皓子 發文於   2024/07/09

這是選股機器人中 "突破糾結均線" 的範例程式碼,不知道要如何把 isLastBar 的用法套用進去 :

setbarfreq("AD");

 

input: shortlength(5); setinputname(1,"短期均線期數");

input: midlength(10); setinputname(2,"中期均線期數");

input: Longlength(20); setinputname(3,"長期均線期數");

input: Percent(5);  setinputname(4,"均線糾結區間%");

input: XLen(20);  setinputname(5,"均線糾結期數");

 

input: Volpercent(25);  setinputname(6,"放量幅度%");//帶量突破的量是超過最長期的均量多少%

variable: shortaverage(0);

variable: midaverage(0);

variable: Longaverage(0);

variable: AvgHLp(0),AvgH(0),AvgL(0);

 

shortaverage = average(close,shortlength);

midaverage = average(close,midlength);

Longaverage = average(close,Longlength);

 

AvgH = maxlist(shortaverage,midaverage,Longaverage);

AvgL = minlist(shortaverage,midaverage,Longaverage);

 

if AvgL > 0 then AvgHLp = 100*AvgH/AvgL -100;

 

condition1 = trueAll(AvgHLp < Percent,XLen);

condition2 = V > average(V[1],XLen)*(1+Volpercent/100) ;

condition3 = C > AvgH *(1.02) and H > highest(H[1],XLen);

condition4 = average(volume[1], 5) >= 1000; 

 

ret = condition1 and condition2 and condition3 and condition4;

 

outputfield(1,AvgH,2,"均線上緣", order := -1);

outputfield(2,AvgL,2,"均線下緣");

 

 

 

鍵盤上的小白兔 發文於   2024/07/09

isLastBar用法如下

只要找出最後一天符合條件的股票

所以針對最後一根K棒計算即可

這樣是可以跑出你想要的股票

但許教授寫的還有幾項我沒有領悟,所以沒有寫進去

還未完善,但可以先參考看看

 

input:ND_mul(4,"已經多頭排列期數");

input:shortD(5,"短均線期數");

input:midD1(10,"中均線1的期數");

input:midD2(20,"中均線2的期數");

input:longD(60,"長均線的期數");

 

var:shortaverage(0);

var:midD1average(0);

var:midD2average(0);

var:longaverage(0);

var:AvgH(0);

var:AvgL(0);

 

shortaverage=average(c,shortD);

midD1average=average(c,midD1);

midD2average=average(c,midD2);

longaverage=average(c,longD);

AvgH=maxlist(shortaverage[ND_mul+1],midD1average[ND_mul+1],midD2average[ND_mul+1],Longaverage[ND_mul+1]);

AvgL=minlist(shortaverage[ND_mul+1],midD1average[ND_mul+1],midD2average[ND_mul+1],Longaverage[ND_mul+1]);

 

condition1=trueall(shortaverage>midD1average,ND_mul);

condition2=trueall(midD1average>midD2average,ND_mul);

condition3=trueall(midD2average>longaverage,ND_mul);

condition4=shortaverage[ND_mul+1]<AvgH and shortaverage[ND_mul+1]>AvgL;

condition5=c[ND_mul]>maxlist(shortaverage[ND_mul],midD1average[ND_mul],midD2average[ND_mul],Longaverage[ND_mul]);

 

if islastBar=true then

  begin

    if condition1 and condition2 and condition3 and condition4 and condition5 then

      ret=1;

  end;   

  • 按讚來自於
  • HOWDZLIN
XS小編 發文於   2024/07/15

Hello 皓子,

 

小編補充,內建的 condition 是個布林變數,和 value1 一樣可以取得前期值。

故若您的條件和原本的內建腳本相同,只是要取得前N期是否符合條件的話,可以將

ret = condition1 and condition2 and condition3 and condition4;

修改為

input: _n(5);   //假設是要5期前突破糾結均線

ret = condition1[_n] and condition2[_n] and condition3[_n] and condition4[_n];

也會有相同的效果 (只是就無法用 islastbar 來節省效能,因為要有運算過才會有前期值)。

 

網站上有教學區教學影片,裡面有XS語法的基礎和應用可以閱覽。

 

感謝 鍵盤上的小白兔 和 虎科大許教授 的熱心回覆。

  • 按讚來自於
  • HOWDZLIN
皓子 發文於   2024/07/15

感謝小編,我有照你的方法試出來了!!

目前看起來篩選出來的算是有符合我預期要的結果;
但因為我目前使用的是免費版,測試過程用掉可用次數了,
我會繼續驗證,並再繼續研究看看加入其他條件,
感謝您提供的協助與教學資訊,

謝謝!!~~

發表回覆
Close