跳轉到

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 不再逐筆查表。
  • [core] 連結期 hot path 緊縮:NetThread 熱程式碼集中到獨立 section(.text.hot)、PLT 改 eager binding、關閉 CET endbr64、套用 JCC erratum NOP 對齊。

新功能

  • [tapioctl] 新增 tapioctl check tuning:偵測機器系統調校(CPU governor、IRQ affinity、isolcpus 等)相對部署基準的 drift,盤前可一次性核對。
  • [taifex-fetcher] 期交所 SFTP 拋檔抓取行為調整:
    • 遠端 mtime 推進但檔案內容未變時,僅記錄 unchanged ... (mtime bumped),不再覆寫本地副本、不再重複 log pulled X bytes
    • 內容真正更換時,先以 hardlink 把舊檔保留到同層 _history/{基檔名}.{HHMMSS}.{sha8} 再做 atomic rename;log 同步列出 size 與 sha8 的前後差異,事後可回溯當日每次拋檔變化。
    • 遠端短暫送出 0 byte 檔(盤中切換空窗)時略過寫入並把本地 mtime 推進,保留前一份有效快照供 Gateway 繼續讀取。

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_OrderRiskLogExportSinoPac_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] 移除拋檔目錄監控對 inotify IN_CLOSE_WRITE 的監聽。先前每次期交所拋檔送進來,log 都會多印一行 C01: unable to open …tmp.<pid> 緊接著一筆成功的 dispatch — 這是因為拋檔上游採 atomic-rename(先寫 .tmp.<pid>rename(2)),舊版同時聽 IN_CLOSE_WRITEIN_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] 行情共享記憶體加上寫入端互斥保護,避免雙寫毀損。