除權息日計算問題

  •   181 
  • 最後發表   chaoyueh  2021 五月 07
chaoyueh 發文於   2021/05/06

小幫手好,

嘗試寫個選股腳本,想了解前一次除權息後30天內的最高點為何?

程式碼如下,但找出來的高點幾乎都不是除權息後30天內的最高點,對的只有1104的環泥

settotalBar(300);


input:periodcheck(30,"除權息後幾日");

var: i(0); 

if date<>date[1] then begin 

   ret=1;

   if getfield("除權息日期")>=date then i=1 else i=0; //只要已發生的除權息

   value1=getfield("除權息日期")[i]; //前一次的除權息日
   value2=getfield("除權息值")[i];
   value3=getbarOffset(getfield("除權息日期")[i]); //現在距除權息日多少天
   value4=closeD(value3+1); //除權息前一日收盤價
   value5=highest(high,periodcheck)[value3-periodcheck]; //除權息N天內最高點

end;

outputfield1(value1,"除權息日");
outputfield2(value2,"除權息值");
outputfield3(value3,"距除權息多少日");
outputfield4(value4,"前一日收盤價");
outputfield5(value5,"N日最高價");

為了驗證寫法是否為錯誤,我將裡面的[i]全部改為0,出來的最高價就是正確的 (見下方),

而且經比較兩個結果,除了N日最高價的值不同外,其他值都是一樣的,表示寫法應該是對的

問題1: 為何會上面寫法出來的值就不對? 問題在哪? 要如何修改?

我的i變數要保留,因為會需要取更早之前的除權息資料

settotalBar(300);
input:periodcheck(30,"除權息後幾日");

var: i(0); 

if date<>date[1] then begin 

ret=1;

//if getfield("除權息日期")>=date then i=1 else i=0;

value1=getfield("除權息日期")[0]; //前一次的除權息日
value2=getfield("除權息值")[0];
value3=getbarOffset(getfield("除權息日期")[0]); //現在距除權息日多少天
value4=closeD(value3+1); //除權息前一日收盤價
value5=highest(high,periodcheck)[value3-periodcheck]; //除權息N天內最高點

end;

outputfield1(value1,"除權息日");
outputfield2(value2,"除權息值");
outputfield3(value3,"距除權息多少日");
outputfield4(value4,"前一日收盤價");
outputfield5(value5,"N日最高價");

問題2: 雖然寫法2有抓到高點,但在核對過程中發現,5520立泰卻還是沒有抓到最高點,不知道是何原因,煩請小幫手了解下

 

 

 

XQ小幫手 發文於   2021/05/07

Hello chaoyueh,

 

您可以把

value5=highest(high,periodcheck)[value3-periodcheck]

改為

value5=highest(high,periodcheck)

outputfield5(value5[value3-periodcheck],"N日最高價");

或是

value5=SimpleHighest(high,periodcheck)[value3-periodcheck];

即為正確結果。

 

至於原因是跟highest裡面使用的extremes有關,由於extremes需要有序的從左到右計算,而 highest(high,periodcheck)[value3-periodcheck] 這種寫法會讓它跳著計算而發生錯誤。

SimpleHighest 的話則是使用 for 迴圈去比較範圍內的值,因此不會出問題。

發表回覆
Close