商品清單功能

2025-06-09 18:41:52
目前 XS 語法可透過 GetSymbolField 取得不同商品的資料欄位,但在指定商品的狀況下僅能透過 Input 參數或直接輸入商品代號字串,當需要處理大量商品時,腳本撰寫會變得相對複雜 。 此次更新新增了商品清單功能,使用者可在 Input 參數中設定所需的商品清單,或透過新建立的 Group 語法獲取指定商品的成分股、期貨或可轉債等商品清單,並搭配 GetSymbolField 快速取得所需資訊。  

語法說明

透過 Input 宣告清單

Input: myGroup(Group);
Var: _TF(False);

Value1 = GetSymbolField(myGroup[1], "Close", "D");
_TF = GetSymbolInfo(myGroup[1], "可放空");
  上述範例使用 Input 語法宣告了一個清單 myGroup ,允許在指標或策略中設定所需的商品清單 。 myGroup 是一個陣列,存放清單中的商品代號,並可透過 [N] 來取得陣列中第 N 個商品代號 。 GetSymbolFieldGetSymbolInfo 在這次修改中增加支援 Group 清單的功能 ( 需注意還是無法使用變數指定商品代碼 ) 。 從 Input 宣告的 Group 有四種方法可以設定清單 :
    • 商品: 使用者自行輸入所需商品
    • 組合: 使用者選擇所需的組合 ( 包含自選股 )
    • 選股: 使用者選擇一個選股中心策略 ( 選股中心策略不能選擇其他選股中心的策略 )
    • 檔案: 使用者選擇一個外部傳入的檔案 ( 支援 .txt.csv
以上四種設定方式與目前策略雷達和自動交易中心中設定執行商品的方式相同 。

透過 Group 宣告清單

Group: myGroup();
Var: _TF(False);

myGroup = GetSymbolGroup("TSE23.TW", "成分股");

Value1 = GetSymbolField(myGroup[1], "Close", "D");
_TF = GetSymbolInfo(myGroup[1], "可放空");
  上述範例使用 Group 語法宣告了一個清單 myGroup ,接著再透過 GetSymbolGroup 來取得指定商品的成分股 。 GetSymbolGroup 可用來取得系統內建的商品清單 。
    • 第一個參數指定要取得清單的商品,例如範例中的 TSE23.TW 。 若未指定商品,則預設取得目前執行商品的清單 ( 前提是該清單存在 ) 。
    • 第二個參數指定所需的清單類型,例如範例中的 成分股 ,此參數為必填 。
以下為支援的清單類型 :
清單類型 支援商品 說明
成分股 指數商品、細產業商品 回傳指數 / 細產業指數的成分股清單。 支援台灣市場。 指數的範圍為交易所公佈的類股指數,以及XQ所編制的細產業指數 (包含族群),例如TSE11.TW。 不包含TSE.TW、OTC.TW這種全市場的指數。
權證 股票 回傳此商品的所有權證商品。 支援台股。
股期 指數 / 股票 回傳此商品的所有期貨。 支援台灣市場。
可轉債 股票 回傳此商品的所有可轉債商品。 支援台股。
選擇權 指數 / 股票 回傳此商品的所有選擇權。 支援台灣市場。
(註: 在走勢圖 / 技術線圖上的商品名稱點擊右鍵,可確認該商品支援的相關清單類型 )

指標腳本的清單選單

Input:cb_id("", inputKind:=SymbolGroup("CB"), quickedit:=true);
value1 = GetSymbolField(cb_id, "Close");
value2 = GetSymbolField(cb_id, "Volume");
plot1(value1, "CB走勢");
plot2(value2, "CB成交量");
  在指標腳本中,若希望使用者能在介面上直接選擇所需的清單商品,可以在 Input 宣告時一併傳入清單類型 。 這樣一來,在技術分析頁面中,使用者即可透過選單快速切換執行商品對應的清單類型 。 例如上述範例中,若執行商品對應到多個可轉債,使用者便能透過選單切換,輕鬆繪製可轉債的價格與成交量 。  

搭配清單使用的函數

Value1 = GroupSize(myGroup);
  GroupSize 會回傳商品清單包含的數量 。 可以此數值避免取用到超出陣列範圍的資料而導致錯誤 。

使用範例

盤中漲幅排行 [警示腳本]

input: _S(group, "排行股票");
Array: rankRT[2000, 2](-9999);

SetTotalBar(10);
value1 = GroupSize(_S);

//將清單的 商品代碼 以及 漲跌幅 的數值放入陣列中

for value2 = 1 to value1 begin
value3 = 100 * (getsymbolField(_S[value2], "Close", default = 0)
- getsymbolField(_S[value2], "參考價", "D", default = 0))
/ getsymbolField(_S[value2], "參考價", "D", default = 1);
rankRT[value2, 1] = strtonum(leftStr(_S[value2], 4));
rankRT[value2, 2] = value3;
end;

//將陣列依據漲跌幅排序後印出
Array_Sort2d(rankRT, 1, value1, 2, false);
print("==========漲跌幅前10==========");
print("日期時間:", numtostr(datetime, 0));
for value2 = 1 to 10 begin
print(text("排名", numtostr(value2, 0), "商品: "),
text(numtostr(rankRT[value2, 1], 0), ".TW"),
" / 漲跌幅: ", rankRT[value2, 2]);
end;

print("==============================");
if symbol = text(numtostr(rankRT[1, 1], 0), ".TW") then ret = 1;
  上述腳本中宣告了一個清單 ( 設定為需要盤中即時排序的商品 ) 和陣列,並將清單內的商品代號和漲跌幅存入陣列後進行排序 。

指數成分股的營收加總 [指標腳本]

group: _symbolGroup();
var: _sum(0), _num(0);

_symbolGroup = GetSymbolGroup("成分股");
value1 = GroupSize(_symbolGroup);

_sum = 0;
_num = 0;
for value2 = 1 to value1 begin
if CheckSymbolField(_symbolGroup[value2], "月營收", "M") then begin
_sum += GetSymbolField(_symbolGroup[value2], "月營收", "M");
_num += 1;
end;
end;

plot1(_sum);
SetPlotLabel(1, "成分股月營收");
plot2(_num);
SetPlotLabel(2, "有月營收家數");
plot3(value1);
SetPlotLabel(3, "成分股家數");
  使用者可將執行商品設為指數商品 ( 如 TSE23.TW ) ,並透過 _symbolGroup 取得該指數對應的成分股清單 。 接著使用 CheckSymbolField 判斷指定成分股的月營收欄位是否存在,加總月營收和計算有資料的成分股數量,最後將其畫出 。

對應選擇權的成交金額加總 [指標腳本]

group: _list();
var: _uSum(0), _dSum(0), _count(0), _cp("");

_list = getsymbolgroup("選擇權");

_uSum = 0; //買權加總
_dSum = 0; //賣權加總
_count = 0;
for value1 = 1 to groupSize(_list) begin
if getsymbolField(_list[value1], "Date", "Tick", default:= 0) = getfield("Date", default:= -999999) then begin
_cp = getsymbolinfo(_list[value1], "買賣權");
if _cp = "CALL" then _uSum += getsymbolField(_list[value1], "Close", "Tick", default:=0) * getsymbolField(_list[value1], "Volume", "Tick", default:=0) * 2000;
if _cp = "PUT" then _dSum += getsymbolField(_list[value1], "Close", "Tick", default:=0) * getsymbolField(_list[value1], "Volume", "Tick", default:=0) * 2000;
end;
end;

plot1(_uSum, "近一筆買權權利金加總金額");
plot2(_dSum, "近一筆賣權權利金加總金額");
  這個腳本會加總執行商品該日最近一筆買進權利金的交易金額 ( 買權賣權分開加總 ) ,並將這些總額繪製出來 。 透過觀察這個總額的變化,可以推測市場對該執行商品價格漲跌的看法,就像「以權追股」的功能一樣 。 如果想要根據成交量判斷是否有大額交易,或者只加總最近一段時間的成交金額,可以在腳本中的 For 迴圈部分進行修改 。