群益API 商品代碼怎麼填:TX09、TX00 與交易所代碼 TXFI6 的差別

群益API 商品代碼怎麼填?TX09、TX00 與交易所代碼 TXFI6 的差別

用期交所網站上看到的代碼 TXFI6 訂報價,什麼都收不到,也沒有錯誤碼。用它下單,會被退單。程式裡寫死 TX09,換月之後報價就停了,下單也失敗。

群益API 商品代碼的關鍵只有一句:商品清單裡每個商品有兩個代碼,群益API 只用第一個。

〈群益API Python 入門〉提過,訂閱用的是 TX00 這類商品代碼,不是交易所的合約代碼。本文把這件事講完整。

群益API 商品代碼示意圖:商品清單裡的商品代碼與交易所代碼,API 只用商品代碼

群益API 的商品代碼和交易所代碼差在哪?

依官方說明,商品清單的每一筆資料,欄位依序是:商品代碼、商品名稱、最後交易日、交易所商品代碼、跳動點、幣別。

其中有兩個代碼,用途不同:

欄位例用途
第 1 欄:商品代碼TX09報價訂閱、查商品資料、下單都用這個
第 4 欄:交易所商品代碼TXFI6交易所的代碼,只用來對照

我們實測過:用交易所代碼 TXFI6 訂報價收不到資料,查商品資料回 9999,下單會被主機退單;改用商品代碼 TX09,報價和查商品資料就正常。退單時的訊息怎麼讀,見〈群益API 下單回傳 980 怎麼讀〉。9999 的判讀見〈群益API 登入錯誤怎麼判讀〉。

用錯代碼訂報價,為什麼連錯誤碼都沒有?官方在 SKQuoteLib_RequestStocks 的說明是:「如果帶入的股票代號不存在,則會直接略過不處理,也不會回傳錯誤。」交易所代碼不是 API 用的商品代碼;依官方說明,不存在的代碼會被直接略過,結果就是什麼都收不到。 這個行為的影響,見〈群益API 訂閱額度有多少〉。

TX03、TX00、TX00AM 各是什麼?

商品代碼意思用途
TX03具體月份(3 月)的台指期報價、下單
TX00近月報價追近月
TX00AM近月的純日盤行情只能看報價,不能下單

具體月份:官方的下單範例用的是 TX03 這種寫法。商品代碼只有月份,沒有年份。 官方在一般期選委託的說明裡寫:「bstrStockNo帶入TX03 (注意:如果想委託今年TX03但已過期,則會自動委託隔年TX03。)」

近月:TX00 代表近月,官方的錯誤代碼表與智慧單委託的說明都以 TX00 作為近月商品代碼的例子。

純日盤行情:官方說明是「例:TX00的純AM盤行情為TX00AM」,同時提醒「需注意委託商品時加上AM是無法下單的,委託請使用原始商品代號」。

另外,官方還有一種下單寫法,是用商品代號加上年月來指定合約,細節屬於下單的主題,本文不展開。

群益API 商品清單怎麼查?

查商品清單用 SKQuoteLib_RequestStockList:

Long SKQuoteLib_RequestStockList([in] SHORT sMarketNo);

官方說明是「根據市場別編號,取得國內各市場代碼所包含的商品基本資料相關資訊。」市場編號裡,期貨是 2、選擇權是 3。

幾件要注意的事:

  • 先等 3003:官方說明「*請先SKQuoteLib_EnterMonitorLONG,須等OnConnection收到SK_SUBJECT_CONNECTION_STOCKS_READY後,再進行商品檔查詢。」3003 的意義見〈群益API 連線狀態碼怎麼解讀〉。
  • 放在 OnConnection 事件之外呼叫:官方提醒不要在 OnConnection 裡直接進行連線、訂閱類的呼叫;查商品清單時,我們也比照辦理。
  • 結果從 OnNotifyStockList 事件回來:每筆資料之間以分號分隔(官方範例資料用的是半形 ;),欄位之間以逗號分隔。官方說明「當全部資料已經全部回傳完畢,將回傳一筆以「##」開頭的內容,表示查詢結束。」
  • 另一個商品清單事件:本文只掛 OnNotifyStockList,只掛一個就不會有資料重複的問題。兩個商品清單事件都掛的情況,見〈群益API 版本升級要注意什麼〉。

為什麼不要把 TX09 寫死在程式裡?

具體月份的商品代碼只對應那個月份的合約,換月之後就不是你要的合約了。

做法是:程式啟動後,等到收到 3003,再抓一次期貨商品清單,用「商品名稱」或「最後交易日」找到你要的合約,再拿它的商品代碼去訂閱與下單。哪個月份最近到期,看「最後交易日」那一欄就知道。

只是要追近月的報價,也可以直接訂 TX00。

交易所代碼裡的月份字母怎麼看?

交易所代碼最後兩碼是月份字母加年份。對照商品清單的實際資料:

商品代碼交易所代碼
TX09TXFI6
TX10TXFJ6
TX11TXFK6
TX12TXFL6
TX03TXFC7

I 是 9 月、J 是 10 月、K 是 11 月、L 是 12 月、C 是 3 月;依序推下來,A 是 1 月。年份只看最後一位數字,例如 6 是 2026、7 是 2027。這是我們對照得出的,不是官方的對照表。

不過,這套字母只用來看懂第 4 欄。群益API 用的是第 1 欄的商品代碼,不需要自己組出交易所代碼。

群益API 商品清單對照表程式碼

下面以期貨商品清單為例,在〈群益API Python 入門〉的範例基礎上,建立「交易所代碼 → 商品代碼」的對照:

# 群益API 期貨商品清單:建立商品代碼與交易所代碼的對照
# 前提:已登入、EnterMonitorLONG 後收到 3003
records = []
state = {"done": False}


class QuoteEvents:
    # ……OnConnection 等其他事件同入門範例……

    def OnNotifyStockList(self, sMarketNo, bstrStockData):
        bstrStockData = (bstrStockData or "").strip()
        if bstrStockData.startswith("##"):          # 官方:以「##」開頭表示查詢結束
            state["done"] = True
            return
        # 官方範例資料以半形「;」分筆;同時容許全形「;」與換行
        text = bstrStockData.replace(";", ";").replace("\n", ";")
        for row in text.split(";"):
            fields = [f.strip() for f in row.split(",")]
            if len(fields) >= 4 and fields[0]:
                records.append({"code": fields[0], "name": fields[1],
                                "last_trade_date": fields[2], "exchange_code": fields[3]})


# 在事件之外呼叫(不要寫在 OnConnection 裡)
code = quote.SKQuoteLib_RequestStockList(2)        # 2 = 期貨
print("RequestStockList", code, center.SKCenterLib_GetReturnCodeMessage(code))
pump_until(lambda: state["done"], 20)              # pump_until 見入門範例

by_exchange = {r["exchange_code"]: r["code"] for r in records}
print(by_exchange.get("TXFI6"))                    # 例:查出對應的商品代碼

幾點說明:

  • 這段只用於期貨(2)與選擇權(3)市場的清單,第 4 欄是交易所代碼。其他市場的欄位,請以實際收到的資料為準。
  • RequestStockList 依宣告只有輸入參數,所以回傳的是單一回傳碼。
  • 最後一行的 TXFI6 只是示意:商品清單會隨月份變動,執行當下不一定有這個代碼。
  • 欄位用 strip() 去掉前後空白;20 秒與分隔的處理方式都是示意。

群益API 商品代碼的 4 個誤解

  1. 誤解: 期交所網站上的代碼(TXFI6)就是群益API 的商品代碼。其實: 群益API 用商品清單第 1 欄的商品代碼(TX09);TXFI6 是第 4 欄的交易所代碼,只用來對照。
  2. 誤解: 訂閱錯的代碼會報錯。其實: 官方說明不存在的代碼會直接略過、不回傳錯誤,所以只會什麼都收不到。
  3. 誤解: 把 TX09 寫死在程式裡就好。其實: 換月就失效;啟動時抓一次商品清單,或追近月用 TX00。
  4. 誤解: TX00AM 也可以拿來下單。其實: 官方說明加上 AM 無法下單,只給純日盤行情用。

常見問題

群益API 訂閱 TXFI6 為什麼收不到報價?

TXFI6 是交易所商品代碼,群益API 不收。改用商品清單第 1 欄的商品代碼,例如 TX09;不存在的代碼會被直接略過、不回傳錯誤,所以只會收不到資料。

TX00 和 TX09 差在哪?

TX00 代表近月,TX09 是具體的 9 月合約。追近月報價可以用 TX00;下單請用具體月份的商品代碼,官方範例是 TX03 這種寫法。

商品代碼沒有年份,怎麼知道是哪一年的合約?

依官方說明,如果今年的那個月份已經過期,會自動委託隔年的同月份。要確認到期日,看商品清單的「最後交易日」欄。

怎麼查到所有期貨商品的代碼?

等 OnConnection 收到 3003 之後,在事件之外呼叫 SKQuoteLib_RequestStockList(2),結果從 OnNotifyStockList 回來,收到以「##」開頭的資料代表查詢結束。

風險揭露

期貨與選擇權屬高槓桿商品,價格波動可能造成超過原始保證金的損失,交易人須自負交易責任。本文為程式開發技術教學,說明群益API 商品代碼的填法與商品清單的查詢方式,不構成投資建議,也不保證任何交易結果。程式化交易並不降低市場風險,商品代碼填錯可能讓委託被退或下到非預期的合約,正式使用前請充分測試。

投資人教育資源

機構資源
臺灣期貨交易所(TAIFEX)期貨及選擇權數位學習網
證券暨期貨市場發展基金會證券期貨市場教育推廣
金融智慧網金管會金融知識平台
中華民國期貨業商業同業公會期貨業法規與宣導
證券投資人及期貨交易人保護中心投資人保護與申訴

延伸閱讀

參考資料

  • 商品清單的欄位與分隔規則、SKQuoteLib_RequestStockList 的說明與市場編號、等 3003 才查詢、不存在代碼直接略過、TX03 過期自動委託隔年、TX00 為近月、TX00AM 只能看報價,依群益官方元件說明文件。
  • 交易所代碼收不到報價、查商品回 9999、下單被退:我們的實測,非官方文件記載。
  • 月份字母的對照:依商品清單實際資料推得,非官方對照表。

免責聲明

本文章僅作為群益API實作經驗分享,不構成投資建議,且策略及程式皆應自行撰寫。期貨及衍生性金融商品交易屬高風險投資,請謹慎評估自身風險承擔能力。

延伸閱讀|相關文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *