數值比較錯誤

  •   317 
  • 最後發表   桑尼  2024 十月 22
桑尼 發文於   2024/10/10

我做了一支程式來抓30年來的創新高價。

也有用 OutputField來顯示數值做確認。

但出來的結果竟是錯的!?

例如佳格明明三年前的數字是低於今年的,但還被選出。

這是系統的問題嗎?

 

程式如附件

 

 

SettotalBar(500);

 

//Year

Value1= GetField("最高價","Y");

Value2= GetField("最高價","Y")[1];

Value3= GetField("最高價","Y")[2];

Value4= GetField("最高價","Y")[3];

Value5= GetField("最高價","Y")[4];

Value6= GetField("最高價","Y")[5];

Value7= GetField("最高價","Y")[6];

Value8= GetField("最高價","Y")[7];

Value9= GetField("最高價","Y")[8];

Value10= GetField("最高價","Y")[9];

Value11= GetField("最高價","Y")[10];

Value12= GetField("最高價","Y")[11];

Value13= GetField("最高價","Y")[12];

Value14= GetField("最高價","Y")[13];

Value15= GetField("最高價","Y")[14];

Value16= GetField("最高價","Y")[15];

Value17= GetField("最高價","Y")[16];

Value18= GetField("最高價","Y")[17];

Value19= GetField("最高價","Y")[18];

Value20= GetField("最高價","Y")[19];

Value21= GetField("最高價","Y")[20];

Value22= GetField("最高價","Y")[21];

Value23= GetField("最高價","Y")[22];

Value24= GetField("最高價","Y")[23];

Value25= GetField("最高價","Y")[24];

Value26= GetField("最高價","Y")[25];

Value27= GetField("最高價","Y")[26];

Value28= GetField("最高價","Y")[27];

Value29= GetField("最高價","Y")[28];

Value30= GetField("最高價","Y")[29];

 

If Value1>Value2 and Value1>Value3 and Value1>Value4 and Value1>Value5 and Value1>Value6 and Value1>Value7 and 

Value1>Value8 and Value1>Value9 and Value1>Value10 and Value1>Value11 and Value1>Value12 and Value1>Value13 and 

Value1>Value14 and Value1>Value15 and Value1>Value16 and Value1>Value17 and Value1>Value18 and Value1>Value19 and 

Value1>Value20 and Value1>Value21 and Value1>Value22 and Value1>Value23 and Value1>Value24 and Value1>Value25 and 

Value1>Value26 and Value1>Value27 and Value1>Value28 and Value1>Value29 and Value1>Value30 then

Value31=Value1; 

 

//Month

Value41= GetField("最高價","M");

Value42= GetField("最高價","M")[1];

Value43= GetField("最高價","M")[2];

Value44= GetField("最高價","M")[3];

Value45= GetField("最高價","M")[4];

Value46= GetField("最高價","M")[5];

Value47= GetField("最高價","M")[6];

Value48= GetField("最高價","M")[7];

Value49= GetField("最高價","M")[8];

Value50= GetField("最高價","M")[9];

Value51= GetField("最高價","M")[10];

Value52= GetField("最高價","M")[11];

 

If Value41>Value42 and Value41>Value43 and Value41>Value44 and Value41>Value45 and Value41>Value46 and Value41>Value47 and 

Value41>Value48 and Value41>Value49 and Value41>Value50 and Value41>Value51 and Value41>Value52 then

Value32=Value41;

 

If Value32>Value31 then Ret=1;

 

 

outputField (1,Value1,2,"This Year");

outputField (2,Value2,2,"This Year-1");

outputField (3,Value3,2,"This Year-2");

outputField (4,Value4,2,"This Year-3");

outputField (5,Value5,2,"This Year-4");

outputField (6,Value31,2,"Highest Year");

outputField (7,Value32,2,"Highest Month");

 

 

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

setBarFreq("Y");

SettotalBar(30);

condition1= GetField("最高價","Y")>highest(GetField("最高價","Y")[1],29);

if condition1 then Ret=1;

outputField (1,GetField("最高價","Y"),2,"This Year");

outputField (2,GetField("最高價","Y")[3],2,"This Year-3");

桑尼 發文於   2024/10/13

感謝教授,但您這支程式有個問題。

新公司就不會顯示。

另一種說法是把年改成40年,就沒有符合的標的。

顯見XQ內的資料庫有些問題。

因為我之前也是這麼寫,測試有問題。

所以才改為一年年的列出,不料XS連判斷價高低都會出錯……

虎科大許教授 發文於   2024/10/14

請舉例說明哪幾家新公司沒被選出。

桑尼 發文於   2024/10/14

 首先,

按您的程式跑SettotalBar(30);、(GetField("最高價","Y")[1],29)

跑出了33檔股票。

若改為SettotalBar(40);、(GetField("最高價","Y")[1],39)

則沒半檔股票被選出來。

這樣不正確吧?

另外比較年輕(2008)的公司"3653健策",今天創新高股票,並沒有跑出來。

所以這樣的寫法是失效的。

 

另外針對我的寫法,XS不應該判斷錯誤,為什麼會有錯誤的輸出,這也是很有問題的。

 

虎科大許教授 發文於   2024/10/14

XQ的資料並沒有問題,是使用不對的資料筆數。

由於掛牌至今最長的股票是37年,我們準備40年的資料。

setBarFreq("Y");

var:Nr1(0),Nr2(0);

SettotalBar(40);

value1=GetField("公司掛牌日期");

value2=getBarOffset(value1);

extremes(GetField("最高價","Y")[1],value2,1,Nr1,Nr2);

condition1= GetField("最高價","Y")>Nr1;

if condition1 then ret=1;

outputField1(value1,"公司掛牌日期");

outputField2(value2,"掛牌至今年份");

或是

setBarFreq("Y");

SettotalBar(40);

value1=GetField("公司掛牌日期");

value2=getBarOffset(value1);

condition1= GetField("最高價","Y")>highest(GetField("最高價","Y")[1],value2);

if condition1 then ret=1;

outputField1(value1,"公司掛牌日期");

outputField2(value2,"掛牌至今年份");

桑尼 發文於   2024/10/14

感謝教授解惑,原來根本的原因是因為公司設立時間的問題。

我的邏輯是在公司未成立前應該最高價為0,所以覺得我的程式應該是可用的。

沒想到在XQ的資料庫中,還未成立的公司最高價不為0。所以我的程式就沒按我想的跑了。

已經試了教授兩支程式,皆可以跑出相同的結果。感謝指導!

XS小編 發文於   2024/10/22

Hello 桑尼,

 

小編補充,在選股中可以使用 GetFieldStartOffset 來取得對應頻率欄位的長度資料。

另外相關人員在規劃讓 GetField 函數可以設定預設值,避免取到空值錯誤的狀況。

 

感謝 虎科大許教授 的熱心回覆。

發表回覆
Close