CHANGELOG¶
Tapio 風控中台版本更新紀錄。
工具版本(AdminPanel、OrderClient)的更新另見工具下載。
SDK 為與核心配套部署的元件,其變更隨對應的 Tapio 版本一併列於本檔,以 [sdk] 標記。
版本號規則¶
採 x.y.z 三段式:
- x(major):SDK 協定不相容變更。看到
x跳號,即代表 SDK 必須同步升級。 - y(minor):對外可感知的新功能或行為變更(新指令、新風控規則、新稽核欄位等)。
- z(patch):純 bug 修復或不改變對外行為的小幅維運改善。
版本條目格式¶
每條 bullet 前綴 [scope] 表示更動範圍(core / tapioctl / sdk / binary 名 / docs 等),broker-specific 改動再加 (Broker)((SinoPac) / (IBF) / (MasterLink));shared 改動省略 broker tag。
1.7.0(2026-05-21)¶
行情子系統強化
[quote-receiver]行情商品資訊表改採期交所檔案載入:行情共享記憶體中的商品資訊表(商品代碼對應、價格小數位等)原本僅能由期交所行情多播取得,而該表只在盤別交接時多播。若於盤中清除並重建行情共享記憶體,當日後續所有行情更新都會卡在商品資訊不全。本版起 quote-receiver 於啟動時直接讀取期交所 P08(商品與時間流程群組定義檔)載入商品資訊表,並透過 inotify 監聽盤中拋檔即時重新載入;夜盤 P08 於下午才送達,故盤中重載為必要機制而非選用。[quote-receiver]行情漲跌停價改採期交所檔案載入:新增期交所 P11(每商品漲跌停價檔)的抓取與解析,quote-receiver 於啟動掃描與 inotify 重載時將各商品第一級漲跌停價寫入行情共享記憶體。與商品資訊表同理,盤中重建行情共享記憶體後漲跌停價可立即補齊,不需等待下次行情多播。P11 屬非啟動必要檔,缺檔不阻斷啟動,仍以行情多播為後備來源。[core]行情共享記憶體商品容量上限由 16384 提高至 65536:期交所商品數可能超過舊上限,逾上限時程序會中止。本版同步調升容量並更新行情共享記憶體佈局版本,磁碟上的舊版行情共享記憶體檔會在下次掛載時自動以新佈局重建。
Bug 修復
[core]修正行情共享記憶體於清除與重建空窗期間,商品價格查詢可能回傳 0 而非「無效」標記的問題。空窗期間查得的 0 會被當成有效價格,代入稅費與保證金試算並寫入當日新建的商品資料而沿用整日,使風控比對偏寬。修正後此情境一律回報「無效」,下單前的試算據以判定該商品價格資料不可用並明確拒絕委託,延續 1.6.0 的 fail-closed 設計。[taifex-fetcher]修正啟動回補(缺當日檔案時以前一營業日檔案暫用)誤含期交所匯率檔(C01)的問題。C01 檔名帶每次拋送的時間戳,與商品資訊、保證金等固定檔名不同,回補時不會就地覆蓋而是逐日累積。C01 非啟動必要檔且系統內建匯率後備值,本版起不再回補 C01,待當日 C01 送達後自動更新。[tapioctl]修正每日quote-clean行情快取清理比對到錯誤檔名、實際未清除任何檔案的問題。行情共享記憶體因此跨日單調累積商品,最終可能達容量上限導致程序中止;本版更正quote-clean的清理目標。
1.6.0(2026-05-20)¶
風控強化
[core]保證金資料就緒檢查(fail-closed):當某一商品的保證金資料尚未就緒時,該商品的下單與帳務查詢(權益、部位)一律明確拒絕並回報「保證金資料不可用」,確保風控比對與帳務回報基於有效數值。[core]保證金資料改採日盤/夜盤互補:若某一盤別的保證金資料尚未到齊,Tapio 會改用另一盤別的對應數值作為風控基準,避免單一盤別資料延遲時的估算錯誤。
啟動診斷
[core]啟動就緒條件擴大:Tapio 會等到所有設定的交易時段所需的期交所檔案(商品資訊、流量分組、部位限額、保證金等)全部到齊後,才開始受理委託;任一設定時段缺檔時,啟動流程會持續等待至檔案到齊。[taifex-fetcher]期交所檔案延遲拋送時的啟動回補:當日檔案尚未到達時,Tapio 可自前一營業日的對應檔案回補一份作為啟動暫用資料,待當日正式檔案到達後自動覆蓋。回補僅套用於可於盤中重新載入的檔案類型,僅於啟動時讀取一次的檔案不回補,以免整日沿用過期資料。
改善
[core]登入遭拒附帶診斷資訊:登入遭系統拒絕時,回應會附帶造成問題的商品與原因等診斷資訊,交易端與維運可直接判讀失敗原因,不需再另行查閱伺服器日誌。
Bug 修復
[core]修正系統暫停交易期間,客戶端送出委託遭拒時連線可能被關閉的問題。暫停交易期間連線維持不變,客戶端於收到拒絕回覆後可繼續等待系統恢復,不需重新連線與登入。
SDK(搭配版本 v1.2.0)
[sdk]新增「保證金資料不可用」狀態碼,對應本版保證金就緒檢查所產生的拒絕情境,整合端可據以辨識並向使用者提示。[sdk]登入遭拒回呼統一:登入遭拒時的回呼不再因伺服器回應格式不同而走不同路徑,整合端以單一進入點即可接收所有登入失敗事件。
內部架構整理(對外行為不變)
[core]保證金資料的內部儲存與存取路徑整理:保證金改由獨立模組統一管理,啟動載入與盤中重載共用同一條路徑,並縮減下單熱路徑的記憶體足跡;對外行為與風控結果不變。
1.5.0(2026-05-15)¶
新功能
[core]盤中保證金即時更新:期交所於盤中或盤後重新發布原始保證金(P14 檔)時,Tapio 透過 inotify 監聽檔案變化,於背景即時更新每一商品的保證金數值,下單風控熱路徑以 lock-free 方式讀取新值,無需重啟即可生效。先前版本保證金僅於啟動時載入後即固定不變,盤中調整須待隔日重啟才生效;本版確保盤中與盤後的保證金調整皆能於當日套用。[core](SinoPac)券商餘額同步檔的偵測機制改版:改用與拋送方式無關的輪詢式偵測,相容券商端以直接寫檔方式拋送的行為,待檔案寫入穩定後才觸發後續處理。新增[livesync]設定區段的scan_interval_sec(預設 5 秒)與stable_ticks(預設 2 次)兩項旋鈕,維運可依券商拋送節奏調整偵測視窗(預設約 5–10 秒)。
Bug 修復
[core](SinoPac)修正券商餘額同步在特定寫入失敗並重試的情境下,可能將同一筆更新重複計入分類帳的問題;重試路徑現於寫入分類帳後立即登錄去重鍵,確保同一筆更新不會重複套用。
1.4.2(2026-05-14)¶
Bug 修復
[core]補回 P08 reload 後每商品 flow-group 對應的單行 log(product(...) flowGroupAM(...) flowGroupPM(...));1.4.1 重構曾短暫遺失此診斷輸出,維運 grep 慣用格式還原為與重構前完全一致。[core]收到結構異常的 P08 拋檔時,於 reload 入口直接拒絕並 assert,避免錯誤資料進入熱路徑後才在下單時才被發現。
內部架構整理(對外行為不變)
[core]P08 啟動 seed 流程改由共用的SystemTypeFromIndex對應表驅動,移除一處硬編碼的 sysType 列表,後續新增交易系統時只需改一處。
1.4.1(2026-05-14)¶
新功能
[core]盤中 P08(商品與時間流程群組定義檔)熱重載:期交所盤中重發 P08 時,Tapio 透過 inotify 監聽該檔,於背景 helper thread 上即時更新每商品的 AM / PM 流量分組對應,NetThread 下單熱路徑以 lock-free 方式讀取新對應,無需重啟即可生效。先前版本僅在啟動時 seed 一次,盤中遇到期交所重新拋檔需重啟才能套用。
1.4.0(2026-05-14)¶
效能提升
本版主軸為間歇下單情境優化:兩筆委託間隔過久、caches 已被其他工作洗出時的下一筆委託處理時間,由前版約 1800 ns 降至 700 ns。此情境直接影響交易冷門時段、盤前第一筆、與低頻策略的延遲體感。穩態情況亦同步受益。
主要來源:
[core]委託熱路徑(R01 / R02)一輪深度優化:- SDK checksum 改用 SIMD 演算法,R01
sendPacket段延遲降約 30%。 - PacketLogger 由 SPSC queue 改為 LMAX disruptor;outbound 封包直接編碼進 ring slot,少一次 memcpy。
- R01 / R02 hot path 加入 prefetch(PacketLogSlot、報單回報池、商品 BoardData 首行)。
- BoardData 新增 per-user 商品基本資料 cache,R01 placement 不再逐筆查表。
- SDK checksum 改用 SIMD 演算法,R01
[core]連結期 hot path 緊縮:NetThread 熱程式碼集中到獨立 section(.text.hot)、PLT 改 eager binding、關閉 CETendbr64、套用 JCC erratum NOP 對齊。
新功能
[tapioctl]新增tapioctl check tuning:偵測機器系統調校(CPU governor、IRQ affinity、isolcpus 等)相對部署基準的 drift,盤前可一次性核對。[taifex-fetcher]期交所 SFTP 拋檔抓取行為調整:- 遠端 mtime 推進但檔案內容未變時,僅記錄
unchanged ... (mtime bumped),不再覆寫本地副本、不再重複 logpulled X bytes。 - 內容真正更換時,先以 hardlink 把舊檔保留到同層
_history/{基檔名}.{HHMMSS}.{sha8}再做 atomic rename;log 同步列出 size 與 sha8 的前後差異,事後可回溯當日每次拋檔變化。 - 遠端短暫送出 0 byte 檔(盤中切換空窗)時略過寫入並把本地 mtime 推進,保留前一份有效快照供 Gateway 繼續讀取。
- 遠端 mtime 推進但檔案內容未變時,僅記錄
Bug 修復
[core]修正特定情境下 R01 找不到對應商品 BoardData 時整個程序 abort 的問題,改為將該連線標記為 corrupted 後繼續服務其他使用者。[core]修正部分 inbound 回報路徑下委託書編號 allocator 未推進的問題,避免內部序號與交易所回傳對不齊。
內部架構整理(對外行為不變)
[core]TMP 連線收斂為每一個systemType一條,移除 per-product 重複連線與相應的 session 容器層。
1.3.0(2026-05-07)¶
新功能
[tapioctl][key-rotator]API Key 自動補發 / 換發:新增tapioctl keys rotate-expiring,為沒有 API Key 的使用者自動產生並寄出,既有 Key 即將到期者(預設到期前三個月內)自動產生新 Key 並寄信。[order-latency-stat]新增每日委託延遲分析工具tapio-order-latency-stat,可逐筆查詢單一委託的延遲與排名,或產生當日整體統計(筆數、平均、標準差、P50、P99、最大值,含最快 / 最慢清單)。支援兩種基準:push(送出至交易所)與reply(送出至收到首筆回報)。[tapioctl](SinoPac)封存檔自動上傳:新增tapioctl ship --proto sftp,將archived/*.tar.gz透過 SFTP 上傳至券商指定路徑,成功後本地檔案自動 unlink,失敗則保留待下次重試。遠端路徑規則為 SinoPac 指定的/<YYMM>/<filename>。憑證放於etc/secret/ship-sftp.env(權限 600),RPM 僅提供.example範本由維運填入。需安裝lftp套件,封閉環境部署需事先準備離線安裝媒體。[tapioctl](SinoPac)封存與上傳壓縮格式由 zstd 改為 gzip(archived/<YYYYMMDD>.tar.gz),配合券商 SFTP 接收端要求;行為不變,僅 codec 替換。先前已產生的archived/*.tar.zst不會被新版 ship 撿到,需維運手動清理一次。
改善
[cmd](SinoPac)稽核紀錄匯出工具SinoPac_OrderRiskLogExport與SinoPac_LoginLogExport支援-date auto,自動讀取目前的system_date,crontab 不再需要$(cat .../system_date)這類繞行寫法。[tapioctl]mail 服務與交易日切換脫鉤,可獨立啟停,不再受維護窗口限制。[tapioctl][tapio_check]tapioctl新增dump kinds子指令,輸出商品基本資料;同時修正tapio_check獨立執行時預設讀取錯誤資料夾的問題,現會自動對應到當日system_date子目錄。[order-latency-stat]修正被前置檢查拒絕的委託其回報遭忽略的問題,現會正確計入並顯示完整 8 碼委託書編號;Top-K 統計表格 CJK 欄位對齊修正。[core]移除拋檔目錄監控對 inotifyIN_CLOSE_WRITE的監聽。先前每次期交所拋檔送進來,log 都會多印一行C01: unable to open …tmp.<pid>緊接著一筆成功的 dispatch — 這是因為拋檔上游採 atomic-rename(先寫.tmp.<pid>再rename(2)),舊版同時聽IN_CLOSE_WRITE與IN_MOVED_TO會搶在 rename 前去開那個 tmp 檔。現在只聽IN_MOVED_TO,惱人的偽 ERROR 不再出現,行為不變。
設定
[core]每使用者下單速率限制可設為-1完全關閉(測試環境用)。
1.2.1(2026-04-22)¶
Bug 修復
[core]修正委託被前置檢查拒絕後,連線可能無法繼續送出後續封包的問題。
1.2.0(2026-04-22)¶
維運工具改版
[tapioctl]全新tapioctl指令介面,提供 4 階段狀態(STARTED / RUNNING / STOPPED / CRASHED),可區分「正常停止」與「異常崩潰」。[tapioctl]啟停所有服務改為平行執行,速度更快。[tapioctl]換日(rollover)與盤前(preopen)操作可重複執行不會出錯,並支援preopen --force強制重跑。
交易日切換時間調整
[core]系統日切從每日 08:00 移到 06:00,與台灣期貨夜盤節奏一致。[core]系統允許交易開關(trading_override)跨日重啟後保留先前設定。
風控強化
[core]可分別開關 ROD / IOC / FOK 三種委託效期,違規類型於前置檢查直接拒絕。[core]後台 API 新增整體呼叫速率限制,避免單次大量呼叫拖慢系統。
稽核強化
[core]後台操作日誌新增操作者身份欄位。[core]Session 與帳戶查詢回傳更完整的診斷資訊,減少二次查詢。
啟動診斷
[core]啟動時對設定組合做 fail-fast 驗證,不合法直接拒絕啟動。[core]啟動時逐筆顯示匯率與商品流量分組,便於對齊期交所拋檔。
其他
[cmd](SinoPac)新增登入記錄(SinoPac_LoginLogExport)與委託風控記錄(SinoPac_OrderRiskLogExport)匯出工具。[core]行情共享記憶體加上寫入端互斥保護,避免雙寫毀損。