trueAll(,xxx,dateA)篩選出今天未突破的股票昨幾天卻都沒選出...

  •   471 
  • 最後發表   菜鳥  2025 一月 17
菜鳥 發文於   2024/12/26

小編你好!

有一選股腳本跑出的一檔2236百達-KY,很明顯不合乎條件,可否幫查明原因? 

這個腳本是用 trueAll 篩選 "達成某條件後(D日)價格未突破區間",因此不應該發生"D日後第11天才符合"

Input: nD(10,"創新高");

SetTotalBar(nD);

If close=highest(close,nD) and volume=highest(volume,nD) then condition1=true else condition1=false;

value1=barslast(condition1);//創高至今有幾天

value2=high[value1];

value3=low[value1];

if trueAll(low>value3,value1) and trueAll(high<value2*1.02,value1) and  trueAll(close<value2,value1) then ret=1;

outputField1(value1+1,"創高至今");

outputField2(date[value1],"創高日");

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/12/26

你的選股條件並沒有限制value1用幾天的資料算出。

菜鳥 發文於   2024/12/30

許教授你好!

我不懂"限制value1用幾天的資料算出"的意思 ,

因此不知如何限制,可否麻煩教授示範呢? 謝謝!!

虎科大許教授 發文於   2024/12/30

value1=barslast(condition1);//創高至今有幾天

if value1<10 then

   begin

         value2=high[value1];

         value3=low[value1];

         if trueAll(low>value3,value1) and trueAll(high<value2*1.02,value1) and              trueAll(close<value2,value1)

        then ret=1;

        outputField1(value1+1,"創高至今");

        outputField2(date[value1],"創高日");

   end;

菜鳥 發文於   2025/01/02

許教授你好!

我的本意是上次創10日高至今無論幾天,只要符合三個條件就撈出來

並不限創高至今在10日內。

而我舉的2236百達-KY,在創高後的第1~10天都未被選出,而在第11天被選出就很矛盾,

因為如果第11天符合"創高至今的每天都符合條件",那麼在創高後的第1~10天也應該被選出才對啊!

以上,還請教授指導,謝謝!!

虎科大許教授 發文於   2025/01/02

你這裡的邏輯判斷有問題。假設

value1=2,則

value3=low[2]

TrueAll(low>value3,2)代表

low>low[2] and low[1]>low[3]。

解決方法:跑這10根時,每根K棒比較condition1條件是否為True,若為True,就記錄它的最高及最低價,爾後就判斷每根K棒的最低價是否都高於該根K棒的最低價。

這與你希望的low>low[2] and low[1]>low[2]是不同的,亦即你這邊不能用TrueAll處理。

菜鳥 發文於   2025/01/02

許教授你好!

你的解釋讓我明白我的錯就在 "low>low[2] and low[1]>low[2]"...

我原意是你說的"跑這10根時,每根K棒比較condition1條件是否為True,若為True,就記錄它的最高及最低價,爾後就判斷每根K棒的最低價是否都高於該根K棒的最低價"

感謝你~

XS小編 發文於   2025/01/08

Hello 菜鳥,

 

小編補充,barslast 函數是會受到資料讀取筆數長度影響的。

若在腳本運算期間條件都沒有符合的話,barslast 會回傳運算過的K棒數量,而非上一次條件符合的距離。

換句話說,barslast 在運算了10筆的狀況下,就算每根條件都不符合也會回傳10。

虎科大許教授 發文於   2025/01/09

你這裡誤用了BarsLast及TrueAll函數。先貼上程式碼,3/15的週末特訓班(主題:邏輯錯誤的偵錯與除錯(下))將舉此例詳細說明。

Input: nD(10,"創新高");
SetTotalBar(nD);
var: i(0), myH(0), myL(0), countH(0), countL(0);
if isLastBar then
    begin
        value1=highestBar(close,nD);
        value2=highestBar(volume,nD);
        if value1=value2 then //找到符合條件K棒
            begin
                myH=h[value1];
                myL=L[value1];
                if value1>0 then //等於0不需要跑迴圈
                    for i=value1-1 downto 0
                        begin
                            if L[i]>myL then countL+=1;
                            if h[i]<myH*1.02 then countH+=1;
                        end;
                if countL=countH and countL=value1 then ret=1;                      
                outputField1(date[value1],"符合條件K的日期");
                outputField2(value1,"符合條件K的相對位置");
            end;
    end;

 

菜鳥 發文於   2025/01/17

多謝二位解疑,許教授還直接幫我改了,太感謝了!!

不過還有一點請教許教授,就是2916滿心在1/9 似乎符合條件,但是用你的腳本跑出來沒有

你的第一個條件是否取最近10日的最高價且最大量的位置呢 ?,而我想取的是執行日之前最後一次創10日最高價且最大量的位置,請問該怎麼改呢?

虎科大許教授 發文於   2025/01/17

value1=highestBar(close,nD);

value2=highestBar(volume,nD);

value3=BarsLast(value1=value2);

myH=h[value3];

myL=L[value3];

發表回覆
Close