你好, 關於你提出的問題, 我想分兩個層面來回覆:
第一個層面是資料定義的問題.
交易所目前針對股票交易異動所傳送的資料主要分成兩種(封包), 一種是委託簿的更新, 另外一種是成交加上委託簿的更新.
第一種情形是股票沒有成交時委託簿卻有異動的狀態, 例如股票已經漲停了, 隔了一陣子有新的委託產生, 可是還是沒有成交, 這時候交易所會傳送目前委託簿的最新內容.
第二種情形則是股票發生成交時所送出來的資料, 這時候交易所會送出股票的成交價/量, 以及成交之後的委託簿的內容.
當交易所送出委託簿更新的資料時(第一種情形+第二種情形), XQ會同步更新五檔的委託價/委託量, 而最好的委託買價就是Bid (BestBid1), 最好的委託賣價就是Ask (BestAsk1).
如果此時有伴隨成交的話(第二種情形), XQ也會同時產生一筆新的成交明細, 欄位包含時間, 成交, 買價, 賣價, 單量, 內外盤註記等, 可是這裡要注意的是, 成交明細上面的買價/賣價, 並不是交易所更新後的五檔委託簿上面的最佳買價/最佳賣價, 而是更新前的五檔委託簿上面的最佳買價/最佳賣價.
會這樣子處理的原因是希望在成交明細上面可以讓使用者看到成交當時所搭配的買價/賣價, 同時以此為依據來推算這一筆成交是內盤成交或是外盤成交. 由於交易所並沒有公佈每一筆成交價的買價/賣價, 所以我們就以收到成交時我們"手上"的最佳買價/最佳買價為主, 而這個價格, 並不一定會等於成交之後的最佳買價/最佳賣價.
底下是今天收盤後3085這一檔商品的資料, 從畫面上可以看到目前最新的委買價/委賣價是40.25, 40.30, 可是13:30:00那一筆成交上面標示的買價/賣價則分別是40.25, 40.35, 兩者有些微的差異.

從RTD (或是DDE)所取得的Bid, Ask, 目前回傳的就是最新五檔上面的委買價/委賣價, 所以的確有可能會跟成交明細上面的買價/賣價不一樣.
第二個層面是RTD/DDE更新頻率的問題.
當我們收到交易所任何一個封包時, 在更新完相關的欄位之後, 就會主動通知RTD/DDE, 把更新後的資料傳送給RTD/DDE的client. 就我們的理解, 這部分Windows的作法可能是採用shared memory或是windows message來做跨process的資料傳遞, 如果資料異動的很快的話, 應該有可能client端不會收到我們push出去的每一次update (這一點並不是我們可以控制的). 如果發生了這樣子的情形的話, client端收到的資料就會有不同步的問題產生.
目前XQ的RTD功能並沒有支援一次可以取得多個欄位的功能, 只能每個欄位獨立訂閱. 在更新頻率很快且CPU繁忙的情形底下, 我們猜想不同步的機率就會高一些. 我們目前已經請研發團隊研究是否可以支援一次取得多個欄位的功能, 如果有任何進展的話會再通知你.
以上是針對資料定義跟傳遞方式的說明. 目前建議請你觀察一下CPU的用量, 再比對一下收到的資料內容, 比較好判斷是資料同步或是資料內容定義的問題. 如果還有其他問題或是建議的話, 也非常歡迎你再跟我們討論.
謝謝.
12 評論