countif 不合預期

  •   163 
  • 最後發表   里歐  2024 五月 07
里歐 發文於   2024/04/06

腳本中有一段如下,想過濾掉過去沒出現過大紅k的個股。
但3293 02/29沒抓到,預期應該要抓到才對,肉眼去看有超過3%的紅k棒如下圖,黃色箭頭都是超過3%。

input:j(100); 

value12 = close/close[1];

value13 = countif(value12 > 1.03, j);

condition11 = value13 > 1;



排序方式: 標準 | 最新
里歐 發文於   2024/04/06

順便附上整個腳本

//突破前高

input:N(2); 

condition5 = GetField("收盤價") >= Highest(GetField("最高價")[1],N);

 

condition6 = close>close[1]*1.024; //

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

 

//價量

input:VolumeLimit(10000);

input:VolumeCloseLimit(800000); //參考 價100, 8000張 //當沖可能要設更高 150*8000 = 1200000 ?

 

Value1 = GetField("成交量");

 

If close < 50 Then

condition11 = Volume > 3000;

If close > 50 and close < 200 Then 

condition11 = Volume > 2000;

If close >= 200 and close <= 500 Then 

condition11 = Volume > 1000;

If close > 500 Then 

condition11 = Volume > 100;

 

// Volume*close > VolumeCloseLimit-1 Then

condition7 = Volume > Average(Volume[1], 5) * 2;

condition12 = Volume > Volume[1] * 2;

//Else

//condition7 = Volume > Average(Volume[1], 5) * 2.5;

 

condition8 = Value1 > VolumeLimit-1;

 

condition9 = Volume*close > VolumeCloseLimit-1;

//if   condition7 and (condition8 or condition9) then ret =1;

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

 

//====後續篩選,均線糾結程度===============================================================

Value1 = average(close, 5);

Value2 = average(close, 10);

Value3 = average(close, 20);

 

 

value5 = MaxList(Value1, Value2, Value3); //均線取最大

value6 = MaxList2(Value1, Value2, Value3); //均線第二大

value7 = MinList(Value1, Value2, Value3);

value8 = MinList2(Value1, Value2, Value3);

 

input:DistMaxMin(1.0371); 

input:DistMaxMid(1.026);

input:DistMidMin(1.026); 

 

condition1 = close > value7; //收盤價大於最低的均線

 

value9 = value5/value7;

condition2 = value9 < DistMaxMin; //差距最大的兩條均線,差距需小於0.35

 

value10 = value5/value6;

condition3 = value10 < DistMaxMid; //最大均線跟第二大均線,差距小於0.26

value11 = value6/value7;

condition4 = value11 < DistMidMin; //第二大均線跟最小均線,差距小於0.26

 

input:DistCloseMax(1.04); 

condition10 = close/value5 < DistCloseMax;

//condition11 = close

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

//過去三個月是否有紅k棒 超過3%? 過濾平穩股票  //但會錯過鴻海 2317 03/04

input:j(100); 

value12 = close/close[1];

value13 = countif(value12 > 1.03, j);

condition11 = value13 > 1;

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

input:k(5);

condition999 =  (condition5 and condition6)  and ((condition7 or condition12) and (condition8 or condition9));

condition111 = TrueAny(condition999, k);

 

 

if   condition11 and condition1 and condition2 and (condition3 or condition4) and condition10 and condition111 then ret =1;

XS小編 發文於   2024/04/09

Hello 里歐,

 

小編這邊畫出測試看起來是沒有問題的 (參考附圖)。

另外您的 condition11 有重複使用 (ex. condition11 = Volume > 100; 和 condition11 = value13 > 1;)。

但就算將所有使用的condition畫出看起來也是符合的。

若您使用的是選股策略,請注意資料讀取筆數要足夠長才可以運算出正確的數值。

就腳本來看資料讀取筆數要100筆才會是正確的,因為 countif 會檢查過去100筆,而其中有用到變數 (value12)。

附加文件

里歐 發文於   2024/04/14

有看小編提供的圖,不確定我有沒有搞錯意思,
我看 PLOT只有1? 代表只抓到一個大於3%?
還是說是指上面給的腳本能順利抓到2/29 3293?

預期 2/27 ,1/29 都漲幅超過3%。
==========================================
countif 會檢查過去100筆,這句有點不懂
我這邊的設定 input:j(100);  原本理解是往前100天

//過去三個月是否有紅k棒 超過3%? 過濾平穩股票  //

input:j(100); 

value12 = close/close[1];

value13 = countif(value12 > 1.03, j);

 

condition11 = value13 > 1;

XS小編 發文於   2024/04/15

Hello 里歐,

 

小編建議您先觀看網站上的教學區教學影片,裡面有XS語法的基礎和應用可以閱覽。

 

小編上面plot畫出的是 condition11 ,而 condition11 是判斷 value13 (countif 的次數) 是否有大於1。

當condition11為True的時候,畫出來的會是1,condition11為False則畫出為0。

這代表著在 2024/02/29 的時候,至少有2根Bar或以上符合條件,因為 value13 > 1 符合。

 

countif(value12 > 1.03, j); 會往前檢查 j 根Bar (這邊的j設定為100)。

故腳本在判斷時會確認過去100根Bar中 value12 是否有大於 1.03。

而value12是變數,要腳本有在前100根Bar中運算過才會有值,故資料讀取筆數需要設定為100,否則沒運算過的Bar value12就會是預設值0。

可參考 資料讀取範圍與腳本執行的關係

里歐 發文於   2024/05/05

我只留condition11  相關的腳本 重跑一次如下,還是沒找到預期的個股3293
(肉眼看 2/27跟1/29都大於前一日3%以上。)

會跟確認%後幾位小數點有關嗎? 2/27漲幅離3%較近。
不過改成>1.029也沒找到。

腳本


2/29 沒抓到


03/01 有抓到

XS小編 發文於   2024/05/07

Hello 里歐,

 

小編這邊測試有正常顯示 (參考附圖)。

請確認資料讀取筆數是否有設定足夠,原因同小編前次回覆。

附加文件

大R 發文於   2024/05/07

也可以在程式碼加入 settotalbar或setbarback 

要設定足夠的歷史資料筆數 才能得到正確結果

可參考 https://www.xq.com.tw/lesson/xspractice/%e8%a8%ad%e7%bd%ae%e6%8c%87%e5%ae%9a%e9%a0%bb%e7%8e%87%e5%bc%95%e7%94%a8%e7%ad%86%e6%95%b8%e7%9a%84%e6%87%89%e7%94%a8/

發表回覆
Close