交易軟體中的雙時態資料設計與定時單功能
交易軟體中的雙時態數據 (Bi-temporal data)
雙時態數據1 是指一個事件具有兩個時間的數據,例如報價 (Quote):
- 生效時間 (Effective Time, ET): 報價具體指涉或生效的時間,例如 9:10:00 AM 的報價
- 應用時間 (Application Time, AT): 報價具體進到應用程式的時間,後一秒 9:10:01
在報價中生效時間 100% 是落後應用時間,但是像是我們送出的委託:
- 生效時間:委託具體送到券商或交易所,在券商與交易所上打上的時間,例如 9:15:10
- 應用時間:委託送出應用程式的時間,可能是 9:15:09 (早一秒)
所以如果無關業務邏輯的話,雙時態數據的 ET 和 AT 可能有先有後。
相比一般軟體設計,關聯的可能是自己的資料庫,在交易軟體中關聯的是第三方
也就是不需要擔心生效時間與應用時間衝突,永遠都是生效時間優先
從生效時間去預測應用時間,或是從應用時間去預測生效時間,就是所謂的 預測 (Projection)
為什麼需要對 ET 與 AT 進行預測?
如果使用者有一個定時單,要在 9:15 送出一個台積電 2330 掛買一張
他是希望 ET 在 9:15,還是 AT 在 9:15?他是希望 9:15 送到交易所,還是 9:15 從電腦送出?
如果使用者要藉由 9:40 的台積電報價去生成另一個委託
他是希望以 ET 在 9:40 的報價來生成呢,還是 9:40 的應用時間
更複雜一點的狀況還包含,應用時間是在何時打上,可能是在報價進到電腦的時候打上
也有可能是在報價具體渲染到使用者畫面時打上,渲染前打上或渲染後打上
怎麼打都可以, 關鍵是你就會需要去預測 ET 與 AT 的落差
並且根據使用者需求,去使用這個落差,例如提前操作、延後操作
以定時單為例
使用者有一個單,他需要基於生效時間在 9:50 的報價,計算掛單量
然後定時在 10:00 要掛出,他希望盡可能生效時間接近 10:00 整掛出
而使用的報價也希望盡可能接近 9:50
由於我們要基於我們的大致預測去行為,就可能不那麼精準
這時候最關鍵的是,他對於提前的容忍度:
1. [ ] 可以接受使用到 9:49:59 的報價嗎?
2. [ ] 可以接受掛單到 9:59:59 的情況嗎?
如果使用者不能接受提前,ET 與 AT 的落差就不能使用來調整操作時間
如果使用者可以接受,你就可以盡量考量 ET/AT 的落差,讓 ET 落在使用者期待的時間
當然,這裡面可能就有很多規則,甚至啟動應用程式時還得試算 ET/AT 與評估網路情況
但大致的原則就是這樣,雙時態數據在例如開盤、尾盤與一些時間事件的交易處理上很有幫助
延伸討論:ET 與 AT 只會有一個嗎?
雙時態數據可能是最基本、最有表達力的方式,但有時候你可能需要更多時態描述事件
例如 ET 可能是個範圍,你的操作具體生效開始到生效結束有一個範圍
而 AT 也可能是個範圍,你的操作具體在應用程式中開始,到應用程式接收/發送完畢
完全可以根據你的需求延伸去做設計,以及根據 API 呼叫可能有的限制,去調整你的預測
Footnotes
1 雙時態數據在資料庫處理中,屬於事件溯源的範疇
見:https://www.planetgeek.ch/2023/12/04/our-experience-with-bi-temporal-event-sourcing/