群益API 觸價單 V1 版的 7 個欄位與專屬編碼示意圖

群益API 觸價單(MIT)一直被退?V1 版的 7 個欄位與專屬編碼

下面這幾個訊息,是我們實際送群益API 觸價單時收到的退單:

  • not nearby month commodity
  • [999] 委託價(限價)不可為0
  • TriggerDirection should be 1 or 2
  • OrderPriceType should be 2 or 3
  • Trade type value should be 0,3,4
  • SettlementYM is empty
  • 元件端回 1067

如果你是拿其中一個訊息搜進來的,這幾個訊息在我們的情況裡,對應的都是同一件事:欄位照著一般委託的習慣填了。 觸價單用的是另一套欄位規則。

群益API 觸價單 V1 版的 7 個欄位與專屬編碼示意圖

群益API 觸價單有兩個版本:要指定月份就用 V1

官方有兩個期貨觸價單(MIT)函式:

函式官方說明
SendFutureMITOrder[限近月商品代碼]送出期貨MIT委託。
SendFutureMITOrderV1(指定月份需填商品契約年月)新版—送出期貨MIT委託。

官方函式總表裡,舊版的限制欄寫的是「僅可委託近月」。所以要指定月份,就要用 V1。 我們用舊版送指定月份的代碼時,收到的就是 not nearby month commodity。

兩個函式的官方參數說明都有這一句:

(此類型委託中的觸發價與成交價、觸價方向為必要欄位,請務必填入)

V1 用的也是 FUTUREORDER 結構,但用的是「期貨、選擇權智慧單MIT」那一個小節。〈群益API 下單價格為什麼是字串〉講過:同一個結構名稱底下,不同小節的欄位規則不一樣。照一般委託的習慣去填,好幾個欄位都會被退。

群益API 觸價單的 7 個欄位,逐一對照官方

以下是官方「期貨、選擇權智慧單MIT」小節的欄位註解,對照我們實際收到的退單。

① 時效 sTradeType:0 ROD、3 IOC、4 FOK

官方註解:「0:ROD 3:IOC 4:FOK」。一般期選委託是 1 IOC、2 FOK——照一般委託填 1,會被退。我們收到的訊息是 Trade type value should be 0,3,4。

② 觸發價 bstrTrigger

官方註解:「觸發價。//{ MIT下單使用:不可0、不可給特殊價代碼}」。錯誤代碼表另有 1054(SK_ERROR_MIT_ORDER_MUST_GIVE_TRIGGER_PRICE)「MIT委託內容需含觸發價」。

③ 成交價 bstrDealPrice(觸發後送出的委託價)

官方註解:「成交價 {限MIT下單使用:不可0、不可給特殊價代碼}」。錯誤代碼表另有 1056(SK_ERROR_STRATEGY_ORDER_MUST_GIVE_DEAL_PRICE)「智慧單委託內容需含成交價」。

所以成交價不能填 M。我們填 M 時,元件回的是 1067——它的官方說明是「(逐筆交易)委託價格類型有誤」,而它跟 MIT 的對應,是我們實測到的,不是官方的定義。

④ 委託價 bstrPrice

官方註解:「委託價格(指定限價時,需填此欄)」。搭配下一個欄位選「限價」時,bstrPrice 要填。我們留空時收到的是 [999] 委託價(限價)不可為0。

我們的做法是把 bstrPrice 與 bstrDealPrice 填同一個價格;官方的規則只寫到「指定限價時,需填此欄」。

⑤ 委託價類別 nOrderPriceType:2 限價、3 範圍市價

官方註解:「委託價類別 2: 限價; 3:範圍市價」。沒有「市價」這個選項,不填會被退:我們收到的是 OrderPriceType should be 2 or 3。

範圍市價在這裡用 nOrderPriceType 的 3 表示,不是在價格欄填特殊代碼——觸發價與成交價的官方註解,都寫著「不可給特殊價代碼」。

⑥ 觸發方向 nTriggerDirection:1 GTE、2 LTE

官方註解:「觸發方向1:GTE(大於), 2:LTE(小於)」。不填會被退:我們收到的是 TriggerDirection should be 1 or 2。

官方參數說明也把觸價方向列為必要欄位。觸發方向要明確填,官方不替你推。

⑦ 商品年月 bstrSettlementMonth(指定月份時)

官方註解:「委託商品年月,YYYYMM共6碼(EX: 202206)」「若 bstrStockNo指定月份,需填商品契約年月」。用指定月份的代碼卻沒填,會被退:我們收到的是 SettlementYM is empty。

代碼什麼時候要填商品年月?

官方只寫「若 bstrStockNo指定月份,需填商品契約年月」。

我們的做法是把代碼分成三種形態來處理:

  • 近月代碼:不用填年月。
  • 帶年月的代碼:年月照填。
  • 只帶月份的代碼:要自己推出年份再填。

怎麼推出年份是我們的做法,每個程式的需求不同,這裡不給規則。

送出回 0,就代表觸價單生效了嗎?

不代表。V1 同步委託回 0 時,官方說明 bstrMessage 的內容包含委託日期、智慧單序號、委託書號等資料,以實際回傳內容為主。

但〈群益API 下單回傳值是 0 就成功了嗎〉講過的原則同樣適用:回 0 只是收單。 觸價單什麼時候觸發、觸發後有沒有成交,要看智慧單的回報與狀態,見〈群益API 智慧單回報去哪裡看〉。

欄位都填對了,還是送不出去?

如果欄位都依官方規則填了,仍然送不出去,還有一件事要知道:智慧單有帳戶側的前置條件,那不是程式端能解決的。

如果有遇到這類的問題可以先跟您的營業員反應。

群益API 觸價單的 7 條原則+程式碼

  1. 要指定月份,用 SendFutureMITOrderV1;舊版官方標「限近月商品代碼」。
  2. 時效用智慧單的編碼:0 ROD、3 IOC、4 FOK,不是一般委託的 1、2。
  3. 觸發價、成交價都要填數字,不可 0、不可特殊價代碼(成交價不能填 M)。
  4. nOrderPriceType 填 2(限價)或 3(範圍市價);填限價時,bstrPrice 也要填。
  5. nTriggerDirection 明確填 1(GTE)或 2(LTE)。
  6. 代碼指定月份時,填 bstrSettlementMonth(YYYYMM)。
  7. 回 0 只是收單,觸發與成交看智慧單回報。
// V1 觸價單:用的是 FUTUREORDER「期貨、選擇權智慧單MIT」小節的規則,跟一般委託不同
FUTUREORDER pOrder = new FUTUREORDER();
pOrder.bstrFullAccount     = "YOUR_ACCOUNT";
pOrder.bstrStockNo         = "YOUR_FUTURE_CODE";   // 指定月份的代碼
pOrder.bstrSettlementMonth = "YYYYMM";             // 指定月份時必填,6 碼
pOrder.sBuySell            = 0;                    // 0 買進 1 賣出
pOrder.sNewClose           = 0;                    // 0 新倉 1 平倉 2 自動
pOrder.nQty                = 1;
pOrder.bstrTrigger         = "TRIGGER_PRICE";      // 觸發價:不可 0、不可特殊價代碼
pOrder.bstrDealPrice       = "DEAL_PRICE";         // 觸發後的委託價:不可 0、不可特殊價代碼(不能填 M)
pOrder.nOrderPriceType     = 2;                    // 2 限價 3 範圍市價(沒有市價)
pOrder.bstrPrice           = "DEAL_PRICE";         // 限價時必填;我們的做法是跟 bstrDealPrice 填同一個價格
pOrder.nTriggerDirection   = 1;                    // 1 GTE(大於) 2 LTE(小於),要明確填
pOrder.sTradeType          = 3;                    // 智慧單編碼:0 ROD 3 IOC 4 FOK(不是一般委託的 1 IOC)

string bstrMessage;
int nCode = m_pSKOrder.SendFutureMITOrderV1("YOUR_LOGIN_ID", false, ref pOrder, out bstrMessage);
// 回 0 只是收單,觸發與成交看智慧單回報

帳號、代碼、價格一律是佔位符;sTradeType = 3 只是示意,時效選哪一種由你決定。其餘欄位照官方結構「期貨、選擇權智慧單MIT」小節的說明。參數傳遞方式同〈群益API 下單回傳值是 0 就成功了嗎〉:ref pOrder、out bstrMessage。

常見問題

群益API 觸價單回 not nearby month commodity 是什麼意思?

我們用舊版 SendFutureMITOrder 送指定月份的代碼時收到這個訊息。官方標明舊版「限近月商品代碼」,要指定月份得用 SendFutureMITOrderV1,並填商品年月。

觸價單的 IOC 為什麼不是 1?

觸價單用的是 FUTUREORDER 的「期貨、選擇權智慧單MIT」小節,官方註解是「0:ROD 3:IOC 4:FOK」。一般期選委託的 1 IOC、2 FOK 不適用。

觸價單的成交價可以填 M 嗎?

不行。官方註解寫明成交價「不可0、不可給特殊價代碼」。我們填 M 時元件回 1067。委託價類別也只有 2 限價、3 範圍市價,沒有市價。

群益API 觸價單回 0,是不是已經送進市場了?

回 0 只代表收單。觸價單要等價格觸發才會送出委託,觸發與成交要看智慧單的回報與狀態。

風險揭露

期貨與選擇權屬高槓桿商品,價格波動可能造成超過原始保證金的損失,交易人須自負交易責任。本文為程式開發技術教學,說明觸價單的欄位規則,不構成投資建議,也不保證任何交易結果。觸價單在觸發後才送出委託,觸發時的成交價格可能與預期不同;程式化交易並不降低市場風險,欄位填錯可能讓委託被退或送出非預期的委託。

投資人教育資源

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

延伸閱讀

參考資料

  • SendFutureMITOrder、SendFutureMITOrderV1 的說明與參數、FUTUREORDER「期貨、選擇權智慧單MIT」小節的欄位註解、函式總表,依群益官方元件說明文件 V2.13.59 主手冊;錯誤碼 1054/1056/1067 依官方錯誤代碼表。
  • 退單訊息字串、1067 與 MIT 的對應、兩個價格欄填同價、代碼形態的處理:實單經驗,非官方文件記載。

免責聲明

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

延伸閱讀|相關文章

發佈留言

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