GMDS

CME MDP3.0的規劃與建置

張貼者:2015年3月2日 下午7:08Wei-Xiuang Wang   [ 已更新 2017年7月22日 上午3:40 ]


CME於2015/6/10開始, 全面改用FIX/SBE的方式並停用FIX/FAST

FIX的重大改變

The following data will be removed from the FIX/FAST Market Data Incremental Refresh (35=X) message format:

  Tag 75-TradeDate - only the time is included on each message to save space. The Trade Date will be included on every Security Status (35=f) message update.
  (http://www.cmegroup.com/confluence/display/EPICSANDBOX/MDP3+-+Market+Data+Security+Status)

  Tag 273-MDEntryTime - Currently, tag 273-MDEntryTime is sent in each Market Data Incremental Refresh (35=X) message data block. Beginning with this release, the Start of Event timestamp (tag 60-TransactTime) will be sent once for each message. This will provide a more accurate timestamp for the message blocks.

  The following market data will no longer be sent:
    - Better Bid/Offer (CLAST)
    - Simulated Buy/Sell
    - Calculated Prices for Trades (Leg or Implied Orders Only)
    - Net Change
    - Tick Direction
    - Trade Condition

  Tag 731-SettlPriceType will be used for settlement prices; tag 286-OpenCloseSettlFlag will no longer be sent for settlement prices.

  The table below shows the relationship between the MDP and iLink tags.
    (Previous MDP Format[FAST])   (MDP3.0 New [FIX/SBE])
         tag 1151-SecurityGroup : tag 6937-Asset
         tag 55-Symbol          : tag 1151-SecurityGroup
         tag 107-SecurityDesc   : tag 55-Symbol


  The following new tags will be added to the Market Data Security Definition (35=d) message:
        tag 779-LastUpdateTime indicates the timestamp for when the instrument was last added, modified or deleted.
        tag 1300-MarketSegmentID identifies the market segment for all CME Globex Instruments.
        tag 6937-Asset indicates the underlying asset code, which was previously disseminated in tag 1151-SecurityGroup.
        tag 167-SecurityType indicates the type of security.
        tag 6350-TickRule indicates the VTT Code provided for instruments with variable ticks in addition to the Tick Size in Tag 969-MinPriceIncrement.
        tag 37702-MainFraction indicates the price denominator of the main fraction.
        tag 37703-SubFraction indicates the price denominator of the sub fraction.
        tag 9800-PriceDisplayFormat indicates the number of decimals in the displayed price (e.g., for price '100.25' will = '2')
        tag 731-SettlPriceType will be sent for settlement prices. It will contain a bitmap field of Boolean type indicators representing the settlement price type as described for the Incremental Refresh message.

  The following tags will be removed from the Market Data Security Definition (35=d) message:
        tag 5796-TradingReferenceDate
        tag 827-ExpirationCycle
        tag 107-SecurityDesc
        tag 9853-PricingModel
        tag 454-NoSecurityAltID with repeating groups: tag 455-SecurityAltID and tag 456-SecurityAltIDSource
        tag 1144-ImpliedMarketIndicator (implied eligibility for instruments will be found in the tag 871-InstAttribType=24 repeating group).
        tags from the Leg repeating group (tag 555-NoLegs):
    - tag 5795-LegSecurityGroup
    - tag 600-LegSymbol
    - tag 608-LegCFICode
    - tag 764-LegSecuritySubType
    - tag 556-LegCurrency
    - tag 610-LegMaturityMonthYear
    - tag 612-LegStrikePrice
    - tag 616-LegSecurityExchange
    - tag 620-LegSecurityDesc
    - tag 942-LegStrikeCurrency
    - tag 286-OpenCloseSettlFlag


特別是商品描述的欄位部分非常容易混淆

Previous MDP Format (FAST)
MDP 3.0 (New Market Data Format - SBE)
iLink Order Entry

tag1151-SecurityGroup  

tag 6937-Asset

tag1151-SecurityGroup

tag 55-Symbol  

tag1151-SecurityGroup  

tag 55-Symbol  

tag 107-SecurityDesc

tag 55-Symbol

tag 107-SecurityDesc



以CME的用戶端iLink來看, 應該是要讓MDP3.0經過轉換後相容於之前的對應

個人觀點:
 項目/格式 FIX/FAST(舊的MDP) FIX/SBE(新的MDP3.0)
 概念 以商品訊息為主軸 以資料處理為主軸
 格式 格式繁多雜亂,重複設計,焦點不明確 格式統一,功能明確,變動可能性降低
 封包 FAST壓縮,位元組傳輸量較少 Binary無壓縮,封包數增加20%~50%,傳輸量大增
 閱讀 封包內容經FAST壓縮,人工閱讀困難 結構化Binary資料,內容單純易於確認與溝通
 行情解讀 一個商品一個訊息更新 一個訊息多個商品更新
 成交揭示 一個商品一個訊息完成,較為單純 一個商品兩個訊息完成,恐增加行情處理負載
 價位小數 只有小數三位數 完整小數位數
 Tick合併 逐筆不合併,真實呈現 同一個TimeStamp同價合併,Tick大幅度減量
 實測數據 整體原始數據量所需位元組較少 可高達FAST的2.33倍,也就是增加1300%,需更大的頻寬確保品質

價位小數點的差異:

Tick合併比較:

以期貨商品同時段同範圍資料量比較:
FIX/FAST: Channel ( 7,9,11,13,15,30,31,32,33,60,111,117,113,115 )
FIX/SBE: Channel ( 310,312,314,316,318,382,386,384,360,320,340,346,342,344 )
新格式明顯為舊格式的2倍多


GMDS的規劃與建置, 介紹由當前FAST移轉到SBE的方式

假設FIX/FAST的GMDS/URDS設定為
Future  /channel 7,9,11,13,15,30,31,32,33,60,111,117,113,115,801
Option CBT
 /channel 112,114,116
Option CME
 /channel 8,12,61
Option NYM
 /channel 35,38
(PS: 801 or 117是設定相同的Group進系統, 只會有其中之1)

FIX/FAST的GMDS/PatsEmu-CME設定為
Future SecurityExchange=XCME,XCBT,XNYM,XCEC
Symbol=6A,6B,6C,6E,GF,GE,LE,HE,6M,6N,6J,NQ,ES,ND,NK,6S,SP,ZQ,XC,XK,ZC,ZR,ZD,YM,ZO,ZS,ZB,ZF,ZW,GC,QO,HG,SI,QM,NG,PD,PL,CL,XR,BD,IE,OP,ZN,ZT
Option CBT
SecurityExchange=XCBT
SecurityGroup=6E,ES,OG,LO,SO,6A,6B,6C,6J,OZC,OZW,OYM,OZB,OZS,OZN,OZF
Option CME
SecurityExchange=XCME
SecurityGroup=6E,ES,OG,LO,SO,6A,6B,6C,6J,OZC,OZW,OYM,OZB,OZS,OZN,GE,LE,GF
Option NYM
SecurityExchange=XNYM,XCEC
SecurityGroup=6E,ES,OG,LO,SO,6A,6B,6C,6J,OZC,OZW,OYM,OZB,OZS,OZN,ON
(PS: 選擇權設定有點亂, 用顏色把對應交易所的商品標示出來, 不符合交易所的設定商品可以移除)


由CME的對照表
http://www.cmegroup.com/confluence/display/EPICSANDBOX/MDP3#MDP3-FIX/FASTtoMDP3ChannelMapping
新的FIX/SBE的GMDS/URDS設定變為
Future  /channel 310,312,314,316,318,382,386,384,360,320,340,346,342,344
Option CBT
 /channel 341,343,345
Option CME
 /channel 311,315,321
Option NYM
 /channel 383,361

FIX/SBE的GMDS/PatsEmu-CME設定為 (也就是沒有改變)
Future SecurityExchange=XCME,XCBT,XNYM,XCEC
Symbol=6A,6B,6C,6E,GF,GE,LE,HE,6M,6N,6J,NQ,ES,ND,NK,6S,SP,ZQ,XC,XK,ZC,ZR,ZD,YM,ZO,ZS,ZB,ZF,ZW,GC,QO,HG,SI,QM,NG,PD,PL,CL,XR,BD,IE,OP,ZN,ZT
Option CBT
SecurityExchange=XCBT
SecurityGroup=OZC,OZW,OYM,OZB,OZS,OZN,OZF
Option CME
SecurityExchange=XCME
SecurityGroup=6E,ES,6A,6B,6C,6J,GE,LE,GF
Option NYM
SecurityExchange=XNYM,XCEC
SecurityGroup=OG,LO,SO,ON

如果選用Multi-DB版本來規劃, 可以簡化為 (基於Future/Option的應用或架構方式可能不同, 還是規劃成兩個分流)
URDS的設定(也就是把Option的部分簡化為一個)
Future  /channel 310,312,314,316,318,382,386,384,360,320,340,346,342,344
Option
 /channel 341,343,345,311,315,321,383,361

PatsEmu-CME的設定(也就是把Option的部分簡化為一個)
Future SecurityExchange=XCME,XCBT,XNYM,XCEC
Symbol=6A,6B,6C,6E,GF,GE,LE,HE,6M,6N,6J,NQ,ES,ND,NK,6S,SP,ZQ,XC,XK,ZC,ZR,ZD,YM,ZO,ZS,ZB,ZF,ZW,GC,QO,HG,SI,QM,NG,PD,PL,CL,XR,BD,IE,OP,ZN,ZT
Option
SecurityExchange=XCBT,XCME,XNYM,XCEC
SecurityGroup=OZC,OZW,OYM,OZB,OZS,OZN,OZF,6E,ES,6A,6B,6C,6J,GE,LE,GF,LO,ON,OG,SO

Multi-DB版本的PatsEmu-CME提供 /GroupMap 參數(點連結直接參考)
所以, 針對Future與Option的GroupMap設定檔可以分別這樣設計

PatsEmu-CME GroupMap for Future

"XCME",0x8100
"XNYM",0x8200
"XCBT",0x8300
"XCEC",0x8400

PatsEmu-CME GroupMap for Option

"O_XCME",0x8101
"O_XNYM",0x8201
"O_XCBT",0x8301
"O_XCEC",0x8401

'因為LO選擇權Strike特別多,將其獨立抽出可以有較好的處理效率
"LO|XNYM",0x8202    '交易所XNYM的LO全部選擇權
(PS: 由於LO有獨立抽出, 所以O_XNYM中不含LO商品, 於此例中只剩ON而已)

不同於之前的設置方式, 差異如表
  分流數
 TSHS-TfsRaw  PatsEmu-CME  數據庫(DbfId)  UniDnf-SB 同步需求
 TSHS-UniDbf/OBG
 舊的方式 4
 4 4
 4 ( 1 Future 3 Option )
 4 選擇性少,
容易有多餘的資源耗費
 新的方式 2
 2  2 9 ( 4 Future 5 Option)
 2 選擇性多,
有效使用資源提升效率
也就是新的方式架構更為簡單, 但能提供更多數據庫組合方式作為運用

同步的部分也能考慮改用UniDbf Merge Server (UniDbf-MS), 那麼只需執行一個UniDbf-MS 便能替代多個UniDbf-SB
不過舊的設置方式中, 每個分流的PatsEmu-CME要先透過/DbfId參數變更預設數據庫代碼0x0022成四個分別不同的代碼才能作為區別

新版的PatsEmu-CME支援FIX/SBE並相容舊的CME平台FIX/FAST,
新增Channel View可以查看所有Channel接收情形

新增FIX/SBE格式查看功能(rem是格式名稱,如果是偵測到新格式則是格式分析說明)

調整CME Filter的方式, 易於對照交易所提供之商品是否正確

新的URDS增加8,9,10三種新的接收方式 (可參考 URDS延伸參數說明 )
其中模式9可以用來替代目前收FIX/FAST使用的模式6
新的SBE則用模式10設定來接收

由於URDS接收模式9,10為自行定義清單, 因此控制分流接收可以透過檔案內容設定不同清單,
也可用相同的完整清單設定透過 /Channel 參數作不同的分流設定

例如以目前的Future/Option兩個分流, 可以用一個完整的清單

URDS-ByList-SBE.cfg

#註解行引符可為 # ; ' 與 Tab(x09)

#依序設定欄位
#Title,#Group IP,#Listen port

#模式一(任意來源):
    #Title - 簡稱(30Bytes以內)
    #Group IP - Multicast Group IP for join
    #Listen port - port number for listen

#模式二(CME AB備源):
    #Title - 以'*'帶Channel-ID作為Title, 例如 *300
    #Group-A IP - Multicast Group IP for join
    #Listen port - listen port for  Group-A
    #Group-B IP - Multicast Group IP for join
    #Listen port - listen port for  Group-B

#可透過 <enable> 與 <disable> 指定該行以下之設定是否生效

<enable>
#CME MDP3.0 FIX/SBE的Multicast Group IP/port ( A/B-Feed )
#正式環境 ftp://ftp.cmegroup.com/SBEFix/Production/Configuration/config.xml
*310,224.0.31.1,14310    ,224.0.32.1,15310  
*311,224.0.31.2,14311    ,224.0.32.2,15311  
*312,224.0.31.3,14312    ,224.0.32.3,15312  
'*313,224.0.31.4,14313    ,224.0.32.4,15313  
*314,224.0.31.5,14314    ,224.0.32.5,15314  
*315,224.0.31.6,14315    ,224.0.32.6,15315  
*316,224.0.31.7,14316    ,224.0.32.7,15316  
'*317,224.0.31.8,14317    ,224.0.32.8,15317  
*318,224.0.31.9,14318    ,224.0.32.9,15318  
'*319,224.0.31.10,14319   ,224.0.32.10,15319 
*320,224.0.31.11,14320   ,224.0.32.11,15320 
*321,224.0.31.12,14321   ,224.0.32.12,15321 
*340,224.0.31.64,14340   ,224.0.32.64,15340 
*341,224.0.31.65,14341   ,224.0.32.65,15341 
*342,224.0.31.66,14342   ,224.0.32.66,15342 
*343,224.0.31.67,14343   ,224.0.32.67,15343 
*344,224.0.31.68,14344   ,224.0.32.68,15344 
*345,224.0.31.69,14345   ,224.0.32.69,15345 
*346,224.0.31.70,14346   ,224.0.32.70,15346 
*360,224.0.31.192,14360  ,224.0.32.192,15360
*361,224.0.31.193,14361  ,224.0.32.193,15361
'*380,224.0.31.128,14380  ,224.0.32.128,15380
'*381,224.0.31.129,14381  ,224.0.32.129,15381
*382,224.0.31.130,14382  ,224.0.32.130,15382
*383,224.0.31.131,14383  ,224.0.32.131,15383
*384,224.0.31.132,14384  ,224.0.32.132,15384
'*385,224.0.31.133,14385  ,224.0.32.133,15385
*386,224.0.31.134,14386  ,224.0.32.134,15386
'*387,224.0.31.135,14387  ,224.0.32.135,15387
'*410,224.0.33.1,14410    ,224.0.34.1,15410  
'*430,224.0.33.64,14430   ,224.0.34.64,15430 
'*431,224.0.33.65,14431   ,224.0.34.65,15431 
'*440,224.0.33.80,14440   ,224.0.34.80,15440 
'*441,224.0.33.81,14441   ,224.0.34.81,15441 
'*450,224.0.33.96,14450   ,224.0.34.96,15450 
'*460,224.0.33.112,14460  ,224.0.34.112,15460
'*461,224.0.33.113,14461  ,224.0.34.113,15461
那麼可以設定
Pars_10fut 內容為
/CfgFile URDS-ByList-SBE.cfg /Channel 310,312,314,316,318,382,386,384,360,320,340,346,342,344
Pars_10opt 內容為
/CfgFile URDS-ByList-SBE.cfg /Channel 341,343,345,311,315,321,383,361

也可以用兩個分別的清單檔案來完成

URDS-ByList-SBEfut.cfg

<enable>
*310,224.0.31.1,14310    ,224.0.32.1,15310  
*312,224.0.31.3,14312    ,224.0.32.3,15312  
*314,224.0.31.5,14314    ,224.0.32.5,15314  
*316,224.0.31.7,14316    ,224.0.32.7,15316  
*318,224.0.31.9,14318    ,224.0.32.9,15318  
*382,224.0.31.130,14382  ,224.0.32.130,15382
*386,224.0.31.134,14386  ,224.0.32.134,15386
*384,224.0.31.132,14384  ,224.0.32.132,15384
*360,224.0.31.192,14360  ,224.0.32.192,15360
*320,224.0.31.11,14320   ,224.0.32.11,15320 
*340,224.0.31.64,14340   ,224.0.32.64,15340 
*346,224.0.31.70,14346   ,224.0.32.70,15346 
*342,224.0.31.66,14342   ,224.0.32.66,15342 
*344,224.0.31.68,14344   ,224.0.32.68,15344 

URDS-ByList-SBEopt.cfg

<enable>
*341,224.0.31.65,14341   ,224.0.32.65,15341 
*343,224.0.31.67,14343   ,224.0.32.67,15343 
*345,224.0.31.69,14345   ,224.0.32.69,15345 
*311,224.0.31.2,14311    ,224.0.32.2,15311  
*315,224.0.31.6,14315    ,224.0.32.6,15315  
*321,224.0.31.12,14321   ,224.0.32.12,15321 
*383,224.0.31.131,14383  ,224.0.32.131,15383
*361,224.0.31.193,14361  ,224.0.32.193,15361
那麼則設定清單檔案即可
Pars_10fut 內容為
/CfgFile URDS-ByList-SBEfut.cfg
Pars_10opt 內容為
/CfgFile URDS-ByList-SBEopt.cfg



多重數據庫( Multi-DB )說明

張貼者:2014年6月23日 下午9:29Wei-Xiuang Wang   [ 已更新 2014年8月7日 下午8:24 ]


初接觸DTS系統, 經常會對註冊數據庫的設定碼(如: 0x0020=PATS )感到疑惑,
因為目前大多數應用都是單一數據庫, 所以感覺就是全部資料都收下來為何還需要設定,
而實際上DTS支援多重數據庫功能, 設定註冊碼時可以選擇其中部分所需的數據庫即可,
例如: 0x1001=CME,0x1002=CBOT 可註冊兩個數據庫, 同理視需求可以註冊更多,
前提是DTS上須有所要的數據庫提供, 先前只有陸股行情會以 0x0001 與 0x0002
同時提供上證(show2003.dbf)與深證(sjshq.dbf)兩個行情數據庫,
其他FTDC,PatsRaw/Emu等系列都只提供單一行情數據庫而已~
現在 PatsRaw/Emu 也開始提供多重行情數據庫功能應用了!


PatsRaw/Emu系列的Tag #1欄位, 為以交易所與商品代碼組成可作為全局性唯一的商品Key
使用多重數據庫模式時, 便是以Tag #1的 '|' 之後的商品來源作為群組識別碼, 若不啟用多重功能,
所有商品都會在原本的單一數據庫中, 該預設數據庫於多重功能啟動時其群組識別碼為 '$Default',
當有指定不同之DbfId來作為某群組識別碼的服務數據庫時,
符合的商品將被抽離預設數據庫而篩選到新的數據庫代碼中提供服務

圖中為PatsEmu-CME的設置範例, 透過參數 /GroupMap 指定設定檔

設定檔內容

'for Option by key as "Contract|Exchange" , the others using "Exchange" as key
'Example:
'    "CME_CBT",0xA100
'    "TOCOM",0xA200
'    "GOLD|TOCOM",0xA201

"HFOCX",0xCA00    'Gcbullion Test
"XCME=HW",0x8000
"XNYM=CL",0x8100
"XNYM=NG",0x8200


此案例中, 原本單一數據庫共有7927個商品行情, 將HW,CL,NG三組期貨抽離後只剩3789個
其中期貨HW本身就有3498個商品接近半數~

下游的應用則可視需求給予註冊碼

只收CL商品
0x8100=輕原油

收CL和NG兩組商品
0x8100=CL輕原油,0x8200=NG天然氣

收其他未分群商品全部
0x0022=MyCME

將所有數據庫接收下
0x0022=A,0x8000=A0,0x8100=A1,0x8200=A2

前列註冊碼的示範 與熟悉的 0x0020=PATS 或 0x0021=RMDS 或 0x0022=CME 是同樣的意義
Code=Name 的 Code 是指上游的資料庫代碼 如 0x0020 , 0x0021
而Name的部分則是供讀取數據庫的應用端口可以識別的代碼, 依本身應用需求可自行任意命名


關於 類視頻/逐筆行情 之 設定

張貼者:2014年5月16日 上午7:43Wei-Xiuang Wang   [ 已更新 2014年5月16日 上午8:11 ]


PatsEmu <-- UniDbf-TS

這一層 UniDbf-TS 如果設 /tick 代表一律逐筆
沒加則看在Server端的IP為何 127.*.*.* , 10.*.*.* , 192.168.*.* 都會自動變逐筆
所以想要啟動類視頻必須(以下兩條件同時成立)
1. 不要設 /tick
2. IP用前面說的那三段之外的其他IP
這樣的邏輯在於所有資訊源都希望是逐筆的,
但Internet上會自動預設開類視頻以節省頻寬增加即時性,
但如果是需求上是只能經過Internet時,仍想要逐筆,則透過/tick來達成設定確認

UniDbf-TS <-- TSHS

這一層 TSHS 預設都是逐筆的(並且與IP完全無關),
因為所有行情都會希望資料是一致性的
但如有特殊原因真的需要類視頻,則透過/notick的方式來達成設定確認

TSHS <-- TSHS-GW

這一層則是把完全相同,一模一樣的TSHS資料延伸到其他地點服務
所以不會有任何 類視頻/逐筆行情 的設定功能

PatsEmu 看連線的 User# 欄位, 有 '*' 號代表逐筆即時的Tick模式連線, 沒有'*'號則是類視頻省頻寬的行情即時模式
所以圖中 UniDbf-SB 設定的連線IP是 172.* 的方式, 但參數沒加 /tick 就會變成類視頻

UniDbf-SB上看連線 User# 欄位, 一樣由 '*' 就可知道 TSHS是逐筆Tick即時模式
但如果UniDbf-SB本身對上游就已經是設成跑類視頻的方式,那麼UniDbf-SB這層以下都會受影響


TSHS合流程式部署示意(for PATS Tags)

張貼者:2014年5月6日 上午3:52Wei-Xiuang Wang   [ 已更新 2014年5月15日 下午8:31 ]


透過TSHS可結合不同的分流資訊甚至與不同來源的資訊作合流匯整

如下圖部署示意中產生兩種合流後的服務來源 (A)-TSHS 與 (B)-DTS


1. GMDS本身以DTS(DBF Transaction Server)服務為主作複製或延伸, 提供高效率資訊同步架構建置,
    DTS可想成是一個Multi Sheets EXCE Table的 Server/Client RTC同步架構, 可參考 DbfTS

2. 被合流的來源可為 PatsRaw 或 PatsEmu已支援之其他導入架構, 可參考 行情程式說明

3. TSHS (Tag Sream History Server), 具備跨平台Client應用, 採Tag編碼簡易協定作為通訊,
    提供有效率的不漏不中斷之服務, 同時可滿足各種系統重啟或Recover的需求, 可參考 TSHS

4. PATS Tags為依據PATS的報價結構定義而成, 可參考 DbfTC API Tag List for PATSFeedServer預設欄位介紹(含特殊欄位規則說明)

5. 欄位Tag #1為統一的全域編碼Symbol, 也就是最後Client端處理數據時會看到的Key(SymbolName或ItemName)

GMDS-PATS Symbol編碼方式

YYMM + contract name + ‘|’ + exchange name
表示期貨商品, 例如:
CME,CMX HG,APR11 編碼為 1104CMX HG|CME
eCBOT,MINI GOLD,AUG12 編碼為 1208MINI GOLD|eCBOT

'@' + contract date + '@' + contract name + '|' + exchange name
表示指數/現貨商品, 例如:
SGX,TW IDX,TW 編碼為 @TW@TW IDX|SGX
SGX,SG IDX,SG 編碼為 @SG@SG IDX|SGX

'#' + YYMMYYMM + '#' + contract name + '|' + exchange name
表示複合商品, 例如:
SGX,TW,JUN11|JUN13 編碼為 #11061306#TW|SGX
SGX,TW,FEB11|DEC12 編碼為 #11021212#TW|SGX

YYMM + contract name + '(' + 'P/C' + Strike + ')' + ‘|’ + exchange name
表示期貨選擇權商品, 例如:
XCME,6E,J3 C1280 編碼為 13046E(C1280)|XCME

其餘未能正確辨識類型的商品皆以指數/現貨的方式編碼
(例如尚未解釋選擇權的版本,看到的選擇權商品編碼是'@'開頭的方式)

6. 使用TSHS-UniDbf-PATS-OBG66作為DTS/TSHS服務轉換,以新的OBG 66格式取代舊的01格式,可提供完整的所有行情資訊欄位供應用
    若使用舊版TSHS-UniDbf-PATS-OBG則只能傳遞原OBG格式能傳遞的資訊+已擴充的66格式欄位(未平倉,隱含買賣價1,2檔)

7. TSHS-UniDbf-PATS-OBG66於未使用Log的運作機制下,有狀態回補機制,故分流下無其他應用需求可選擇不使用Log
    若各分流在每日特定時間點需留存一份完整資訊歷程Log,可透過新的參數指令完成即可, 參考 TSHS /Refresh 參數

8. 在設置TSHS連結DTS時使用的資料來源指定參數, 例如 /Data 0x0021=RMDS
    其中的 'RMDS' 就是最後Client端處理數據時會看到的 DBName,
    不同來源可以設定不同名稱作為識別, 也可以都用相同的名稱作統一代碼, 可視需求調整

9. 合流(B) 可提供 DbfTCdll.dll (DBF Transaction Client API) 建立對DTS的連線取得完整來源資訊, 可參考 DbfTC API連線範例

10. 合流(B) 可透過 fakePATS API模式, 可直接將現行的PATS's API行情程式移轉改連DTS取得資訊, 可參考 fakePATS API
    基於原本的PATS's API行情程式應該都有代碼轉換與價格倍率調整功能, 大致上應該是調整設定即能完成轉移,
    若原系統確實缺乏前述功能,可於fakePATS中加入對應功能調整,或於6.中進行代碼轉換另於合流(B)中作倍率調整設定.
    此方式缺點為僅能透過原本PATS定義的報價結構獲取對應資訊, 來源所提供的其他實用數據欄位須透過一定的設計修改配合後才能應用

11. 合流(A) 可提供 PktEvCdll.dll (Packet Event Client API) 建立對TSHS的連線取得完整來源資訊, 可參考 PktEvC API連線範例 (OBG66格式)

12. 合流(A)中提供的是的RawData格式, 以此架構輸出的是 OBG66 格式, 參考 PktEvC API處理RawData

13. 另可於合流(B)上建置TSHS-UniDbf 提供 合流(C)-TSHS 之服務, 則同 11.合流(A)之服務輸出處理方式, 但輸出為TSHS的Tag-Stream格式

14. 以合流(B)再生源作為整流過的頂源DTS, 因有6.與10.的客製性功能, 這樣的架構可以讓不同資訊源的相同商品最後都提供統一相同的輸出

15. 第14.的說明也就是異源備源的可行性, 在經過一定的調整後確實可以在原PATS行情系統不用修改的狀態下, 完成以路透資訊源直接替代的目的

16. 不作代碼轉換, 單純合流再生的架構方式




Sync-Working 打造最穩定的程式運作

張貼者:2014年4月8日 下午8:07Wei-Xiuang Wang   [ 已更新 2014年5月6日 下午11:53 ]


其實只是一個概念


或許經常使用Multi-Thread設計程式時覺得很方便,
但是系統只要稍為複雜, 很容易因為不容易注意到的疏忽造成資料會錯誤甚至程式不穩定,
因此很多專家的結論是, 儘可能Multi-Thread只在有等待需求的的必要性下來使用,

基於此概念, 若將所有會互相影響的程式功能安置於同一執行緒中運作,
自然而然就成為一個易於持續開發和維護的程式架構囉!

像是中斷(IRQ)或說插斷也都是相同的概念,
現在很多驅動程式不穩定都是因為誤以為Multi-Thread是改善效能的藥方而濫用,可見一般!

以fakePATS的應用為例, Sync-Working相關程式碼內容:




Super Tick Manager 簡介

張貼者:2014年3月29日 上午4:52Wei-Xiuang Wang   [ 已更新 2014年3月29日 上午5:16 ]


首先瞭解:
Index Page Mapping System 是一個架構於萬用動態資料表之上,專門為DB-like系統設計的高效率技術引擎,

而 STM 是 Super Tick Manager 的縮寫,
基於 Index Page Mapping System 作為管理Block的方式延伸為處理Tick的高效率巨量處理引擎

一般Tick的概念發生在商品有交易時的價量逐筆紀錄, 如果有像STM如此高效率又容易使用的引擎,
不僅處理行情系統甚為容易, 也能作為一種3D結構管理應用

可以用EXCEL來想像這樣的架構:
橫向的列 每一欄是一個群, 每個群是一種相同的結構定義
直向的行 每一欄是一個商品, 每個商品於每個群都有一個對應(多重結構)
行列上的每格皆有一個Tick Log, 這樣就形成了一個3D架構,
說是Tick Log, 其實也是一個索引器, 可以作為一系列同構商品的索引管理
雲端核心常說的Map/Reduce說再多都沒用, 用STM就對了!

簡化以API為例:

隨意設計一個結構來用用看:

範例程式碼:

範例程式輸出結果:




fakePATS API : 無痛昇級PATS架構介接GMDS

張貼者:2013年8月2日 上午12:01Wei-Xiuang Wang   [ 已更新 2014年4月23日 下午9:01 ]


簡介:
fakePATS API 可用來替代原本基於PATS's API開發的資訊接收程式,
透過提供與原本PATS's API相同的操作函式,
程式只須將原本的PATS's API改用fakePATS API替代,
無須修改程式碼便能直接改收GMDS的PatsEmu系列DbfTS架構下提供之資訊服務,
立即昇級系統改提供GMDS之路透或各種DMA來源數據!

作為PATS行情供應商:
fakePATS API 本身是透過 DbfTCdll.dll 連接DbfTS, 當來源Tag是PATS-Base系列時
便能模擬原本PATS's API所提供之功能提供資料就像是接到PATS Server一樣

以GMDS使用PATS's API導入資訊之PatsRaw程式作為示範說明

原設定檔內容

PATSini.cfg

//-------------------------------------------------------------
PATSDllFile=PATSAPI.dll
PATSLogonReport=N
PATSLogonReset=Y
PATSInitReset=TRUE
PATSEnvType=ptTestClient
PATSPassword=PRES2345
PATSUserID=TEST4_PF
PATSPriceAddress=203.120.20.221:20000
PATSHostAddress=202.172.185.10:18030
PATSLicenseKey=TEST4
PATSApplicationID=TEST4
PATSApplicVersion=1.0
//-------------------------------------------------------------

經以下步驟作設定調整即能改接GMDS

1. 將使用之 PATSAPI.dll 改用 fakePATS.dll 取代
(不能透過設定變更的系統, 可直接把檔案取代掉)

2. PriceAddress 與 HostAddress 擇一設定即可, 改連PatsEmu/UniDbfTS
(由於GMDS僅須一個連線, 兩個都設一樣或只設定一個fakePATS便會正確連結)

3. 透過LicenseKey用來指定註冊之DataSet

4. ApplicationID與ApplicVersion則會當作是連線GMDS之User代碼

程式完全不用修改, 原本連接PATS的系統 變成介接GMDS了!

新設定檔內容

PATSini.cfg

//-------------------------------------------------------------
PATSDllFile=fakePATS.dll
PATSLogonReport=N
PATSLogonReset=Y
PATSInitReset=TRUE
PATSEnvType=ptTestClient
PATSPassword=PRES2345
PATSUserID=TEST4_PF
PATSPriceAddress=192.168.1.117:31213
PATSHostAddress=192.168.1.117:31213
PATSLicenseKey=0x0022=PATS
PATSApplicationID=TEST4
PATSApplicVersion=1.0
//-------------------------------------------------------------

成功獲得GMDS系統(DMA: PatsEmu-CME)之商品資訊
(透過PATS的Callback DataDLCompelete, 抓取所有商品進行訂閱)

於PatsEmu-CME可看到連線訊息

一般正規的PATS's API應用程式, 透過以下API完成資訊行情接收的皆能不用修改程式碼, 直接套用

已模擬的Callback (未模擬的的會於Register時回應 ptErrFalse)

 VOID WINAPI HostLinkStateChange(LinkStateStructPtr data);
 VOID WINAPI PriceLinkStateChange(LinkStateStructPtr data);
 VOID WINAPI DataDLComplete();
 VOID WINAPI PriceUpdate(PriceUpdStructPtr PriceUpdate);
 VOID WINAPI ContractAdded(ContractUpdStructPtr data);
 VOID WINAPI Ticker(TickerUpdStructPtr data);

已模擬的API (未模擬的會於呼叫時回應 ptErrFalse, 或選用 ptSuccess )

 ptRegisterCallback(INT callbackID, ProcAddr CBackProc)
 ptRegisterLinkStateCallback(INT callbackID, LinkProcAddr CBackProc)
 ptRegisterPriceCallback(INT callbackID, PriceProcAddr CBackProc)
 ptRegisterContractCallback(INT callbackID, ContractProcAddr CBackProc)
 ptRegisterTickerCallback(INT callbackID, TickerUpdateProcAddr CBackProc)
 ptRegisterSettlementCallback(INT callbackID, SettlementProcAddr CBackProc)
 ptCountContracts(PINT Count)
 ptGetContract(INT Index, ContractStructPtr Contract)
 ptGetContractByName(ExchNamePtr ExchangeName, ConNamePtr ContractName, ConDatePtr ContractDate, ContractStructPtr Contract)
 ptInitialise(CHAR Env, LPCSTR  APIversion, LPCSTR  ApplicID, LPCSTR  ApplicVersion, LPCSTR License, boolean InitReset)
 ptReady( )
 ptDisconnect( )
 ptSetHostAddress(LPCSTR  IPaddress, LPCSTR IPSocket)
 ptSetPriceAddress(LPCSTR  IPaddress, LPCSTR IPSocket)
 ptSubscribePrice(ExchNamePtr ExchangeName, ConNamePtr ContractName, ConDatePtr ContractDate)
 ptGetPriceForContract(ExchNamePtr ExchangeName, ConNamePtr ContractName, ConDatePtr ContractDate, PriceStructPtr CurrentPrice)

 ptLogOn(LogonStructPtr LogonDetails)
 ptGetLogonStatus(LogonStatusStructPtr LogonStatus)




如同正常的PATS's API應用方式
1. 正常必要的CB設定: HostLinkStateChange, DataDLComplete, PriceUpdate (或 Ticker )
2. 設立連結源: ptSetHostAddress
3. 呼叫 ptReady 開始運行
4. 於 HostLinkStateChange 中被通知已連線, 呼叫 ptLogOn 進行登入動作
5. 於 DataDLComplete 中透過 ptCountContracts 與 ptGetContract 取得商品序列, 同時以 ptSubscribePrice 進行訂閱
6. 於 PriceUpdate , Ticker 通知行情時, 呼叫 ptGetPriceForContract 取得報價結構抓取所需數據

自主開發
提供授權客戶程式源碼, 可自行調整與擴充維護fakePATS API功能,
交易的部分若有合適的配合系統當然也能改用自己的交易平台來取代



KGQ與PatsEmu比較與說明

張貼者:2013年4月25日 下午10:11Wei-Xiuang Wang   [ 已更新 2017年5月17日 下午8:22 ]


開發依據

■KGQ是以ComStock ICL為原始資訊源並根據韓國WINIX HTS POOP欄位作為Tag標記定義為基礎設計開發

■PatsEmu則是依據PATS商品資訊完整結構欄位作為Tag標記定義為基礎設計開發相容多樣原始資訊源

第一層DTS服務

■KGQ : 建置到CS_Top開始具備DTS服務功能
ComStock ICL (Single)<-- TcpRDS <-- CS_Top
ComStock ICL (Group)<-- TcpRDS (Group by 1-1)  <-- RDGWP <-- CS_Top

■PatsEmu : PatsEmu/PatsRaw本身即開始提供DTS服務
PATS <-- PatsRaw
路透RMDS <-- RMDS-Proxy <-- PatsEmu-RMDS
CME DMA <-- URDS <-- TSHS-TfsRaw <-- PatsEmu-CME
OBG(五檔/十檔/66) <-- TcpRDS <-- TSHS-TfsRaw <-- PatsEmu-OBG

KGQ以單一市場相同開收盤時間為主要服務方式

■以CSDS開始提供KGQ-Client API連線服務, 提供Windows/Unix/Linux之各平台KGQ-Client連線元件接收資訊
CS_Top <-- CSDS

PatsEmu以商品皆具各自獨立特性提供多樣化國際市場之商品資訊服務

■以TSHS-UniDbf開始提供易於跨平台的Packet Event System之Client API連線服務,採非結構性的Tag-Stream方式提供資訊
PatsEmu/PatsRaw <-- TSHS-UniDbf
■PATS to OBG轉碼
PatsEmu/PatsRaw <-- TSHS-UniDbf-PATS-OBG

擴充與延伸服務的方式

■KGQ : CSDS可透過KGQ-DS延伸服務擴充服務主機
CSDS <-- KGQ-DS
KGQ-DS(A) <-- KGQ-DS(B)

■PatsEmu : 基於TSHS服務架構, 透過TSHS-GateWay即可延伸服務
任意TSHS <-- TSHS-GateWay

■DTS : DTS服務架構本身有多樣化擴充與延伸服務的方式

資訊合流

■KGQ : 無

■PatsEmu : 機於TSHS服務架構, 透過TSHS-GWMS即可作資訊合流
多個不同TSHS <-- TSHS-GWMS

回補功能

■KGQ : CSDS/KGQ-DS提供日期+序號歷程回補

■PatsEmu : TSHS提供時段+序號歷程回補

■DTS : 最新狀態回補

交叉應用

■KGQ
以DTS為基礎建置TSHS便能提供現行使用TSHS資訊為來源的連線模組接收資訊(Tag代碼為KGQ定義)

■PatsEmu
TSHS亦提供KGQ-Client連線模組連線模式, 以其RawData模式處理即可(Tag代碼為PATS定義)

轉碼支援

可透過FeedServer/API設計規劃轉碼應用, 針對同一企業達到統一輸出規格的需求(包括Tag代碼相同),
已支援DTS的部分可參考 Tag-Tables

介接資料

這邊提供最短的資料介接點說明,
具備擴充與延伸服務的架構可視架構與需求導入對應的界接程式如 RDGW, DbfTS-SB, TSHS-GateWay ...

■有TFS的介接點, 介接 RDGWP 即可接收原始來源格式資料(KGQ-Client專有的RawData即時接收模式,無回補功能)
TcpRDS <-- RDGWP <-- KGQ-Client
URDS <-- RDGWP <-- KGQ-Client
TcpRDS , URDS , RDGW <-- RDGWP <-- KGQ-Client

■有TFS的介接點, 介接 TSHS-TfsRaw 即可接收原始來源格式資料(TSHS是具回補的功能的串流模式)
TcpRDS <-- TSHS-TfsRaw <-- KGQ-Client , PktEvcAPI
URDS <-- TSHS-TfsRaw <-- KGQ-Client , PktEvcAPI

■以RDGW橋接延伸TFS的資訊流服務
TcpRDS , URDS , RDGW <-- RDGW <-- TSHS-TfsRaw <-- KGQ-Client , PktEvcAPI

■有DbfTS的介接點, 介接 TSHS-UniDbf 即可接收 Tag-Stream 格式資料
PatsEmu , PatsRaw <-- TSHS-UniDbf <-- KGQ-Client , PktEvcAPI (Tag by PATS)
CS_Top , CSDS , KGQ-DS <-- TSHS-UniDbf <-- KGQ-Client , PktEvcAPI (Tag by HTS POOP)

■以DbfTS-SB橋接延伸DbfTS的資訊流服務
PatsEmu , PatsRaw , CS_Top , CSDS , KGQ-DS , DbfTS-SB <-- DbfTS-SB <-- TSHS-UniDbf <-- KGQ-Client , PktEvcAPI (Tag by Top-Source)

■以TSHS-GW橋接延伸TSHS的資訊流服務
對應資料源 <-- TSHS(UniDbf,TfsRaw,RMDS) , TSHS-GateWay <-- TSHS-GateWay <-- KGQ-Client , PktEvcAPI (Tag by Top-Source)




CMEpick_BidAsk 工具程式說明

張貼者:2013年4月20日 下午5:09Wei-Xiuang Wang   [ 已更新 2013年4月20日 下午5:11 ]


CMEpick_BidAsk 工具程式說明

功能: 用來分析RawData中指定商品的所有買賣價行情資料
         (包括一般深度行情與隱含買賣價以及Exchange Best最佳委託行情)

環境: RawData在GMDS03/04上,
         CMEpick_BidAsk.exe 執行須有 PktEvCdll.dll 這個API,
        透過連線 TSHS-TfsRaw 取得交易所RawData log進行分析

執行方式: 直接Console執行 CMEpick_BidAsk.exe 會有說明

Usage:
        CMEpick_BidAsk host_address request_list [SecurityID]
Examp:
        CMEpick_BidAsk 127.0.0.1:8217 YYYYMMDDHH0000,00000000 196436

參數:
host_address : TSHS-TfsRaw提供的服務來源
request_list : TSHS的資料要求開始時段與序號
SecurityID : 交易所商品代碼, 可於 PatsEmu-CME 產生的 Security檔案中查得

輸出到檔案:
用Console的重新導向 '>' 指定到要輸出的檔案
例如
CMEpick_BidAsk 127.0.0.1:8217 YYYYMMDDHH0000,00000000 196436 > lll.txt
       
執行顯示畫面與輸出文字檔內容

EntryTime 為交易所提供之GMT時間
程式同一時間只顯示一次, 同時附上TSHS的時段序號, 便於重複操作時可透過此代碼進行要求

最前面
[ ] 代表一般深度行情
[K] 代表隱含買賣價行情
[C] 代表Exchange Best的最佳委託行情

一般深度行情與隱含買賣價行情, 會將買賣分別顯示在左右兩邊對齊易於辨識

指令有
New - New (Add) , to create/insert a new price at a specified price level (tag 279 MDUpdateAction=0)
Chg - Change , change quantity for a price at a specified price level (tag 279 MDUpdateAction=1)
Del - Delete , remove a price at a specified price level (tag 279 MDUpdateAction=2)
Ovl - Overlay (tag 279 MDUpdateAction=5)

左邊是買價 Bid(檔次) EntryPx[價/量]
右邊是賣價 Ask(檔次) EntryPx[價/量]

Exchange Best

EntryType[0:Bid 1:Offer] EntryPx[價] EntrySize[量] PriceLevel[檔次] UpdateAction[指令]

PatsEmu-CME的Security檔案內容(用文字編輯器看)如
28110,"EPZ","KC","EPZU1","XCME","FFCXSX","4","20110919"
86193,"6L","6L","6LX8","XCME","FFCXSX","4","20181031"
184669,"6Z","6Z","6ZH2","XCME","FFCXSX","4","20120319"
17465,"6B","6B","6BM1","XCME","FFCXSX","4","20110613"
85102,"FXD","DX","FXDM1","XCME","FFCXSX","4","20110613"
34135,"RMB","RM","RMBQ1","XCME","FFCXSX","4","20110816"
依序為: SecurityID,SecurityGroup,
Symbol,SecurityDesc,SecurityExchange,CFICode,UnderlyingProduct,LastTradeDate
透過熟知的 SecurityDesc 搜尋檔案, 取前面的 SecurityID 代到 CMEpick_BidAsk 程式參數中使用即可


浮點與分數對照表

張貼者:2013年3月26日 上午5:11Wei-Xiuang Wang   [ 已更新 2013年3月28日 下午11:55 ]



浮點與分數對照表

  分數     分數   CME三位  浮點六位   小數           
'00.00 ,   0/128 , 0.000 , 0.000000 , 0
'00.25 ,   1/128 , 0.008 , 0.007813 , 0.0078125
'00.50 ,   2/128 , 0.016 , 0.015625 , 0.015625
'00.75 ,   3/128 , 0.023 , 0.023438 , 0.0234375
'01.00 ,   4/128 , 0.031 , 0.031250 , 0.03125
'01.25 ,   5/128 , 0.039 , 0.039063 , 0.0390625
'01.50 ,   6/128 , 0.047 , 0.046875 , 0.046875
'01.75 ,   7/128 , 0.055 , 0.054688 , 0.0546875
'02.00 ,   8/128 , 0.063 , 0.062500 , 0.0625
'02.25 ,   9/128 , 0.070 , 0.070313 , 0.0703125
'02.50 ,  10/128 , 0.078 , 0.078125 , 0.078125
'02.75 ,  11/128 , 0.086 , 0.085938 , 0.0859375
'03.00 ,  12/128 , 0.094 , 0.093750 , 0.09375
'03.25 ,  13/128 , 0.102 , 0.101563 , 0.101563
'03.50 ,  14/128 , 0.109 , 0.109375 , 0.109375
'03.75 ,  15/128 , 0.117 , 0.117188 , 0.117188
'04.00 ,  16/128 , 0.125 , 0.125000 , 0.125
'04.25 ,  17/128 , 0.133 , 0.132813 , 0.132813
'04.50 ,  18/128 , 0.141 , 0.140625 , 0.140625
'04.75 ,  19/128 , 0.148 , 0.148438 , 0.148438
'05.00 ,  20/128 , 0.156 , 0.156250 , 0.15625
'05.25 ,  21/128 , 0.164 , 0.164063 , 0.164063
'05.50 ,  22/128 , 0.172 , 0.171875 , 0.171875
'05.75 ,  23/128 , 0.180 , 0.179688 , 0.179688
'06.00 ,  24/128 , 0.188 , 0.187500 , 0.1875
'06.25 ,  25/128 , 0.195 , 0.195313 , 0.195313
'06.50 ,  26/128 , 0.203 , 0.203125 , 0.203125
'06.75 ,  27/128 , 0.211 , 0.210938 , 0.210938
'07.00 ,  28/128 , 0.219 , 0.218750 , 0.21875
'07.25 ,  29/128 , 0.227 , 0.226563 , 0.226563
'07.50 ,  30/128 , 0.234 , 0.234375 , 0.234375
'07.75 ,  31/128 , 0.242 , 0.242188 , 0.242188
'08.00 ,  32/128 , 0.250 , 0.250000 , 0.25
'08.25 ,  33/128 , 0.258 , 0.257813 , 0.257813
'08.50 ,  34/128 , 0.266 , 0.265625 , 0.265625
'08.75 ,  35/128 , 0.273 , 0.273438 , 0.273438
'09.00 ,  36/128 , 0.281 , 0.281250 , 0.28125
'09.25 ,  37/128 , 0.289 , 0.289063 , 0.289063
'09.50 ,  38/128 , 0.297 , 0.296875 , 0.296875
'09.75 ,  39/128 , 0.305 , 0.304688 , 0.304688
'10.00 ,  40/128 , 0.313 , 0.312500 , 0.3125
'10.25 ,  41/128 , 0.320 , 0.320313 , 0.320313
'10.50 ,  42/128 , 0.328 , 0.328125 , 0.328125
'10.75 ,  43/128 , 0.336 , 0.335938 , 0.335938
'11.00 ,  44/128 , 0.344 , 0.343750 , 0.34375
'11.25 ,  45/128 , 0.352 , 0.351563 , 0.351563
'11.50 ,  46/128 , 0.359 , 0.359375 , 0.359375
'11.75 ,  47/128 , 0.367 , 0.367188 , 0.367188
'12.00 ,  48/128 , 0.375 , 0.375000 , 0.375
'12.25 ,  49/128 , 0.383 , 0.382813 , 0.382813
'12.50 ,  50/128 , 0.391 , 0.390625 , 0.390625
'12.75 ,  51/128 , 0.398 , 0.398438 , 0.398438
'13.00 ,  52/128 , 0.406 , 0.406250 , 0.40625
'13.25 ,  53/128 , 0.414 , 0.414063 , 0.414063
'13.50 ,  54/128 , 0.422 , 0.421875 , 0.421875
'13.75 ,  55/128 , 0.430 , 0.429688 , 0.429688
'14.00 ,  56/128 , 0.438 , 0.437500 , 0.4375
'14.25 ,  57/128 , 0.445 , 0.445313 , 0.445313
'14.50 ,  58/128 , 0.453 , 0.453125 , 0.453125
'14.75 ,  59/128 , 0.461 , 0.460938 , 0.460938
'15.00 ,  60/128 , 0.469 , 0.468750 , 0.46875
'15.25 ,  61/128 , 0.477 , 0.476563 , 0.476563
'15.50 ,  62/128 , 0.484 , 0.484375 , 0.484375
'15.75 ,  63/128 , 0.492 , 0.492188 , 0.492188
'16.00 ,  64/128 , 0.500 , 0.500000 , 0.5
'16.25 ,  65/128 , 0.508 , 0.507813 , 0.507813
'16.50 ,  66/128 , 0.516 , 0.515625 , 0.515625
'16.75 ,  67/128 , 0.523 , 0.523438 , 0.523438
'17.00 ,  68/128 , 0.531 , 0.531250 , 0.53125
'17.25 ,  69/128 , 0.539 , 0.539063 , 0.539063
'17.50 ,  70/128 , 0.547 , 0.546875 , 0.546875
'17.75 ,  71/128 , 0.555 , 0.554688 , 0.554688
'18.00 ,  72/128 , 0.563 , 0.562500 , 0.5625
'18.25 ,  73/128 , 0.570 , 0.570313 , 0.570313
'18.50 ,  74/128 , 0.578 , 0.578125 , 0.578125
'18.75 ,  75/128 , 0.586 , 0.585938 , 0.585938
'19.00 ,  76/128 , 0.594 , 0.593750 , 0.59375
'19.25 ,  77/128 , 0.602 , 0.601563 , 0.601563
'19.50 ,  78/128 , 0.609 , 0.609375 , 0.609375
'19.75 ,  79/128 , 0.617 , 0.617188 , 0.617188
'20.00 ,  80/128 , 0.625 , 0.625000 , 0.625
'20.25 ,  81/128 , 0.633 , 0.632813 , 0.632813
'20.50 ,  82/128 , 0.641 , 0.640625 , 0.640625
'20.75 ,  83/128 , 0.648 , 0.648438 , 0.648438
'21.00 ,  84/128 , 0.656 , 0.656250 , 0.65625
'21.25 ,  85/128 , 0.664 , 0.664063 , 0.664063
'21.50 ,  86/128 , 0.672 , 0.671875 , 0.671875
'21.75 ,  87/128 , 0.680 , 0.679688 , 0.679688
'22.00 ,  88/128 , 0.688 , 0.687500 , 0.6875
'22.25 ,  89/128 , 0.695 , 0.695313 , 0.695313
'22.50 ,  90/128 , 0.703 , 0.703125 , 0.703125
'22.75 ,  91/128 , 0.711 , 0.710938 , 0.710938
'23.00 ,  92/128 , 0.719 , 0.718750 , 0.71875
'23.25 ,  93/128 , 0.727 , 0.726563 , 0.726563
'23.50 ,  94/128 , 0.734 , 0.734375 , 0.734375
'23.75 ,  95/128 , 0.742 , 0.742188 , 0.742188
'24.00 ,  96/128 , 0.750 , 0.750000 , 0.75
'24.25 ,  97/128 , 0.758 , 0.757813 , 0.757813
'24.50 ,  98/128 , 0.766 , 0.765625 , 0.765625
'24.75 ,  99/128 , 0.773 , 0.773438 , 0.773438
'25.00 , 100/128 , 0.781 , 0.781250 , 0.78125
'25.25 , 101/128 , 0.789 , 0.789063 , 0.789063
'25.50 , 102/128 , 0.797 , 0.796875 , 0.796875
'25.75 , 103/128 , 0.805 , 0.804688 , 0.804688
'26.00 , 104/128 , 0.813 , 0.812500 , 0.8125
'26.25 , 105/128 , 0.820 , 0.820313 , 0.820313
'26.50 , 106/128 , 0.828 , 0.828125 , 0.828125
'26.75 , 107/128 , 0.836 , 0.835938 , 0.835938
'27.00 , 108/128 , 0.844 , 0.843750 , 0.84375
'27.25 , 109/128 , 0.852 , 0.851563 , 0.851563
'27.50 , 110/128 , 0.859 , 0.859375 , 0.859375
'27.75 , 111/128 , 0.867 , 0.867188 , 0.867188
'28.00 , 112/128 , 0.875 , 0.875000 , 0.875
'28.25 , 113/128 , 0.883 , 0.882813 , 0.882813
'28.50 , 114/128 , 0.891 , 0.890625 , 0.890625
'28.75 , 115/128 , 0.898 , 0.898438 , 0.898438
'29.00 , 116/128 , 0.906 , 0.906250 , 0.90625
'29.25 , 117/128 , 0.914 , 0.914063 , 0.914063
'29.50 , 118/128 , 0.922 , 0.921875 , 0.921875
'29.75 , 119/128 , 0.930 , 0.929688 , 0.929688
'30.00 , 120/128 , 0.938 , 0.937500 , 0.9375
'30.25 , 121/128 , 0.945 , 0.945313 , 0.945313
'30.50 , 122/128 , 0.953 , 0.953125 , 0.953125
'30.75 , 123/128 , 0.961 , 0.960938 , 0.960938
'31.00 , 124/128 , 0.969 , 0.968750 , 0.96875
'31.25 , 125/128 , 0.977 , 0.976563 , 0.976563
'31.50 , 126/128 , 0.984 , 0.984375 , 0.984375
'31.75 , 127/128 , 0.992 , 0.992188 , 0.992188


參考程式碼

int main(int argc, char* argv[])
{
    int i;
    double d;
    char caF3[16];
    for (i = 0; i < 128; i++)
    {
        d = (double)i / 128;
        sprintf(caF3, "%.03f", d);
        printf("'%02d.%02d , %3d/128 , %s , %.6f , %g\n", ((25 * i) / 100), ((25 * i) % 100), i, caF3, d, ((double)(((atoi(caF3 + 2) * 128) + 500)/1000))/128 );
    }


    return 0;
}




1-10 of 35