2021年11月1日 星期一

tspubtm 壓測工具

tspubtm 壓測工具的測試模型, 如下:

tspubtm(send)  ---tcp-->  MDC ---tcp-->  tspubtm(recv)

 ※ tspubtm(send) /  tspubtm(recv) 須為同設備

      為了更精確的計算時差, 採用主機時間戳記


測試流程, 如下:

1. tspubtm(recv) 先啟動並連到 MDC, 以及訂閱行情

    連線訂閱完成後, 會在無收取壓測資料 5秒後, 列表數據

2. tspubtm(send) 於 1. 啟動後的連線都完成後, 以及5秒退出前

    開始發行假行情, 並且列表所發行的數量與耗時


參數與畫面 說明:  以下假設 MDC IP 在本機 127.0.0.1 若為跨機, 需修改



tspubtm(send)

例1:  模擬發行 50 商品, 1個成交, 伴隨4個委託簿, 委託簿深度5
         每 10000us(10ms) 發行一次, 重複 50
         因此總發行量為 50 * (1+4) * 50 = 12,500 筆
          ./tspubtm S 127.0.0.1 50 1 4 5 10000 50 
         ※ 發行有權限問題, 因此無法指定 Port 統一走 9888, 因此跨機測試防火要注意

例2:  模擬發行 100 商品, 1個成交, 伴隨4個委託簿, 委託簿深度5
         每 1000us(1ms) 發行一次, 重複 100
         因此總發行量為 100 * (1+4) * 100 = 50,000 筆
          ./tspubtm S 127.0.0.1 100 1 4 5 1000 100 
         ※ 使用此例, 要小心, mdc 預設保護上限 20,480 很容易發生, 而使測試失真


Publish L1+L2: 表示總筆數 5萬筆


tspubtm(recv)

例1: 模擬 10 個連線, 訂閱 50 個商品(L1+L2)
          ./tspubtm R 127.0.0.1:443 10 50 

例2: 模擬 50 個連線, 訂閱 100 個商品(L1+L2)
          ./tspubtm R 127.0.0.1:443 50 100 

 
Sess[#] 表示連線號
L1(max: 最大延遲us   min: 最小延遲us   avg:平均延遲us)
L2(max: 最大延遲us   min: 最小延遲us   avg:平均延遲us)
( Drop 數(非0表示有保護發動) / 合併封包表頭數量 / 總傳輸量(bytes))


這些數據, 還會因以下參數, 而有效率上的起伏
所以在調校時, 您可以調整 mdctsd 的參數, 來最佳化
TS.CompressLength 壓縮
TS.PacketLimitCount 行情包保護上限
TS.SplitProcessL2  L2 是否合併 L1 發行
TS.SendBufferKb  socket 底層的傳送緩衝區



2020年2月23日 星期日

mdcsd 新增品種設定

品種在 MDC 上架,有多個耦合關係的設定,否則無法運行

首先我們先列表幾個資訊,如下:
1. 交易所 (上手)
2. 品種代碼 (上手)
3. 來源名稱 (上手)
4. 來源外掛物件
5. 交易所 (服務)
6. 品種代碼 (服務)
7. 價格乘數 (服務)

我們舉幾個例子

Ex:1 來源 IDC, 交易所 SGX, 品種 CN  如下
1. SGX
2. CN
3. IDC
4. dsIDC
5. SMX
6. CN
7. 1.0

Ex:2 來源 IDC, 交易所 CME, 品種 6A, 價格乘 10000, 服務為 AD 如下
1. CME
2. 6A
3. IDC
4. dsIDC
5. CME
6. AD
7. 10000.0

Ex:3 來源 PATS, 交易所 CME, 品種 Aus Doller, 價格乘 10000, 服務為 AD 如下
1. CME
2. Aus Doller
3. PATS
4. dsPATS
5. CME
6. AD
7. 10000.0


================================================
以下是為 MDC 對應上述資訊的設定位置

◎ mdcmd 設定

1. 管理Web > mdcmd > Tables > 交易所資訊 (Exchange)  設定相對如下
    (我們以 Ex.1 的 內部SGX , 外部服務 SMX, 為例)








2. 管理Web > mdcmd > Tables > 上手來源轉換資訊 (SourceDetail)  設定相對如下







◎ mdcsd 設定

1. 設定檔  mdcsd-xxxx.conf






如若以上設定皆備,在 mdcsd-xxxx 服務啟動後,MDC 會自動列舉對應的商品
並且將其商品建立至 Commodity 商品資訊表中



2018年9月13日 星期四

MDC PATS 來源合約無法上架問題

案例: 交易所ISG , 商品根 SDX

SOP 如下:

1.確認商品真的存在
  * 至 mdcsd-xxxx > about > parameters > DS.ContractFile 設定一個檔名 (contract.txt)
  * 重啟這個單元
  * 開啟檔案 contract.txt 找找商品存在否
 
  不存在, 請找 PATS 源為你開商品
  存在, 請依 "參考片斷" , GO Step 2

  < contract.txt 參考片斷 > 
    61418,UICE_SG,MINDLR SDX,SEP18,20180917,20180917,1,1000,0.005,89,1,0,78,5595401,,,
    61419,UICE_SG,MINDLR SDX,DEC18,20181217,20181217,1,1000,0.005,89,1,0,78,5661742,,,
    61420,UICE_SG,MINDLR SDX,MAR19,20190318,20190318,1,1000,0.005,89,1,0,78,5728670,,,
    61421,UICE_SG,MINDLR SDX,JUN19,20190617,20190617,1,1000,0.005,89,1,0,78,5792128,,,
   
   
2.確定 MDCMD 中已經建立好以下資訊
  * SourceDetail (這是用來依上手轉換的資訊)
    a. Source (來源代碼), 請依 mdcsd-xxxx.conf 中 MDCS.Source 的值來設定
    b. OrgExch (來源交易所), 設上手交易所, UICE_SG
    c. OrgCommRoot (來源根), 設上手品種, MINDLR SDX
    d. Exch (MDC 交易所), 設為您使用 ISG
    e. CommRootAbbr (MDC 商品根), 設為您使用的 SDX
    f. Multiplier (價格乘數), 設為 1
    g. StrikeMultiplier (履約價乘數), 設為 1
    h. Category (類別), 設為 Future
   
  * CommodityRoot 有這個商品的根資訊
    a. 確認已經建立了 ISG SDX 的品種資訊
    b. PriceScaleAbbr 設為 SDX
 
  * PriceScale 有這個商品的價格跳動資訊
    a. 確認已經建立了 ISG SDX 資訊
 
  建立完成後, 重啟 mdcsd-xxxx 服務
 
3.確認是否有行情
  a. 至 mdcsd-xxxx > about > tables > Commoditys 過濾找找看, 是否有行情資訊進來
  b. 使用 API 或 既有的 AP 檢視

2018年6月15日 星期五

IDC 上手的價格檔位問題

Q: 我建立了一個新的商品根, 以及價格檔位, 為什麼怎麼設定價格檔位都沒有用?
A: 我們要先確定一個問題, 價格檔位來自二個地方, 一個是根商品參考的 "價格檔位", 一個是來自上手的自動化覆蓋

確認是否有自動化來自上手方法如下
1. mdcmd > tables > Commodity > 找出此商品合約
2. 確定 PriceScales 是否已存在設定資料 (非空值)

如果你確定是有的, 那麼你怎麼設定 mdcmd > tables > PriceScale 都將沒有用
因為我們都將已這個 Commodity.PriceScales 取代之前的所有設定


Q: 自動化的價格檔位為什麼分母很大
A: 台灣呈現國外行情時, 都會乘上一個倍數, 讓數值好閱讀
   而這個數值, 就是 SourceDetail.Multiplier
   如果您在建立 CommodityRoot 前, 沒有先建立好 SourceDetail, 或是之後才修改 Multiplier
   這時會當成 1(沒有乘數), 來處理, 因此才出現分母很大的問題
 
 
Q: 我要如何修正這個問題
A: 我們要設定好 SourceDetail.Multiplier 以及 PriceScales.Items 後
   手動修改 Commodity.PriceScales 將其清空, 使其依 PriceScales 來運作

2018年3月14日 星期三

關於 MDC API Quotation.Deal 的買賣價欄位

MDC 的 Deal 中的以下欄位
Deal.BidPrice / Deal.BidVolume /Deal.AskPrice / Deal.AskVolume
是希望服務成交時的,最新買賣價資訊

但這是理想上的設計,實際上存在一些例外
因為有些報價來源,在成交時,是不提供以上四個欄位的

所以 MDC 為了支援 "欄位服務" 的一致性
我們會將對於沒提供此資訊的來源做一些加工
就是在 "成交" 時,Depth 又有下以欄位資料時,做一次替代,如下
Depth.BidPrice1 => Deal.BidPrice
Depth.BidVolume1 => Deal.BidVolume
Depth.AskPrice1 => Deal.AskPrice
Depth.AskVolume1 => Deal.AskVolume

如此,便可將奇型怪狀的各種上手,統一服務的一致性。


以下列出,已知上手的處理方式

DataSource處理模式說明
dsTAIFEXDepthI020 送來成交,I080送來五檔
但 I020 不支援此欄位
因此我們使用 I080 的最後態來回補
Depth.BidPrice1 => Deal.BidPrice
Depth.BidVolume1 => Deal.BidVolume
Depth.AskPrice1 => Deal.AskPrice
Depth.AskVolume1 => Deal.AskVolume
dsTWSE上手 or Depth依 "格式六" 送來內容而定
僅成交 = 使用 Depth 回補
成交+五檔 = 直接使用一檔
dsIDC上手依上手
Token 10 => Deal.AskPrice
Token 11 => Deal.AskVolume
Token 12 => Deal.BidPrice
Token 13 => Deal.BidVolume
dsPATS上手依上手 PriceStruct 中
.Bid.Price => Deal.BidPrice
.Bid.Volume => Deal.BidVolume
.Offer.Price => Deal.AskPrice
.Offer.Volume => Deal.AskVolume

2018年1月1日 星期一

關於歷史資料維護轉檔 (轉入部份)

您可利用 bin/x_mdchd 工具

以此次案例, 20171227 資料異常, 需要匯入
我們在 tmp 目前中放入整理好的檔案 TW_20171227.csv

注意!! 工具匯入時, 將為當日日期完全覆蓋, 請小心盤別跨日不完整資料, 不會保留舊有

TW_20171227.csv 內容如下
ExchangeAbbr,CommodityCode,Date,Time,Price,Volume,S
SGX,TW\Z17,20171227,000002700,384.5,1,E
SGX,TW\Z17,20171227,000005624,384.5,1,E
SGX,TW\Z17,20171227,000014176,384.5,1,E
.
.
.
SGX,TW\H18,20171227,114131728,386.4,1,E
SGX,TW\H18,20171227,114131728,386.4,1,E
SGX,TW\H18,20171227,114131728,386.4,1,E

只要有 ExchangeAbbr,CommodityCode 欄位, 就可以多商品合併匯入
欄位代碼可以換位置, 但名稱不可變, 變了就會判定失敗
最後一欄 S 是亂取得, 因為我們不需要這一欄

然後叫起 x_mdchd 匯入, 至 bin 目錄, 指令如下:
./x_mdchd -p /ap/vipquoterd/mdc/db -i -t tick ../tmp/TW_20171227.csv

輸出結果如下:
Exch=SGX Code=TW\Z17 date=20171227 rows=9706
Exch=SGX Code=TW\F18 date=20171227 rows=8932
Exch=SGX Code=TW\H18 date=20171227 rows=4
Import 18642 rows

表示匯入成功

2017年12月14日 星期四

PATS 處理結算價邏輯

PATSAPI 有一個 SettlementUpdate callback (以下簡稱 event)

event 中的資訊, 會有以下主要欄位
日期(Date)
時間(Time)
價格(Price)
種類(SettlementType)    以下簡稱 ST

我們訂閱後, PATS會先刷來各種 ST 的價格 (我們視為 Init)
之後 PATS 會依結算等, 再送來各 ST 的價格 (我們視為 Realtime)

以下是原始 PATS 定義的 ST (SettlementType)
0 = ptStlLegacyPrice
7 = ptStlCurPrice
21 = ptStlLimitUp
22 = ptStlLimitDown
23 = ptStlExecDiff
24 = ptStlYDSPPrice
25 = ptStlNewPrice
26 = ptStlRFQiPrice
27 = ptStlRFQtPrice
28 = ptStlIndicative

MDC dsPATS 的結算處理如下:

event 發生
 若是 Init
  我們會將 ST=24 的價格, 放入 "昨日結算價"  Basic.PreSettlementPrice
 若為 Realtime
  我們會將 ST=7,25 的價格, 視為 "結算價"  Basic.SettlementPrice
  但因 PATS 處理方式很亂七八糟,會亂送來
  (例如都跨交易日了,都轉到昨結了,還是會在盤中送來結算...等)
  所以我們要將 Date / Time 的值拿來判斷,若值沒變動
  我就視為亂送的資料,不予處理。



tspubtm 壓測工具

tspubtm 壓測工具的測試模型, 如下: tspubtm(send)  ---tcp-->  MDC ---tcp-->  tspubtm(recv)  ※ tspubtm(send) /  tspubtm(recv) 須為同設備       為了更精確的計算時差...