委託追蹤¶
每一筆送出的委託,在被交易所接受、成交、取消或拒絕之前,都可能對該帳戶產生保證金佔用與部位異動。若系統不即時追蹤這些「在途」的委託,風控判斷將出現以下漏洞:
- 客戶在第一筆仍為有效委託單時連續下五筆大單,每筆都看似「餘額夠」,但實際上五筆同時成交將直接造成超額損失(Over Loss)
- 系統不知道某筆委託已被交易所取消,繼續把該筆的保證金算入佔用,導致可用資金低估
- 盤中系統重啟時,重新啟動後無法判斷哪些委託還在外面「委託中」
Tapio 以委託簿(order book)即時維護每筆委託的當前狀態,並與保證金佔用計數器緊密聯動。
為何要追蹤每筆委託¶
核心需求:保證金檢查必須看到「已送出但尚未終結」的所有委託,否則重複下單會導致帳戶曝險失控。
Tapio 為此設計了預先鎖定機制:
每筆委託(無論開倉或平倉)通過風控並送往交易所之前,都會登記進委託簿,並把預估保證金預先鎖定(加入有效委託單口數);此後該帳戶每一筆新的保證金檢查都會看到已鎖定的金額,直到該筆委託成交或取消才釋放。
平倉委託同樣進入委託簿
平倉委託雖然跳過保證金檢查與部位限制檢查,但仍然登記進委託簿,並計入 B(買方委託中)或 S(賣方委託中)。這是因為平倉委託在仍屬有效委託單時佔用交易路徑,保證金試算需要知道所有在途委託以計算最壞情況曝險。
這確保了:連續下單時,每一筆的風控檢查都是保守的。
委託的狀態機¶
stateDiagram-v2
[*] --> 已送出
已送出 --> 拒絕: 本地風控未通過<br/>(未送往交易所)
已送出 --> 委託中: 風控通過<br/>預先鎖定保證金
委託中 --> 委託中: 部分成交<br/>成交部分轉為部位
委託中 --> 全部成交: 最後一部分成交
委託中 --> 已取消: 收到取消回報
委託中 --> 已拒絕: 交易所拒單
委託中 --> 委託中: 改價(不動口數)
委託中 --> 委託中: 減量(降低口數)
拒絕 --> [*]
全部成交 --> [*]
已取消 --> [*]
已拒絕 --> [*]
核心狀態:
| 狀態 | 說明 |
|---|---|
| 已送出 | 剛從客戶端收到,尚未進入風控 |
| 委託中 | 風控通過、已送往交易所、尚未終結(剩餘口數大於零) |
| 部分成交 | 非獨立狀態——部分口數已成交、剩餘口數下降,委託仍留在委託簿(仍屬「委託中」狀態) |
| 全部成交 | 所有口數均已成交,委託終結 |
| 已取消 | 客戶主動取消或 TIF 到期自動取消 |
| 已拒絕(交易所) | 交易所端拒單 |
| 拒絕(本地) | Tapio 風控直接拒絕,未送往交易所 |
各狀態轉換對保證金的影響¶
| 轉換 | 有效委託單口數 | 部位 | 可用資金 |
|---|---|---|---|
| 風控通過,進入委託中 | +qty(預先鎖定) | 不變 | 扣除預先鎖定後下降 |
| 部分成交 k 口 | −k | +k(新增部位) | 不變(委託中釋放 k、部位佔用 k,相互抵銷) |
| 全部成交 | 歸零 | +qty | 不變(一次全部轉為部位佔用) |
| 已取消 / 交易所拒絕 | 歸零 | 不變 | 上升(釋放預先鎖定) |
| 改價 | 不變 | 不變 | 系統重新計算(通常微幅變動) |
| 減量至 k' | 調整為 k'(即 −(qty − k')) | 不變 | 上升(釋放被減量部分) |
為何成交後可用資金「通常不變」
成交的常見情境下,可用資金不增也不減——成交只是把佔用從「委託中」轉移到「部位」。這符合業務直覺:掛單時預先鎖定的金額,成交後以部位形式繼續佔用。
保證金公式(以單一商品為例),其中 \(B\) 為買方有效委託單口數、\(S\) 為賣方有效委託單口數、\(N\) 為淨部位口數:
當買單成交 \(k\) 口時,\(B\) 減少 \(k\)、\(N\) 增加 \(k\),\(|B + N|\) 的值通常不變,保證金佔用因此相互抵銷。
邊界條件:若成交導致淨部位方向翻轉,或使最大值的比較結果從一側切換到另一側,則成交瞬間的保證金總需求可能出現短暫的微幅變動。這屬於正常計算行為,系統直接以新計算值為準,不進行額外補扣或退還。
預先鎖定機制詳解¶
範例:連續下五筆大單¶
假設
- TXF 原始保證金 184,000 NTD / 口(示意)
- 帳戶可用資金 1,000,000 NTD
- 空倉起始
逐步模擬
| 動作 | 有效委託單口數 | 所需保證金 | 可動用額度 | 結果 |
|---|---|---|---|---|
| 下買 1 口 | 1 | 184,000 | 1,000,000 | 通過,鎖定 184,000 |
| 下買 1 口 | 2 | 368,000 | 816,000 | 通過,鎖定 368,000 |
| 下買 1 口 | 3 | 552,000 | 632,000 | 通過 |
| 下買 1 口 | 4 | 736,000 | 448,000 | 通過 |
| 下買 1 口 | 5 | 920,000 | 264,000 | 通過 |
| 下買 1 口 | 6(試算) | 1,104,000 | 80,000 | 拒絕:保證金不足 |
沒有預先鎖定會怎樣
若系統不預先鎖定,每筆新單看到的「已佔用保證金」永遠是 0(因為前幾筆都還沒成交)。五筆全下,伺服器只會拒絕最後一筆——但若市場突然跳動,前五筆同時成交就會導致帳戶出現超額損失(Over Loss)。
預先鎖定 vs 實際送出¶
風控通過與預先鎖定是同步完成的:
sequenceDiagram
participant C as 客戶端
participant T as Tapio 風控
participant E as 交易所
C->>T: 下單請求
T->>T: 前置檢查通過
T->>T: 保證金試算通過
T->>T: 預先鎖定<br/>(委託中 +qty)
T->>T: 部位限制檢查通過
T->>E: 轉送下單指令
T->>C: 回覆已接受
Note over T: 下一筆新單已能<br/>看到此筆的鎖定
保證金預先鎖定一定發生在「回覆客戶端已接受」之前。這代表客戶下一筆送出時,系統端的有效委託單口數已經更新完成。
成交與取消如何釋放鎖定¶
成交回報¶
當收到交易所的成交回報時:
- 該筆委託的剩餘口數下降
- 已成交部分計入帳戶的部位
- 有效委託單口數 −k(k 為此次成交口數)、部位 +k
部位產生的保證金佔用會隨新部位加入計算。由於原有鎖定轉為部位佔用,總佔用金額通常不變。
取消回報¶
當收到交易所的取消回報時:
- 剩餘口數降為 0
- 有效委託單口數 −(原剩餘口數)
- 該筆委託從委託簿移除
交易所拒單回報¶
若交易所在下單後回覆拒絕:
- 系統從委託簿移除該筆
- 有效委託單口數 −(原口數)
- 客戶收到拒單原因
交易所連線群組關閉¶
交易所連線群組指 Tapio 與交易所之間的一組通訊連線,屬基礎設施層事件,與客戶端本身的連線斷線無關。
若某條交易所連線發生異常並被關閉,Tapio 會自動釋放所有與該連線相關的在途委託鎖定,可用資金隨之回升。系統不會另送取消指令,因為交易所在連線關閉時會自行清理有效委託單。兩側的帳戶資料會在盤後完整同步。
改單、減量、刪單對委託簿的影響¶
改價(Modify)¶
客戶送出改價請求時,Tapio 先記錄當下帳戶快照至審計紀錄,再將改價指令送往交易所。收到交易所確認後才更新委託表中的價格。委託中口數不變,保證金佔用小幅重算(因行情可能有微幅變動)。
改價的保證金更新以交易所確認為準
改價的保證金更新以交易所確認為準,這與減量的邏輯一致:改單類操作均需等待交易所回覆確認。
減量(Reduce)¶
減量實際上是「部分取消」:
Tapio 先記錄當下帳戶快照至審計紀錄,再將減量指令送往交易所。指令送出後保證金尚未釋放;收到交易所確認後,被減量的部分才釋放鎖定,可用資金隨之回升。
改單、減量、刪單不新增保證金鎖定
改單、減量、刪單不新增保證金鎖定,系統僅在審計紀錄中記錄當下帳戶狀態,不執行帳戶限制檢查。
刪單(Cancel)¶
與「減量至 0」等價,收到交易所取消回報時釋放全部鎖定。
委託編號的對外與內部差異¶
Tapio 對客戶端回覆的委託編號是含錯誤偵測碼的版本,在取消/改單時用來偵測客戶端的操作失誤(例如帳號與委託編號不符、封包傳輸錯誤)。
| 欄位 | 對外 | 內部 |
|---|---|---|
| 委託編號格式 | 含錯誤偵測碼的編號 | 原始委託編號 |
| 取消/改單時 | 客戶送入含偵測碼的編號 | 系統驗證後取原始編號查表 |
| 驗證失敗 | 回覆「委託編號無效」 | — |
委託編號錯誤偵測機制的設計目的
委託編號包含錯誤偵測機制,可在取消或改單時偵測客戶端的操作失誤(例如帳號與委託編號不符、封包傳輸錯誤)。系統部署於封閉網路環境,此機制專為善意使用者的操作失誤設計。
系統重啟後的恢復¶
Tapio 以單一交易日為運作週期,可能在盤中或盤前發生重啟。為確保重啟後每筆帳戶的有效委託單口數、部位、餘額完全一致,系統採用完整的狀態重建機制:
flowchart TD
A[系統啟動] --> B[載入盤前帳號資料]
B --> C[載入盤前部位]
C --> D[載入盤前餘額]
D --> E[載入盤中餘額異動檔]
E --> F[按序重建委託簿與帳戶狀態(成交回報)]
F --> G[按序重建委託簿與帳戶狀態(拒單回報)]
G --> H[重建委託簿 + 有效委託單口數]
H --> I[重建部位 + 已實現損益]
I --> J[系統就緒]
J --> K[客戶端重連]
K --> L[從上次看到的最後序號<br/>補送期間所有回報]
關鍵保證¶
- 委託簿完全重建:重啟前處於「委託中」的每筆委託,重啟後仍以相同狀態存在
- 累計計數一致:有效委託單口數、部位、當日餘額變動都與重啟前一致
- 客戶端 recovery:客戶端可提供「我上次看到的最後序號」,Tapio 補送期間所有的成交與拒單回報
盤中事故後的快速復原¶
若盤中發生事故(例如硬體故障、程序崩潰),維運人員依「交易日作業流程」重啟服務。整個狀態重建過程通常在數秒內完成,客戶端重連後可無縫繼續交易。
審計與稽查¶
每筆委託的風控結果都會寫入審計紀錄,內容包含:
- 該筆委託的內部編號、對外委託編號
- 風控當下的行情快照、餘額快照、部位快照
- 試算出的保證金、可用資金、部位累計
- 通過或拒絕的結果;若拒絕,記錄拒絕原因
在事後稽查時,可依此還原每一筆委託當下的風控情境。