fix/fast協定中PMAP(存在圖)和Sequence的解析要點
吳旻
泰岩網絡工作室
因為更新的原因,我整理了一個從前的兄弟寫的FIX/FAST解析代碼。其中一直讓我看不懂的是PMAP和Sequence的解法(因為代碼事實上是有問題的),我也沒找到相關的文檔。下載下傳了Quickfast的安裝包,費了牛勁安裝好,發現更複雜。好在隻用到了一點點,算是把這兩件事弄明白了。
PMAP可能沒有。
這是一個緻命的陷阱。一個正常的消息第一個資料就是PMAP,而且這個PMAP的第一個bit就是指後面有沒有此消息的TID。正常的消息一定會有PMAP。
但對于Sequence來說,它後面的第一個資料是這個Sequence的長度。再下一個資料可能是PMAP,也可能是正式的資料。有還是沒有,判斷錯了,後面就全錯了。
由于找不到相關的文檔,隻好查Quickfast的代碼。Quickfast的代碼顯示,有沒有PMAP是根據這個template中所有的filed是不是可能用到PMAP有關。如果說,這個template中所有的字段都不需要使用PMAP就能判斷出來,那就不會有PMAP出現。比如下面的例子:
<sequence name="BidPriceLevel"presence="optional">
<lengthname="NoBidPriceLevel" id="10068"presence="optional"/>
<int64name="BidSize" id="134"/>
<int32name="BidPx" id="132" decimalPlaces="3"/>
</sequence>
因為Sequence裡的field操作符是None,是以這個Sequence就不會有PMAP。有還是沒有,是在加載模闆後,就要算出來的。
Sequence的長度顯式和隐式表示法。
上面的例子中,Sequence下的第一個field指的是全部Sequence的個數,隻需要讀取一次就夠了。千萬别把它當成是Sequence中的field。另一種隐式的寫法也許更理一些,如下:
<sequence id="73" presence="optional"name="Orders">
<uInt32 id="38" presence="mandatory"name="OrderQty" />
</sequence>
FAST模闆是個自相似的結構。
自相似是分形的另一個表述,就是整體和局部非常像,單獨拿出來,你分不清哪是整體,哪是局部。這個用函數表述就是遞歸,一層一層調用,但調用的是同一個函數。quickfast用幾十個類去解析,我隻用了3個類就做完了。