想問一下小幫手

  •   331 
  • 最後發表   clanDX  2 天前
clanDX 發文於   2022/01/18

不好意思,想請問一下小幫手~

我用XS選股策略選出歷年漲幅排行榜
資料讀取筆數設定為350筆數
但是當日期調整到2018~2019的時候
選出的股票是錯誤的
我推測是資料讀取筆數的問題
我嘗試改成700筆讀取,但執行時間過久會失敗
不知道是否解決辦法?還是其他問題造成的呢?
程式碼如下

再麻煩小幫手幫忙了~感謝您!

input:startdate(20201231,"計算起始日");
input:enddate(20211231,"計算結束日");
value1=getbaroffset(startdate);
value2=getbaroffset(enddate);
value3=Lowest(Close[value2], value1); 
value4=Highest(Close[value2], value1);

if value3<>0 then
value5=(value4/value3-1)*100;
input:ratio(100,"最小漲幅");
if value3*(1+ratio/100)<value4
then ret=1;

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

Hello clanDX,

 

您想的沒錯,資料讀取筆數會影響。

因為 getbaroffset 要有運算才會增加,您可以使用 print 或是 outputfield 來觀察 value1 和 value2 在不足或是足夠資料讀取筆數狀況下的差別。

您除了直接增長筆數外,也可以選擇開始日期(參考附圖)。

另外 value3 和 value4 的部分應該修改為:

value3=Lowest(Close[value2], value1 - value2); 

value4=Highest(Close[value2], value1 - value2);

這樣才會是檢查開始日期到結束日期間的筆數。

為了避免運算過久導致逾時,您可以使用 IsLastBar 來限制腳本只有在最新一筆時才會運算。

附上選股中心匯出檔供您參考。

附加文件

clanDX 發文於   2022/01/21

感謝小幫手~您太強啦!

clanDX 發文於   2026/03/07

小幫手您好 我將程式碼改成

input:startdate(20241231,"計算起始日");

input:enddate(20251231,"計算結束日");

input:ratio(100,"最小漲幅"); 

if isLastBar then begin

value1=getbaroffset(startdate);

value2=getbaroffset(enddate);

value3=Lowest(Close[value2], value1 - value2); 

value4=Highest(Close[value2], value1 - value2);

value10=HighestBar(high[value2],value1-value2);

value11=lowestBar(low[value2],value1-value2);

if value3<>0

then value5=(value4/value3-1)*100;

if value3*(1+ratio/100)<value4 and value10<value11 

then ret=1;

end;

outputField1(value3,2,"最低價");

outputfield2(value4,2,"最高價");

outputfield3(value5,1,"區間漲幅");

資料讀取設定為2015/12/31

跑出來的最低價一直是0

請問是甚麼問題呢?

虎科大許教授 發文於   2026/03/07

選股腳本預設讀取資料10筆。你用getbaroffset 抓的開始及結束日期傳回的K棒距離兩者都相同。

加上setTotalBar(500);看看。

clanDX 發文於   2026/03/16

我已經將資料讀取設定為2015/12/31

跑出來的最低價一直是0

再麻煩小幫手幫忙檢查一下,感謝

虎科大許教授 發文於   2026/03/16

setTotalBar(500);
input:startdate(20241231,"計算起始日");
input:enddate(20251231,"計算結束日");
input:ratio(100,"最小漲幅"); 
if isLastBar then 
    begin
        value1=getbaroffset(startdate);
        value2=getbaroffset(enddate);
        value3=simpleLowest(Close[value2], value1 - value2); 
        value4=simpleHighest(Close[value2], value1 - value2);
        value10=simpleHighestBar(high[value2],value1-value2);
        value11=simplelowestBar(low[value2],value1-value2);
        if value3<>0
            then value5=(value4/value3-1)*100;
        if value3*(1+ratio/100)<value4 and value10<value11 
            then ret=1;
    end;
outputField1(value3,2,"最低價");
outputfield2(value4,2,"最高價");
outputfield3(value5,1,"區間漲幅");

發表回覆
Close