總持股人數欄位有問題?

  •   50 
  • 最後發表   JasonK  2024 三月 01
JasonK 發文於   2024/02/26

我這邊對 XS 執行流程感覺有點問題,麻煩小編在幫忙說明

首先我想抓出這 3 周的總持股人數,我的程式這樣寫,以聯發科做例子

setbarFreq("W");
settotalBar(3);
var: i(0);

Print(CurrentBar);
value1 = GetField("總持股人數", "W");
for i = 0 to 2
begin
    Print("總持股人數 ", i, " = ", value1[i]);
end;
ret=1;

輸出結果如下

1.000000 
總持股人數  0.000000  =  196515.000000 
總持股人數  1.000000  =  0.000000 
總持股人數  2.000000  =  0.000000 
2.000000 
總持股人數  0.000000  =  196515.000000 
總持股人數  1.000000  =  196515.000000 
總持股人數  2.000000  =  0.000000 
3.000000 
總持股人數  0.000000  =  182240.000000 
總持股人數  1.000000  =  196515.000000 
總持股人數  2.000000  =  196515.000000 

 

根據輸出結果

第 1 個問題是,當我設定 settotalBar = 3 ,是否就表示同一檔股票會跑 3 次? (因為要抓 3 次 Bar )?

如果第 1 個答案是"是"

那我想要優化程式,改成跑第 3 次的時候才 Print,所以我的程式修改如下

setbarFreq("W");
settotalBar(3);
var: i(0);

Print(CurrentBar);
if CurrentBar = 3 then   // 第 3 次才顯示
begin
    value1 = GetField("總持股人數", "W");
    for i = 0 to 2
    begin
        Print("總持股人數 ", i, " = ", value1[i]);
    end;
end;

但為什麼這樣寫總持股人數反而有錯誤,輸出如下

1.000000 
2.000000 
3.000000 
總持股人數  0.000000  =  182240.000000 
總持股人數  1.000000  =  0.000000 
總持股人數  2.000000  =  0.000000 

這和一般程式邏輯怎麼不一樣? 

麻煩小編幫忙解釋一下

 

 

排序方式: 標準 | 最新
XS小編 發文於   2024/03/01

Hello JasonK,

 

如果您問的是底層的作法的話,可以這樣理解:

腳本中只有用到 value1 => 只會有一個位置存放資料。

腳本中有用到 value1[n] => 每根Bar都會有個位置存放資料,會像是Array沒錯。

 

但需注意這跟XS中定義的Array是不同的東西,小編是以XS語法來回覆。

 

JasonK 發文於   2024/02/29

所以你們預設的 value1 在電腦記憶體中是怎麼放?  

因為就你的說法,value1 不是 array,等於每次執行運算時都會產生 1 個 value1 來存"當前"的總持股人數

那既然又可以找到之前的 value1 代表你們是用 linked-list 來存嗎?

// Linked-List (記憶體位置不連續,用指標紀錄前一次的值)
value1 : 182,240 -> 193,096 -> 196,515

所以只要每次一執行 value1 = GetField("總持股人數", "W");

就會 new 一個新的 value1 物件並插入到 Linked-List 中,是這樣嗎?

XS小編 發文於   2024/02/29

Hello JasonK,

 

value1 = GetField("總持股人數", "W");

這行是代表在腳本 "此次" 運算的時候,將總持股人數的數值存入value1,跟前期不會有關係。

value1[i] 則代表向前i根Bar的value1數值,是一個依據K棒順序的時間序列,並不是array。

 

如果腳本每次運算時都有執行到該行的話,那麼取value1[i]的時候可以抓的到向前i根Bar的GetField("總持股人數", "W")數值。

相反的,假設前根 Bar 沒有執行到 value1 = GetField("總持股人數", "W") 的話,value1[1] 就會等於 value1[2] 的數值,因為value1沒有被改變。

JasonK 發文於   2024/02/28

Hi 小編你好

所以我是否可以理解成

value1 = GetField("總持股人數", "W");

其實意義上就是

value1[i] = GetField("總持股人數", "W")[i];

所以執行同一檔股票 3 次等於 ( XQ 會自動將 value1 視為 array 並自動 index +1 )?

CurrentBar =1 
value1[0] = GetField("總持股人數", "W")[0];

CurrentBar =2
value1[1] = GetField("總持股人數", "W")[1];

CurrentBar =3
value1[2] = GetField("總持股人數", "W")[2];

 

因為我原本認知以為 value1 = GetField("總持股人數", "W") 

就是會一次把 3 周的數據直接 assign 給 value,所以只要執行 1 次就好

 

以上我的理解正確嗎?

 

XS小編 發文於   2024/02/27

Hello JasonK,

 

關於 settotalbar 的說明可以參考 資料讀取範圍與腳本執行的關係 此篇文章。

簡單來說,settotalbar(3); 會讓選股腳本運算近3根Bar。

 

下面的腳本中 value1 = GetField("總持股人數", "W"); 被放入了 currentbar = 3 的條件內,故該行程式只會在運算第三根Bar時執行。

故這三根Bar的value1運算會是:

第1根Bar => value1沒有改變維持初始值,value1 = 0

第2根Bar => value1沒有改變維持初始值,value1 = 0

第3根Bar => CurrentBar = 3 條近符合,value1 = GetField("總持股人數", "W")

只有到第3根Bar時value1才會等於該根Bar對應的總持股人數。

 

您想要的應該是將 value1 = GetField("總持股人數", "W"); 移出 if CurrentBar = 3,讓其在前兩次中也可以執行。

或是將印出的資訊改為 Print("總持股人數 ", i, " = ", GetField("總持股人數", "W")[i]);

發表回覆
Close