天天看點

fix/fast協定中PMAP(存在圖)和Sequence的解析要點fix/fast協定中PMAP(存在圖)和Sequence的解析要點

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個類就做完了。

繼續閱讀