群益API 智慧單回報:主動回報與被動查詢兩條路的示意圖

群益API 智慧單回報去哪裡看?主動回報、被動查詢與狀態碼

觸價單送出,回傳 0,之後在一般的委託回報裡找不到它。它收單了沒?在等觸發嗎?還是已經觸發了?

群益API 智慧單回報的狀態,官方另外用兩條路提供:一條是主動回報,一條是被動查詢。 知道要去哪裡看,這些問題就有答案了。

群益API 智慧單回報:主動回報與被動查詢兩條路的示意圖

群益API 智慧單回報有哪兩條路?

路什麼時候來事件官方說明(節錄)
主動回報智慧單狀態改變時,元件主動送來OnStrategyData(SKReplyLib)當有智慧單回報將主動呼叫函式,並通知智慧單的狀態。
被動查詢呼叫 GetStopLossReport 之後OnStopLossReport(SKOrderLib)新版期貨智慧單(包含停損單、移動停損、二擇一、觸價單)被動回報查詢。

主動回報的期貨格式,官方在 OnStrategyData 的備註寫明:

自SKCOM V2.13.45(含)以上版本, 4-3-m OnStrategyData提供期貨MIT、STP、MST、二擇一OCO、AB新單回報格式

舊的 OnSmartData 則已經移除這部分,官方說明是(節錄):「自SKCOM V2.13.38 (含)以上版本起,移除OnSmartData期貨及選擇權智慧單(STP、 MIT、MST、OCO)回報相關格式.」

要說明的是,我們自己的實作只用過被動查詢那一條;主動回報 OnStrategyData 的期貨格式,我們沒有實作紀錄,這裡只照官方寫。

觸發之後,怎麼對回市場上的委託?

智慧單觸發之後,送出的那一筆市場委託,會出現在一般的市場回報裡。官方在 OnStopLossReport 的「序號」欄是這樣說明的:

(13碼)已觸發時,成交單含IOC、 FOK產生的取消單,可以以此欄比對市場上回報資料

所以用這個 13 碼序號,去一般委託回報裡對回那筆市場委託。 一般委託回報怎麼讀、怎麼對帳,見〈群益API 委託回報怎麼解析〉與〈群益API 委託回報怎麼對帳〉。

群益API 智慧單回報的狀態碼怎麼讀?

官方的智慧單委託狀態(OnStopLossReport 與 OnStrategyData 相同):

碼官方名稱
32中台收單成功
33中台收單失敗
34洗價中
35洗價中-觸發價更新(移動停損單)
36洗價失敗
37洗價觸發
38觸發下單
39下單失敗
40使用者刪單

狀態也可能是 999(萬用狀態),這時要看萬用訊息欄。官方在幾個地方都提到這一點,例如 OnStopLossReport 的 OCO 段有「萬用訊息」欄,說明「適用於智慧單狀態代碼為999情況」。

哪些狀態算「還在等觸發」,官方只給了每個碼的名稱,沒有分組;怎麼分,由你依自己的需求決定。

策略別與市場委託狀態

策略別(OnStopLossReport)的官方值是「3:OCO二擇一 5:STP停損單 8:MIT觸價單 9:MST移動停損」,AB 段另有「10:AB單」。

市場委託狀態,指的是觸發之後送進市場那一筆委託的狀態,官方值是:

空白:無委託單 0:預約 2:全部成交 3:全部取消 4:部分成交,剩餘已取消 5:部分成交,剩餘可取消 6:委託失敗 7:委託成功 8:取消失敗

另有「F:【交易所動態退單相關代碼】」。空白代表還沒有送進市場的委託——這是判斷「觸發了沒」的另一個欄位。

被動查詢要怎麼收?表頭、資料列與「##」

GetStopLossReport 用 bstrKind 指定查哪一種智慧單(STP、MST、OCO、MIT、AB),bstrDate 是查詢日期。結果由 OnStopLossReport 一列一列送回來,格式是:

第一列是表頭。 官方說明:

如果回傳的第一筆資料是一位英文M接連著三碼數字及停損單總數,其中 “M000” 開頭,表示為成功回傳,其後提供欲查詢之停損單總數。

之後每一列是一筆智慧單,用逗號分隔。官方另外註明「訊息中逗號皆為全形”,”」——所以用半形逗號切欄位時,訊息欄不會被切壞。

最後一列是「##」。 官方備註:

當全部資料已經全部回傳完畢,將回傳一筆以「##」開頭的內容,表示查詢結束。

表頭不是 M000 時,要立刻收尾

官方只寫了 M000 這一種表頭。 我們遇過不是 M000 的表頭:當時的程式沒有處理,查詢就一直等到逾時,逾時後又重查,變成每隔一段時間就重查一次的迴圈。

所以通用的做法是:表頭不是 M000,就立刻結束這一次查詢,不要等逾時。筆數是 0 時也直接收尾;而收尾的動作要能重複呼叫而不出錯,因為官方沒有寫,這種情況下是否還會再送「##」。

這跟〈群益API 未平倉查詢怎麼選〉講的「##」與查詢狀態,是同一類的收尾邏輯。

刪智慧單要帶哪些編號?

期貨智慧單刪單用 CancelTFStrategyOrderV1,帶 CANCELSTRATEGYORDER 結構。官方欄位(節錄):

欄位官方說明
bstrSmartKey智慧單號
nTradeKind3:OCO、5:STP、8:MIT、9:MST、10:AB
bstrSeqNo委託序號(預約單可忽略)
bstrOrderNo委託書號(若欲刪除之委託已產生書號則需填入;預約單可忽略)

官方還特別註記:

*請留意,未填書號將影響解除保證金等風控

也就是說:還沒觸發時用智慧單號刪;已經觸發、市場上已經有委託書號時,書號也要帶。

送智慧單回 2010 怎麼辦?

送智慧單回 2010,屬帳戶側的前置條件,不是程式端能解決的。

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

群益API 智慧單回報的 7 條原則+程式碼

  1. 智慧單的狀態另有兩條路:主動回報看 OnStrategyData,要查詢時呼叫 GetStopLossReport、看 OnStopLossReport。
  2. 觸發之後,用智慧單的 13 碼序號去一般回報對回市場委託。
  3. 狀態碼照官方表解讀;哪些算「還在等」由自己分;狀態是 999 時看萬用訊息欄。
  4. 市場委託狀態是空白,代表還沒送進市場。
  5. 被動查詢:第一列是表頭,不是 M000 就立刻收尾;以「##」判斷查完;訊息欄的逗號是全形。
  6. 刪智慧單帶智慧單號與單別;已觸發的,書號也要帶。
  7. 回 2010 是帳戶側的前置條件。
bool _querying = false;
bool _expectHeader = true;
List<string> _rows = new List<string>();

void QueryMIT()
{
    _querying = true;
    _expectHeader = true;                                              // 每次查詢前重設:第一列一定是表頭
    _rows.Clear();
    int nCode = m_pSKOrder.GetStopLossReport("YOUR_LOGIN_ID", "YOUR_ACCOUNT", 0, "MIT", "YYYYMMDD");
}

void OnStopLossReport(string bstrData)
{
    if (bstrData.StartsWith("##")) { FinishQuery(); return; }         // 官方:## 表示查詢結束
    if (_expectHeader)                                                 // 依位置判斷表頭,不看開頭字元
    {
        _expectHeader = false;
        if (!bstrData.StartsWith("M000")) { FinishQuery(); return; }   // 不是 M000:立刻收尾,不要等逾時
        if (bstrData.Split(',').Length > 1 && bstrData.Split(',')[1].Trim() == "0") FinishQuery();   // 筆數 0:直接收尾
        return;
    }
    _rows.Add(bstrData);                                               // 資料列:訊息欄的逗號是全形,可用半形逗號切欄
}

void FinishQuery()
{
    if (!_querying) return;                                            // 可重複呼叫:之後若又來一個 ##,也不會重複處理
    _querying = false;
    _expectHeader = true;
    ProcessSmartOrders(_rows);
}

幾點補充:

  • 表頭用「第一列」判斷,而不是看開頭字元是不是 M——資料列的第一欄是智慧單號,我們沒有確認它會不會以 M 開頭。
  • 帳號、日期一律是佔位符;0 是官方說明的「0:全部的委託單」。各策略別的欄位索引不同,請照官方欄位表查閱。
  • 事件在元件自己的執行緒上觸發,實際使用時,_rows 與幾個旗標要做同步,見〈群益API 事件回呼跑在哪個執行緒〉。

常見問題

群益API 智慧單回報的狀態要去哪裡看?

官方另外用兩條路提供:主動回報 OnStrategyData(V2.13.45 起提供期貨智慧單格式),以及呼叫 GetStopLossReport 之後由 OnStopLossReport 回傳的被動查詢。觸發後送出的市場委託,才會出現在一般的市場回報裡。

智慧單狀態 34 是什麼意思?

官方名稱是「洗價中」。狀態碼 32~40 各有官方名稱,例如 32 中台收單成功、37 洗價觸發、38 觸發下單;哪些算「還在等觸發」,由你依需求自己分。

查詢智慧單一直等不到結果,可能是什麼原因?

檢查第一列表頭。官方只寫了 M000 這一種表頭;我們遇過不是 M000 的表頭,程式沒處理就會卡到逾時、形成重查迴圈。表頭不是 M000 時要立刻結束這一次查詢。

刪除已觸發的智慧單要帶什麼?

除了智慧單號與單別,已經產生委託書號的,書號也要帶。官方註記「未填書號將影響解除保證金等風控」。

風險揭露

期貨與選擇權屬高槓桿商品,價格波動可能造成超過原始保證金的損失,交易人須自負交易責任。本文為程式開發技術教學,說明智慧單回報與查詢的判讀方式,不構成投資建議,也不保證任何交易結果。智慧單在觸發後才送出委託,觸發時的成交結果可能與預期不同;程式化交易並不降低市場風險,誤判智慧單的狀態,可能讓程式重複下單或留下未處理的委託。

投資人教育資源

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

延伸閱讀

參考資料

  • GetStopLossReport、OnStopLossReport(各策略別段落的欄位表與說明)、OnStrategyData、OnSmartData、CancelTFStrategyOrderV1 與 CANCELSTRATEGYORDER,依群益官方元件說明文件 V2.13.59 主手冊;2010 依官方錯誤代碼表。
  • 只用過被動查詢、非 M000 表頭造成重查迴圈:實作經驗,非官方文件記載。

免責聲明

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

延伸閱讀|相關文章

發佈留言

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