GMDS

使用HFOCX資訊示範AmiBroker上用ADK設計Realtime Quote

張貼者:2019年1月14日 下午10:00Wei-Xiuang Wang   [ 已更新 2019年2月10日 下午8:43 ]


AmiBroker Development Kit (ADK) 的設計,
大致上就是寫一個dll專案, 主cpp裏include ADK提供的 Plugin.h
然後需要提供以下functions:

PLUGINAPI int GetPluginInfo( struct PluginInfo *pInfo );
PLUGINAPI int Init(void);
PLUGINAPI int Release(void);

要設計Realtime Quote則需再提供
PLUGINAPI int GetStatus( struct PluginStatus *status );

如果還要支援線圖資料則再增加
PLUGINAPI int GetQuotesEx( LPCTSTR pszTicker, int nPeriodicity, int nLastValid, int nSize, struct Quotation *pQuotes, GQEContext *pContext  );

整個ADK其實在GMDS上要運用只需保留一個檔案, 就是 ADK\Include\Plugin.h 就可以了,
但是 Plugin.h 裡面寫了#include "plugin_legacy.h", 所以可以把 plugin_legacy.h 也留著,
不過這只有在跟舊版的AmiBroker( < v5.27)搭配時才有作用,
如真的不需要就把 Plugin.h 裏的include註解掉, 檔案也就可以刪了~ 真的沒什麼用

而要接收DTS資訊源(這裏會用HFOCX的外匯行情作示範)
只需要有 DbfTCdll2.dll 就可以作了,
如果是寫C++則可以引入 DbfTCdll2.h 可以寫的比C#更容易!

PS: 與GMDS的api是全面性支援的概念有所不同, ADK 由於是用 _cdecl (VC預設) 方式宣告函式,
官方說明是可以使用VC6和DevC開發, 而BCB雖然也能正確編譯, 但作出的dll AmiBroker是不能用的!


這裡的示範, 為了調用方便, 設計兩種索引方式, 大致如下規劃
void *vpQuoteIndexHandle = NULL;//行情庫管理
int iCountContracts = 0;//商品數

typedef struct
{//商品資料結構
    struct RecentInfo sRecentInfo;
} RecentInfoDataItem;

typedef struct
{//商品索引用, 由行情源對應商品的記憶區塊
    RecentInfoDataItem *spRecentItem;
} CommodityRefer;

typedef struct
{//商品索引用, 由商品短碼反查
    RecentInfoDataItem *spRecentItem;
    CommodityRefer *spCommodity;
} RecentItemRefer;

CommodityRefer *spCurrCommodity = NULL;

//資料源欄位代碼
#define Tag_UniSymbolName        "1"        //結合"93" "94" "95",多重資訊來源也是Unique的長代碼
#define Tag_ExchangeName        "93"
#define Tag_ContractName        "94"    //通常包含"95"的內容,於單一資訊源是Unique的短代碼
#define Tag_ContractDate        "95"
#define Tag_OpenInterest        "13"
#define Tag_Reference            "14"
#define Tag_Open                "6"
#define Tag_High                "8"
#define Tag_Low                    "10"
#define Tag_Close                "12"
#define Tag_Bid                    "18"
#define Tag_BidVol                "19"
#define Tag_Offer                "20"
#define Tag_OfferVol            "21"
#define Tag_Last                "22"
#define Tag_LastVol                "23"
#define Tag_TotalVol            "27"
//還有很多,有用到再找


程式內容大概這樣寫
CommodityRefer * GetCommodityRefer(const char *cpDBName, const char *cpSymbol, bool bAutoCreate = false)
{//商品索引用, 由行情源對應商品的記憶區塊
    spCurrCommodity = (CommodityRefer *)fnDbfTCdll_GetItemQuoteMemory(cpDBName, cpSymbol);
    if (!spCurrCommodity && bAutoCreate)
    {
        CommodityRefer sCommodity;
        memset(&sCommodity, 0, sizeof(sCommodity));
        spCurrCommodity = (CommodityRefer *)fnDbfTCdll_CreateItemQuoteMemory(cpDBName, cpSymbol, &sCommodity, sizeof(sCommodity));
        return spCurrCommodity;
    }
    return spCurrCommodity;
}

char caContractDBN[] = "RecentItemRefer";
RecentItemRefer * GetRecentItemRefer(const char *cpContractName)
{return (RecentItemRefer *)fnDbfTCdll_GetItemQuoteMemory(caContractDBN, cpContractName);}
bool MakeRecentItemRefer(CommodityRefer *spCommodity)
{//商品索引用, 由商品短碼反查
    if (spCommodity)
    {
        CommodityRefer &sCommodity = *spCommodity;
        struct RecentInfo &sRecentInfo = sCommodity.spRecentItem->sRecentInfo;
        RecentItemRefer sRecentRefer = {sCommodity.spRecentItem, &sCommodity};
        return (fnDbfTCdll_CreateItemQuoteMemory(caContractDBN, sRecentInfo.Name, &sRecentRefer, sizeof(sRecentRefer)) != NULL);
    }
    return false;
}


即時數據接收的Callback大概是這樣的內容
void DBFTCDLLAPI TagDataProcessFunction(const char *cpDBName, const char *cpVarName, const char *cpSymbol, const char *cpNewValue, const char *cpOldValue)
{// 1 - By Tag, 每個商品的每個Tag更新都會呼叫
    if (!spCurrCommodity)    //同商品會有多次通知,僅需檢索一次
        spCurrCommodity = GetCommodityRefer(cpDBName, cpSymbol, true);
//這裡的這個CB其實沒要作什麼事,可以取消不用 (留著只是示範)
//或者也可以設計一些flag幫助 ItemProcessFunction 處理
}

void DBFTCDLLAPI ItemProcessFunction(const char *cpDBName, const char *cpVarName, const char *cpSymbol, const char *cpNewValue, const char *cpOldValue)
{// 2 - By Item, 有更新的商品會呼叫 (傳入之cpVarName,cpNewValue,cpOldValue等參數為NULL)
    if (spCurrCommodity)
    {
        CommodityRefer &sCommodity = *spCurrCommodity;
        spCurrCommodity = NULL;// 本商品處理完畢,重抓

        if (!sCommodity.spRecentItem) //商品剛建立
        {
            char *cpContractName = fnDbfTCdll_GetCurrTagValue(Tag_ContractName);
            if (cpContractName && cpContractName[0])
            {//確認商品代碼存在, 產生對應的AmiBroker的RecentInf儲存區塊
                sCommodity.spRecentItem = (RecentInfoDataItem *)fnDbfTCdll_STManGetTickMemory(vpQuoteIndexHandle, iCountContracts, true);//true : 自動產生
                if (sCommodity.spRecentItem)
                {
                    memset(sCommodity.spRecentItem, 0, sizeof(RecentInfoDataItem));

                    struct RecentInfo &sRecentInfo = sCommodity.spRecentItem->sRecentInfo;
                    //初始化AmiBroker的RecentInf結構內容
                    sRecentInfo.nStructSize = sizeof(sRecentInfo);
                    memccpy(sRecentInfo.Name, cpContractName, 0, sizeof(sRecentInfo.Name));//商品代碼
                    memccpy(sRecentInfo.Exchange, fnDbfTCdll_GetCurrTagValue(Tag_ExchangeName), 0, sizeof(sRecentInfo.Exchange));//商品交易所/來源
                    sRecentInfo.nBitmap = RI_Wana;
                    iCountContracts++;

                    if (!GetRecentItemRefer(sRecentInfo.Name))
                    {//建立索引,使用短代碼作為AmiBroker的操作鍵
                        MakeRecentItemRefer(&sCommodity);
                    }

                    sRecentInfo.nBitmap |= RI_Wana | RI_DATEUPDATE;
                    sRecentInfo.nStatus = RI_STATUS_UPDATE | RI_STATUS_BIDASK | RI_STATUS_TRADE;

                    Set_float(sRecentInfo.fOpen, fnDbfTCdll_GetCurrTagValue(Tag_Open));
                    Set_float(sRecentInfo.fHigh, fnDbfTCdll_GetCurrTagValue(Tag_High));
                    Set_float(sRecentInfo.fLow, fnDbfTCdll_GetCurrTagValue(Tag_Low));
                    //Set_float(sRecentInfo.fOpenInt, fnDbfTCdll_GetCurrTagValue(Tag_OpenInterest));

                    Set_float(sRecentInfo.fBid, fnDbfTCdll_GetCurrTagValue(Tag_Bid));
                    Set_int(sRecentInfo.iBidSize, fnDbfTCdll_GetCurrTagValue(Tag_BidVol));
                    Set_float(sRecentInfo.fAsk, fnDbfTCdll_GetCurrTagValue(Tag_Offer));
                    Set_int(sRecentInfo.iAskSize, fnDbfTCdll_GetCurrTagValue(Tag_OfferVol));

                    Set_float(sRecentInfo.fLast, fnDbfTCdll_GetCurrTagValue(Tag_Last));
                    Set_int(sRecentInfo.iTradeVol, fnDbfTCdll_GetCurrTagValue(Tag_LastVol));
                    Set_int(sRecentInfo.iTotalVol, fnDbfTCdll_GetCurrTagValue(Tag_TotalVol));
                    vUpdateVol_forAmiBroker527(sRecentInfo);

                    vUpdateCurrDateTime();    //"etc_code_datetime.cpp"
                    sRecentInfo.nDateChange = lDecDate; // format YYYYMMDD
                    sRecentInfo.nTimeChange = lDecTime; // format HHMMSS
                    sRecentInfo.nDateUpdate = lDecDate; // format YYYYMMDD
                    sRecentInfo.nTimeUpdate = lDecTime; // format HHMMSS
                }
            }
        }
        else
        {
            struct RecentInfo &sRecentInfo = sCommodity.spRecentItem->sRecentInfo;
            sRecentInfo.nStatus = 0;

            if (Update_float(sRecentInfo.fOpen, fnDbfTCdll_GetCurrTagValue(Tag_Open)))
                sRecentInfo.nStatus |= RI_STATUS_UPDATE;
            if (Update_float(sRecentInfo.fHigh, fnDbfTCdll_GetCurrTagValue(Tag_High)))
                sRecentInfo.nStatus |= RI_STATUS_UPDATE;
            if (Update_float(sRecentInfo.fLow, fnDbfTCdll_GetCurrTagValue(Tag_Low)))
                sRecentInfo.nStatus |= RI_STATUS_UPDATE;
            //if (Update_float(sRecentInfo.fOpenInt, fnDbfTCdll_GetCurrTagValue(Tag_OpenInterest)))
            //    sRecentInfo.nStatus |= RI_STATUS_UPDATE;

            if (Update_float(sRecentInfo.fBid, fnDbfTCdll_GetCurrTagValue(Tag_Bid)))
                sRecentInfo.nStatus |= RI_STATUS_BIDASK;
            if (Update_int(sRecentInfo.iBidSize, fnDbfTCdll_GetCurrTagValue(Tag_BidVol)))
                sRecentInfo.nStatus |= RI_STATUS_BIDASK;
            if (Update_float(sRecentInfo.fAsk, fnDbfTCdll_GetCurrTagValue(Tag_Offer)))
                sRecentInfo.nStatus |= RI_STATUS_BIDASK;
            if (Update_int(sRecentInfo.iAskSize, fnDbfTCdll_GetCurrTagValue(Tag_OfferVol)))
                sRecentInfo.nStatus |= RI_STATUS_BIDASK;

            if (Update_float(sRecentInfo.fLast, fnDbfTCdll_GetCurrTagValue(Tag_Last)))
                sRecentInfo.nStatus |= RI_STATUS_TRADE;
            if (Update_int(sRecentInfo.iTradeVol, fnDbfTCdll_GetCurrTagValue(Tag_LastVol)))
                sRecentInfo.nStatus |= RI_STATUS_TRADE;
            if (Update_int(sRecentInfo.iTotalVol, fnDbfTCdll_GetCurrTagValue(Tag_TotalVol)))
                sRecentInfo.nStatus |= RI_STATUS_TRADE;
            if ((sRecentInfo.nStatus & RI_STATUS_TRADE) == RI_STATUS_TRADE)
                vUpdateVol_forAmiBroker527(sRecentInfo);

            vUpdateCurrDateTime();    //"etc_code_datetime.cpp"
            if (sRecentInfo.nTimeChange != lDecTime)
            {
                sRecentInfo.nTimeChange = lDecTime; // format HHMMSS
                sRecentInfo.nTimeUpdate = lDecTime; // format HHMMSS
                sRecentInfo.nStatus |= RI_STATUS_UPDATE;
                if (sRecentInfo.nDateChange != lDecDate)
                {
                    sRecentInfo.nDateChange = lDecDate; // format YYYYMMDD
                    sRecentInfo.nDateUpdate = lDecDate; // format YYYYMMDD
                    sRecentInfo.nBitmap |= RI_DATECHANGE;
                }
            }
        }
    }
}

如上之設計, 如果想玩其它花樣, 可以用以下方式隨時取得商品表與內容,
RecentInfoDataItem *spDataItem = (RecentInfoDataItem *)fnDbfTCdll_STManGetTickMemory(vpQuoteIndexHandle, iIndex, false);
其中iIndex就是直接調出第幾個商品 0 <= iIndex < iCountContracts
所以用一個for-loop就等於將整個商品表掃一次了~

ADK要設計的內容就很簡單了...Init/Release
PLUGINAPI int Init(void)
{
    if (!hmDbfTCdll)
        hmDbfTCdll = LoadLibrary(DbfTCdllLibSource);
    if (hmDbfTCdll)
    {
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_SelectDataSet);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_InitUser);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_Start);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_Stop);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetConnectionStatus);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_CallBack_Register);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetCurrTagValue);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetPrevTagValue);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_CreateStringIdMapping);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetStringId);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_CreateItemQuoteMemory);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetItemQuoteMemory);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_GetQueueCount);

        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_STManCreateGroup);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_STManCreateProduct);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_STManGetTickHandle);
        WWXfunc_DllImport(hmDbfTCdll, fnDbfTCdll_STManGetTickMemory);

        if (fnDbfTCdll_CallBack_Register)
        {
            //CallBack 模式
            fnDbfTCdll_CallBack_Register(TagDataProcessFunction, 1);// 1 - By Tag, 每個商品的每個Tag更新都會呼叫
            fnDbfTCdll_CallBack_Register(ItemProcessFunction, 2);// 2 - By Item, 有更新的商品會呼叫 (傳入之cpVarName,cpNewValue,cpOldValue等參數為NULL)
            if (fnDbfTCdll_STManCreateGroup)
            {
                unsigned long uGroupIndex = fnDbfTCdll_STManCreateGroup("RecentInfoDataItem", sizeof(RecentInfoDataItem), NULL, 64, 256);
                unsigned long uProductIndex = fnDbfTCdll_STManCreateProduct(uGroupIndex);
                vpQuoteIndexHandle = fnDbfTCdll_STManGetTickHandle(uGroupIndex, uProductIndex);
                if (!vpQuoteIndexHandle)
                    MessageBox(0, "Dll file "DbfTCdllLibSource" STMan Err! Memory crash!!", PLUGIN_NAME" Init Error!", MB_OK);
            }
            else
                MessageBox(0, "Dll file "DbfTCdllLibSource" not support STMan", PLUGIN_NAME" Init Error!", MB_OK);
        }
        else
        {
            FreeLibrary(hmDbfTCdll);
            hmDbfTCdll = NULL;
            MessageBox(0, "Dll file "DbfTCdllLibSource" load faild!!", PLUGIN_NAME" Init Error!", MB_OK);
        }
    }
    else
    {
        MessageBox(0,
            "Dll file "DbfTCdllLibSource" not found!!\n"
            "請將檔案置於AmiBroker的工作環境資料夾內"
            , PLUGIN_NAME" Init Error!"
            , MB_OK
        );
    }

    if (hmDbfTCdll)
    {
        fnDbfTCdll_InitUser(PLUGIN_NAME);//直接用PLUGIN_NAME當User,同一資訊源相同User只能一個在線
        fnDbfTCdll_SelectDataSet(caDB_list);
        if (fnDbfTCdll_Start(caDTS_host))
            g_nStatus = STATUS_WAIT;
    }

    return 1; // default implementation does nothing

};     

PLUGINAPI int Release(void)
{
    if (hmDbfTCdll)
        fnDbfTCdll_Stop();

    return 1; // default implementation does nothing
};


ADK的Realtime Quote就只要這樣
// GetSymbolLimit function is optional, used only by real-time plugins
PLUGINAPI int GetSymbolLimit( void )
{//告知AmiBroker, 可以向本plugin註冊最多幾個symbol
    return 99999;
}

// GetRecentInfo function is optional, used only by real-time plugins
PLUGINAPI struct RecentInfo * GetRecentInfo( LPCTSTR pszTicker )
{//HFOCX可用的代碼可以看這裏==> http://hfocx.dm.ftw.tw/0025/?Quote=All&xml=1
    RecentItemRefer *spRecentRefer = GetRecentItemRefer(pszTicker);
    if (spRecentRefer)
        return &(spRecentRefer->spRecentItem->sRecentInfo);
    return NULL;
}


把連線狀態回應給AmiBroker可以簡單這樣設計
////////////////////////////////////////
// GetStatus function is called periodically
// (in on-idle processing) to retrieve the status of the plugin
// Returned status information (see PluginStatus structure definition)
// contains numeric status code    as well as short and long
// text descriptions of status.
//
// The highest nibble (4-bit part) of nStatus code
// represents type of status:
// 0 - OK, 1 - WARNING, 2 - MINOR ERROR, 3 - SEVERE ERROR
// that translate to color of status area:
// 0 - green, 1 - yellow, 2 - red, 3 - violet

PLUGINAPI int GetStatus( struct PluginStatus *status )
{
    char *cpStatus = "GetConnectionStatus() failed!";
    if (hmDbfTCdll)
    {
        cpStatus = fnDbfTCdll_GetConnectionStatus();
        if (cpStatus[1] == 'O')
            g_nStatus = STATUS_CONNECTED;
        else if (cpStatus[1] == 'X')
            g_nStatus = STATUS_DISCONNECTED;
        else
            g_nStatus = STATUS_WAIT;
    }

    switch( g_nStatus )
    {
    case STATUS_WAIT:
        status->nStatusCode = 0x10000000;
        strcpy( status->szShortMessage, "WAIT" );
        strcpy( status->szLongMessage, cpStatus );
        status->clrStatusColor = RGB( 255, 255, 0 );
        break;
    case STATUS_CONNECTED:
        status->nStatusCode = 0x00000000;
        strcpy( status->szShortMessage, "OK" );
        strcpy( status->szLongMessage, cpStatus );
        status->clrStatusColor = RGB( 0, 255, 0 );
        break;
    case STATUS_DISCONNECTED:
        status->nStatusCode = 0x20000000;
        strcpy( status->szShortMessage, "ERR" );
        strcpy( status->szLongMessage, cpStatus );
        status->clrStatusColor = RGB( 255, 0, 0 );
        break;
    case STATUS_SHUTDOWN:
        status->nStatusCode = 0x30000000;
        strcpy( status->szShortMessage, "DOWN" );
        strcpy( status->szLongMessage, "Connection is shut down.\nThe dll file '"DbfTCdllLibSource"' can't load." );
        status->clrStatusColor = RGB( 192, 0, 192 );
        break;
    default:
        strcpy( status->szShortMessage, "Unkn" );
        strcpy( status->szLongMessage, cpStatus );
        status->clrStatusColor = RGB( 255, 255, 255 );
        break;
    }

    return 1;
}


把作出來的dll放AmiBroker安裝路徑下的 Plugins 資料夾中
例如 C:\Program Files\AmiBroker\Plugins\
而收DTS用的 DbfTCdll2.dll 則放AmiBroker的工作路徑下
例如 C:\Program Files\AmiBroker\
然後跑AmiBroker起來, 到選單 Tools --> Plug-ins...
可以看到

然後有選單看是要新增 File --> New --> Database...
還是編輯 File --> Database setting...
就可以選這資料源來使用了

沒有任何商品代碼嗎? 從選單的 Sumbol --> New... 將下面整行內容貼進去
AUD/USD,AUD/JPY,USD/CAD,USD/CHF,CHF/JPY,EUR/USD,EUR/CHF,EUR/GBP,EUR/JPY,GBP/USD,GBP/CHF,GBP/JPY,HKGOLD,USD/JPY,LKG,GOLD,GOLDX,SILVER,SILVERX,NZD/USD
按OK鈕之後, 所有輸入的商品代碼就會列在Symbol視窗格, 然後於視窗格中按Ctrl+A全選,
再用滑鼠右鍵點出功能清單, 點選 Add to Realtime Quote windows 這樣就完工了~

如果還沒有看到Realtime Quote視窗格, 則是要在選單列的 Window 那邊, 把Realtime Quote項目點勾起來即可

本例中與上游(UniDBF)的上游(Pats-Emu)相比對

當然, 如果使用VC10以上或DevC5就能產出x64的dll版本搭配64位元版的AmiBroker囉!


更進一步就是設計設定的介面, 可以用文件編輯ini的方式或是比較搞剛作GUI,
依拙見還是選擇前者既簡單又方便, 就請各自發揮了~

當然, 任何資訊都可以很容易轉成DTS服務, 只要轉成DTS方式服務後,
就都能像上面一樣輕輕鬆鬆運用在AmiBroker裏了... 即便要加入線圖資訊的功能,
透過GMDS提供的STM很容易就能完美又簡潔的建構出來~
( 前面提到 iCountContracts 所形成的商品表, 就也是使用STM的範例 )

這也就是說可以把各種不好使的資訊來源透過GMDS的提供的方式(Feed-Server/API)全都打進GMDS的架構內,
然後不管什麼資訊源最後統一都是最容易上手的DTS介接模式, 再來DTS以下都是維持不變的,
就算源頭換來換去再也不用擔心要大費周章改一堆了!
如能透過券商端提供TSHS與客端使用PatsEmu-TSHS, 那麼資料完全自動銜接, 也不用再考慮什麼回補問題了~

針對 DbfTCdll2.dll 的使用上, 關於程式使用dll的方式,
可進一步參考 使用dll的一些基礎見識

其它連結: AmiBroker



CME MDP 3.0 Market Data Template v9 改版

張貼者:2018年8月16日 上午2:50Wei-Xiuang Wang   [ 已更新 2018年10月28日 下午6:15 ]


GMDS的PatsEmu-CME從2015的 v2 Template 設計後運作到現在,
期間CME已經改版多次到上次的v8, 其中有幾次還造成路透的系統突槌...
反觀GMDS卻無須任何配合修改, 一值完全正確處理資料

不過這次的v9已經不是格式修改, 而是整個翻新,
分析其主要目的為將小數7位的定義擴大到9位

這個動作其實早在估計之內, 於最初解v2資料時就已經覺得設計上有問題,
無奈下游只能配合, 不過有覺悟的話至少還是預先參數化讓程式比較容易逢變時擴增

為什麼會有這種預感呢? 因為英鎊計價的部分都是分數
1/256 = 0.00390625 其實就應該已經用到小數8位了
當我們透過通分時, 雖然分母 3200 似乎夠用,
但實際運算時 3200/256 = 12.5 尚未整除,
所以實際以整數處理時會擴大到使用分母 6400 來處理
反之 6400/12.5 = 512 也就是逆向處理時, 用 1/512 作為邊緣較為合適
1/512 = 0.001953125 那麼就會使用到小數9位了

本次的主要變動:
■多了 PRICE9 和 PRICENULL9 的新欄位定義, 用來替代原本的 PRICE 和 PRICENULL
■多了 Decimal9 和 Decimal9NULL 用來替代原本的 FLOAT
■新增以下格式 (都是有套用到新欄位而變更)
MDIncrementalRefreshBook46              id="46" ==>取代原使用的 MDIncrementalRefreshBook32 id="32"
MDIncrementalRefreshOrderBook47         id="47" //行情沒用到
MDIncrementalRefreshTradeSummary48      id="48" ==>取代原使用的 MDIncrementalRefreshTradeSummary42 id="42"
MDIncrementalRefreshDailyStatistics49   id="49" ==>取代原使用的 MDIncrementalRefreshDailyStatistics33 id="33"
MDIncrementalRefreshLimitsBanding50     id="50" ==>取代原使用的 MDIncrementalRefreshLimitsBanding34 id="34"
MDIncrementalRefreshSessionStatistics51 id="51" ==>取代原使用的 MDIncrementalRefreshSessionStatistics35 id="35"
SnapshotFullRefresh52                   id="52" //未使用, 與 SnapshotFullRefresh38相同,只是PRICENULL改用PRICENULL9
SnapshotFullRefreshOrderBook53          id="53" //行情沒用到
MDInstrumentDefinitionFuture54          id="54" ==>取代原使用的 MDInstrumentDefinitionFuture27 id="27"
MDInstrumentDefinitionOption55          id="55" ==>取代原使用的 MDInstrumentDefinitionOption41 id="41"
MDInstrumentDefinitionSpread56          id="56" ==>取代原使用的 MDInstrumentDefinitionSpread29 id="29"

若依廠商提供的 CME更換行情格式,行事曆
期貨 選擇權
2018年8月12日 CBOT YC 小玉米 CBOT C 玉米
CBOT C 玉米 CBOT S 黃豆
CBOT W 小麥 CBOT W 小麥
CBOT YK 小黃豆
CBOT BO 黃豆油
CBOT SM 黃豆粉
CBOT RR 粗米
CBOT S 黃豆
CBOT O 燕麥
2018年8月26日 CBOT YM 小道瓊 CBOT YM 小道瓊
CBOT RX 不動產指數 CBOT US 美國長債券
CBOT US 30年債券 CBOT FV 五年債券
CBOT TY 十年債券 CBOT TY 十年債券
CBOT TU 二年債券
CBOT FV 五年債券
CBOT TN 長期十年債
CBOT UB 超長債券
CBOT FF 30天利率
2018年9月30日 CME JY 日元 CME BP 英鎊
CME AD 澳幣 CME JY 日圓
CME BP 英鎊 CME AD 澳幣
CME SF 瑞郎 CME CD 加幣
CME FC 肉牛 CME EC 歐元
CME LH 瘦豬
CME LC 活牛
CME RY 歐元兌日幣
CME E7 小歐元
CME RP 歐元兌英鎊
CME M6E 微型歐元
CME MP 墨西哥披索
CME NE 紐西蘭幣
CME CD 加幣
CME EC 歐元
2018年10月21日 CME ES 小SP指數 CME ES 小SP指數
CME ED 歐洲美元 CME EW1 小SPW1
CME NK 美元日經 CME EW2 小SPW2
CME NQ 小那斯達克 CME EW3 小SPW3
CME RTY 小羅素2000 CME EW4 小SPW4
CME SP 大SP指數
2018年11月4日 NYM SI 紐約白銀 NYM SI 紐約白銀
NYM MGC 紐約微型黃金 NYM GC 紐約黃金
NYM GC 紐約黃金 NYM CL 紐約輕原油
NYM GCT 紐約黃金TAS
NYM HG 紐約銅
NYM PA 紐約鈀金
NYM PL 紐約白金
2018年11月18日 NYM HO 紐約熱燃油 NYM NG 紐約天然氣
NYM BZ 紐約布蘭特油
NYM CL 紐約輕原油
NYM CLT 紐約輕原油TAS
NYM QM 紐約小輕原油
NYM RB 紐約無鉛汽油


行事曆本身說明了系統最好能新舊格式通吃,
以CME而言就是行事曆時間之前丟舊格式, 時間以後改丟新格式
若GMDS系統尚未更新, 只能解舊格式的會於行事曆時間以後沒有行情

雖然廠商很誇張, 5月就已經提供的新格式, 到8月有商品沒行情的第一天8/13號之後才發現,
雖然8/15號才收到消息, 但是看了一下之前的程式碼, 只能誇讚自己寫的太好了,
估計能連線到系統時, 應該半天就能完工~

改版訊息查閱: 2018-08-16

其他相關文章
PatsEmu-CME 參數設定說明
PatsEmu-CME的商品篩選設定方式
CME MDP3.0的規劃與建置
CME市場商品分析規劃
CME FAST/Template Decode

輕鬆擷取RMDS的資料作即時分析或運用

張貼者:2017年11月20日 下午10:59Wei-Xiuang Wang   [ 已更新 2017年11月21日 下午7:43 ]


目前於RMDS上的應用架構通常為

 ( <--- 箭頭方向為由Client連線Server )
路透主機 <---...--- [ RMDS-Proxy <--- PatsEmu-RMDS ] <--- 各種應用

其中 PatsEmu-RMDS 透過 YTSetFile 的設定作商品代碼轉碼規劃, 產生路透代碼描述的 DataSetFile ,
之後轉交 RMDS-Proxy 將所需要的商品代碼註冊至路透主機, 透過RMDS-Proxy接收所有行情訊息提供DTS服務內容,
而PatsEmu輸出的信息是仿PATS應用所需要的各種資訊

於相同的架構模式下也可使用TSHS-RMDS來運作提供TSHS服務,
輸出的信息則是完整的RMDS的所有FID資訊, 只是TSHS-RMDS僅設計使用路透代碼描述的 DataSetFile 的設定方式,
一樣的把 DataSetFile 設定內容轉交 RMDS-Proxy 將所需要的商品代碼註冊至路透主機, 透過RMDS-Proxy接收所有行情訊息

現在則是要說明其實架構是可以這樣運用的,
在一個運作中的PatsEmu-RMDS系統下, 資訊持續運作的情形下,
可以旁接API小程式或是TSHS-RMDS 去連結 RMDS-Proxy,
而RMDS-Proxy會把原本輸出給 PatsEmu-RMDS 的資訊 同時輸出給連上來的其他連線,
那麼就等同能在不影響原本的運作之下, 擷取路透當前輸出的所有訊息

圖中 RproxyTest 就是用API(PktEvCdll.dll)的範例,將所有路透的資訊直接秀出來
(於TSHS的說明頁中有 PktEvCdll API 連線 RMDS-Proxy 的處理範例 )

雖然API也可要求註冊商品, 不過這裏著重在側接資料, 因此以不發出任何要求的方式為主,
圖中可以看到 RproxyTest 與 PatsEmu-RMDS 都是連往 port 15306

現在改用現成的 TSHS-RMDS 直接當作側接工具,
可以複製執行檔到一個空的資料夾, 直接執行後會產生一個預設的 RMDS_DataSetFile.txt 設定,
因為是想要用作側接, 並沒有要要求註冊任何商品, 可把內容中的 '+' 改成 '-' 即可,
-IDN_SELECTFEED/NQH1,NQM1,NQU1,NQZ1
-IDN_SELECTFEED/NQH1m,NQM1m,NQU1m,NQZ1m

或者把內容刪除成空的檔案也行(檔案要留著)

幫 TSHS-RMDS 建立捷徑, 設定執行參數 /Host 127.0.0.1:15306 就可連上指定 RMDS-Proxy
這樣就能透過 TSHS-RMDS 的介面直接檢視所有商品的FID欄位內容了~

而TSHS架構的好處就是能把資料流完整分時保存下來, 不僅可供作即時架構中斷後的回補機能, 也能作為模擬與重複使用等其他應用,
所以於捷徑上可再增加執行參數 /Log 15306\ 便可以開始紀錄保存由 RMDS-Proxy 的所有訊息於工作路徑下指定的 15306\ 資料夾中

之後使用相同的 PktEvCdll API 連線, 不過要改連 TSHS-RMDS, 稍微設計一些篩選功能
以2017-11-20的 STWX7 為例, 想對早上08:45(am盤開盤)開始交易的過程進行分析,可從08:00作為進入點
pktevcapi 127.0.0.1:30031 20171120080000,00000000
獲得這樣的資料(每一行路透商品FID資訊 對應一行有解到的想看欄位)
STWX7       :1067=00:30:00,25=403.70,441=403.70,31=1,735=1,3386=20 NOV 2017,3855=1800110,4147=1800110,
 賣: 403.70
STWX7       :3855=1800111,22=402.30,436=402.30,30=1,730=1,4150=1800111,
 買: 402.30
STWX7       :25=403.50,441=403.50,31=1,735=1,3855=1800112,4147=1800112,
 賣: 403.50
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1800114,4147=1800114,
 賣: 376.90
STWX7       :3855=1800138,22=411.00,436=411.00,30=8,730=8,4150=1800138,
 買: 411.00
STWX7       :1067=00:30:02,25=375.90,441=375.90,31=6,735=6,3855=1802138,4147=1802138,
 賣: 375.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1802677,4147=1802677,
 賣: 376.90
STWX7       :25=374.90,441=374.90,31=6,735=6,3855=1802678,4147=1802678,
 賣: 374.90
STWX7       :3855=1803018,1067=00:30:03,22=415.00,436=415.00,30=3,730=3,4150=1803018,
 買: 415.00
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1803209,4147=1803209,
 賣: 376.90
STWX7       :25=373.90,441=373.90,31=6,735=6,3855=1803210,4147=1803210,
 賣: 373.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1803742,4147=1803742,
 賣: 376.90
STWX7       :25=372.90,441=372.90,31=6,735=6,3855=1803744,4147=1803744,
 賣: 372.90
STWX7       :1067=00:30:04,25=376.90,441=376.90,31=40,735=40,3855=1804288,4147=1804288,
 賣: 376.90
STWX7       :25=371.90,441=371.90,31=6,735=6,3855=1804289,4147=1804289,
 賣: 371.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1804832,4147=1804832,
 賣: 376.90
STWX7       :25=370.90,441=370.90,31=6,735=6,
 賣: 370.90
STWX7       :1067=00:30:05,25=376.90,441=376.90,31=40,735=40,3855=1805017,4147=1805017,
 賣: 376.90
STWX7       :25=369.90,441=369.90,31=6,735=6,3855=1805018,4147=1805018,
 賣: 369.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1805358,4147=1805358,
 賣: 376.90
STWX7       :25=368.90,441=368.90,31=6,735=6,
 賣: 368.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1805887,4147=1805887,
 賣: 376.90
STWX7       :25=367.90,441=367.90,31=6,735=6,3855=1805889,4147=1805889,
 賣: 367.90
STWX7       :1067=00:30:06,25=376.90,441=376.90,31=40,735=40,3855=1806438,4147=1806438,
 賣: 376.90
STWX7       :25=366.90,441=366.90,31=6,735=6,3855=1806440,4147=1806440,
 賣: 366.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1806983,4147=1806983,
 賣: 376.90
STWX7       :25=365.90,441=365.90,31=6,735=6,3855=1806984,4147=1806984,
 賣: 365.90
STWX7       :1067=00:30:07,25=376.90,441=376.90,31=40,735=40,3855=1807520,4147=1807520,
 賣: 376.90
STWX7       :25=364.90,441=364.90,31=6,735=6,3855=1807521,4147=1807521,
 賣: 364.90
STWX7       :1067=00:30:08,25=376.90,441=376.90,31=40,735=40,3855=1808067,4147=1808067,
 賣: 376.90
STWX7       :25=363.90,441=363.90,31=6,735=6,3855=1808069,4147=1808069,
 賣: 363.90
STWX7       :25=376.90,441=376.90,31=40,735=40,3855=1808592,4147=1808592,
 賣: 376.90
STWX7       :25=362.90,441=362.90,31=6,735=6,3855=1808594,4147=1808594,
 賣: 362.90
STWX7       :1067=00:30:09,25=376.90,441=376.90,31=40,735=40,3855=1809151,4147=1809151,
 賣: 376.90
STWX7       :25=362.80,441=362.80,31=6,735=6,3855=1809152,4147=1809152,
 賣: 362.80
STWX7       :1067=00:31:30,25=376.90,441=376.90,31=20,735=20,3855=1890035,4147=1890035,
 賣: 376.90
STWX7       :25=362.80,441=362.80,31=3,735=3,3855=1890037,4147=1890037,
 賣: 362.80
STWX7       :3855=2285781,1067=00:38:05,22=431.30,436=431.30,4150=2285781,5=00:38,
 買: 431.30
STWX7       :3855=2287478,22=415.00,436=415.00,4150=2287478,
 買: 415.00
STWX7       :11809=n/a,1704=00:45,7084=3,14260=n/a,3404=403.46,372=403.46,9227=n/a,3132=6696,9994=n/a,9258=n/a,32743=n/a,32=6696,32691=n/a,100=2701546.90,373=146,7085=18,6947=146,8672=692259671968332150,8273=403.10,32741=n/a,5387=3,32694=n/a,11786=n/a,
 *總量* 6696
STWX7       :7084=1,3132=6697,32=6697,100=2701950.00,373=147,7085=19,6947=147,8672=692259671968332151,5387=1,
 *總量* 6697
STWX7       :7084=2,3132=6699,32=6699,100=2702756.20,373=149,7085=20,6947=149,8672=692259671968332152,5387=2,
 *總量* 6699
STWX7       :7084=3,3132=6702,32=6702,100=2703965.50,373=152,7085=21,6947=152,8672=692259671968332153,5387=3,
 *總量* 6702
STWX7       :3132=6705,32=6705,100=2705174.80,373=155,7085=22,6947=155,8672=692259671968332154,
 *總量* 6705
STWX7       :7084=9,3132=6714,32=6714,100=2708802.70,373=164,7085=23,6947=164,8672=692259671968332155,5387=9,
 *總量* 6714
STWX7       :7084=3,3132=6717,32=6717,100=2710012.00,373=167,7085=24,6947=167,8672=692259671968332156,5387=3,
 *總量* 6717
STWX7       :3132=6720,32=6720,100=2711221.30,373=170,7085=25,6947=170,8672=692259671968332157,
 *總量* 6720
STWX7       :7084=2,3132=6722,32=6722,100=2712027.50,373=172,7085=26,6947=172,8672=692259671968332158,5387=2,
 *總量* 6722
STWX7       :7084=5,3132=6727,32=6727,100=2714043.00,373=177,7085=27,6947=177,8672=692259671968332159,5387=5,
 *總量* 6727
STWX7       :7084=8,3404=403.45,372=403.45,3132=6735,32=6735,100=2717267.80,373=185,7085=28,6947=185,8672=692259671968332160,5387=8,
 *總量* 6735
STWX7       :7084=4,3132=6739,32=6739,100=2718880.20,373=189,7085=29,6947=189,8672=692259671968332161,5387=4,
 *總量* 6739
STWX7       :7084=1,3132=6740,32=6740,100=2719283.30,373=190,7085=30,6947=190,8672=692259671968332162,5387=1,
 *總量* 6740
STWX7       :25=376.90,441=376.90,31=20,735=20,
 賣: 376.90
STWX7       :22=407.30,436=407.30,
 買: 407.30
STWX7       :25=390.00,441=390.00,31=17,735=17,
 賣: 390.00
STWX7       :22=407.20,436=407.20,30=9,730=9,
 買: 407.20
STWX7       :22=407.10,436=407.10,30=3,730=3,
 買: 407.10
STWX7       :3855=2700185,22=407.00,436=407.00,4150=2700185,
 買: 407.00
STWX7       :22=405.70,436=405.70,30=7,730=7,
 買: 405.70
STWX7       :22=405.00,436=405.00,30=8,730=8,
 買: 405.00
STWX7       :25=400.00,441=400.00,31=1,735=1,4147=2700185,
 賣: 400.00
STWX7       :3132=6741,32=6741,100=2719686.40,373=191,7085=31,6947=191,8672=692259671968332163,
 *總量* 6741
STWX7       :22=404.30,436=404.30,30=7,730=7,
 買: 404.30
STWX7       :22=404.00,436=404.00,
 買: 404.00
STWX7       :25=400.50,441=400.50,
 賣: 400.50
STWX7       :25=401.80,441=401.80,31=7,735=7,
 賣: 401.80
STWX7       :25=401.90,441=401.90,
 賣: 401.90
STWX7       :22=403.80,436=403.80,30=14,730=14,
 買: 403.80
STWX7       :25=402.20,441=402.20,31=22,735=22,3855=2700186,4147=2700186,
 賣: 402.20
STWX7       :22=403.20,436=403.20,30=8,730=8,
 買: 403.20
STWX7       :22=403.10,436=403.10,30=13,730=13,
 買: 403.10
STWX7       :3132=6742,32=6742,100=2720089.50,373=192,7085=32,6947=192,8672=692259671968332164,
 *總量* 6742
STWX7       :25=403.40,441=403.40,31=7,735=7,
 賣: 403.40
STWX7       :7084=6,3132=6748,32=6748,100=2722508.10,373=198,7085=33,6947=198,8672=692259671968332165,5387=6,
 *總量* 6748
STWX7       :7084=1,3132=6749,32=6749,100=2722911.20,373=199,7085=34,6947=199,8672=692259671968332166,5387=1,
 *總量* 6749
STWX7       :7084=6,3132=6755,32=6755,100=2725329.80,373=205,7085=35,6947=205,8672=692259671968332167,5387=6,
 *總量* 6755
STWX7       :7084=1,3132=6756,32=6756,100=2725732.90,373=206,7085=36,6947=206,8672=692259671968332168,5387=1,
 *總量* 6756
STWX7       :7084=7,3132=6763,32=6763,100=2728554.60,373=213,7085=37,6947=213,8672=692259671968332169,5387=7,
 *總量* 6763
STWX7       :7084=1,3132=6764,32=6764,100=2728957.70,373=214,7085=38,6947=214,8672=692259671968332170,5387=1,
 *總量* 6764
STWX7       :7084=7,3132=6771,32=6771,100=2731779.40,373=221,7085=39,6947=221,8672=692259671968332171,5387=7,
 *總量* 6771
STWX7       :7084=5,3132=6776,32=6776,100=2733794.90,373=226,7085=40,6947=226,8672=692259671968332172,5387=5,
 *總量* 6776
STWX7       :7084=1,3132=6777,32=6777,100=2734198.00,373=227,7085=41,6947=227,8672=692259671968332173,5387=1,
 *總量* 6777
STWX7       :3854=2700170,3900=692259671968332176,18=00:45,4756=1,56=0.00,11=0.00,379=00:45:00,77=4537,3132=6778,12770=n/a,16=20 NOV 2017,178=1,100=2734601.10,6=403.10,32=6778,32696=n/a,14=1,
 -- 00:45:00 --  成交: 403.10 *總量* 6778

STWX7       :178=2,3900=692259671968332177,3132=6780,77=4538,32=6780,100=2735407.30,
 *總量* 6780
STWX7       :3900=692259671968332178,3854=2700177,56=0.07,11=0.30,3132=6782,77=4539,32=6782,100=2736214.10,6=403.40,
 *總量* 6782 成交: 403.40
STWX7       :25=403.30,441=403.30,31=2,735=2,3855=2700233,4147=2700233,
 賣: 403.30
STWX7       :178=1,3900=692259671968332179,3854=2700336,56=0.00,11=0.00,3132=6783,77=4540,32=6783,100=2736617.20,6=403.10,14=2,
 *總量* 6783 成交: 403.10


結果發現, 08:00~08:45 有很多買賣價與成交量資訊, 但是沒有任何成交時間與成交價(FID 6),
可以搜尋log中文字內容 ",6=" 就能找到成交價的部分,
第一筆是發生在路透提供成交時間為 GMT 00:45:00 的地方,
相同的方式分析 STWamX7 所獲得的資料除了總量有固定的差距外, 其於資料幾乎都是一模一樣的,
只是STWam早上會清盤,如果都沒有來成交價,以系統時間與成交量紀錄到的tick在08:45:00之前會是空的成交價之原因,
而STW則是延續pm盤繼續交易,沒有清盤的動作,所以成交價維持在pm盤最後一筆成交的價位
(也因此前面的STWX7的資料並沒有發現 FID 19 或 47 的開盤價)

如果直接觀察 STWamX7 , 就可以發現與STWX7對應的同一筆有 FID 19 的資料, 提供了開盤價位 (與當筆成交價位是一致的)
STWamX7     :1067=00:30:00,25=403.70,441=403.70,31=1,735=1,3386=20 NOV 2017,3855=1800110,4147=1800110,
 賣: 403.70
STWamX7     :3855=1800111,22=402.30,436=402.30,30=1,730=1,4150=1800111,
 買: 402.30
STWamX7     :25=403.50,441=403.50,31=1,735=1,3855=1800112,4147=1800112,
 賣: 403.50
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1800114,4147=1800114,
 賣: 376.90
STWamX7     :3855=1800138,22=411.00,436=411.00,30=8,730=8,4150=1800138,
 買: 411.00
STWamX7     :1067=00:30:02,25=375.90,441=375.90,31=6,735=6,3855=1802138,4147=1802138,
 賣: 375.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1802677,4147=1802677,
 賣: 376.90
STWamX7     :25=374.90,441=374.90,31=6,735=6,3855=1802678,4147=1802678,
 賣: 374.90
STWamX7     :3855=1803018,1067=00:30:03,22=415.00,436=415.00,30=3,730=3,4150=1803018,
 買: 415.00
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1803209,4147=1803209,
 賣: 376.90
STWamX7     :25=373.90,441=373.90,31=6,735=6,3855=1803210,4147=1803210,
 賣: 373.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1803742,4147=1803742,
 賣: 376.90
STWamX7     :25=372.90,441=372.90,31=6,735=6,3855=1803744,4147=1803744,
 賣: 372.90
STWamX7     :1067=00:30:04,25=376.90,441=376.90,31=40,735=40,3855=1804288,4147=1804288,
 賣: 376.90
STWamX7     :25=371.90,441=371.90,31=6,735=6,3855=1804289,4147=1804289,
 賣: 371.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1804832,4147=1804832,
 賣: 376.90
STWamX7     :25=370.90,441=370.90,31=6,735=6,
 賣: 370.90
STWamX7     :1067=00:30:05,25=376.90,441=376.90,31=40,735=40,3855=1805017,4147=1805017,
 賣: 376.90
STWamX7     :25=369.90,441=369.90,31=6,735=6,3855=1805018,4147=1805018,
 賣: 369.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1805358,4147=1805358,
 賣: 376.90
STWamX7     :25=368.90,441=368.90,31=6,735=6,
 賣: 368.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1805887,4147=1805887,
 賣: 376.90
STWamX7     :25=367.90,441=367.90,31=6,735=6,3855=1805889,4147=1805889,
 賣: 367.90
STWamX7     :1067=00:30:06,25=376.90,441=376.90,31=40,735=40,3855=1806438,4147=1806438,
 賣: 376.90
STWamX7     :25=366.90,441=366.90,31=6,735=6,3855=1806440,4147=1806440,
 賣: 366.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1806983,4147=1806983,
 賣: 376.90
STWamX7     :25=365.90,441=365.90,31=6,735=6,3855=1806984,4147=1806984,
 賣: 365.90
STWamX7     :1067=00:30:07,25=376.90,441=376.90,31=40,735=40,3855=1807520,4147=1807520,
 賣: 376.90
STWamX7     :25=364.90,441=364.90,31=6,735=6,3855=1807521,4147=1807521,
 賣: 364.90
STWamX7     :1067=00:30:08,25=376.90,441=376.90,31=40,735=40,3855=1808067,4147=1808067,
 賣: 376.90
STWamX7     :25=363.90,441=363.90,31=6,735=6,3855=1808069,4147=1808069,
 賣: 363.90
STWamX7     :25=376.90,441=376.90,31=40,735=40,3855=1808592,4147=1808592,
 賣: 376.90
STWamX7     :25=362.90,441=362.90,31=6,735=6,3855=1808594,4147=1808594,
 賣: 362.90
STWamX7     :1067=00:30:09,25=376.90,441=376.90,31=40,735=40,3855=1809151,4147=1809151,
 賣: 376.90
STWamX7     :25=362.80,441=362.80,31=6,735=6,3855=1809152,4147=1809152,
 賣: 362.80
STWamX7     :1067=00:31:30,25=376.90,441=376.90,31=20,735=20,3855=1890035,4147=1890035,
 賣: 376.90
STWamX7     :25=362.80,441=362.80,31=3,735=3,3855=1890037,4147=1890037,
 賣: 362.80
STWamX7     :3855=2285781,1067=00:38:05,22=431.30,436=431.30,4150=2285781,5=00:38,
 買: 431.30
STWamX7     :3855=2287478,22=415.00,436=415.00,4150=2287478,
 買: 415.00
STWamX7     :1704=00:45,7084=3,3404=403.10,372=403.10,3132=3,32=3,100=1209.30,373=3,7085=1,6947=3,8672=692259671968332150,8273=403.10,5387=3,
 *總量* 3
STWamX7     :7084=1,3132=4,32=4,100=1612.40,373=4,7085=2,6947=4,8672=692259671968332151,5387=1,
 *總量* 4
STWamX7     :7084=2,3132=6,32=6,100=2418.60,373=6,7085=3,6947=6,8672=692259671968332152,5387=2,
 *總量* 6
STWamX7     :7084=3,3132=9,32=9,100=3627.90,373=9,7085=4,6947=9,8672=692259671968332153,5387=3,
 *總量* 9
STWamX7     :3132=12,32=12,100=4837.20,373=12,7085=5,6947=12,8672=692259671968332154,
 *總量* 12
STWamX7     :7084=9,3132=21,32=21,100=8465.10,373=21,7085=6,6947=21,8672=692259671968332155,5387=9,
 *總量* 21
STWamX7     :7084=3,3132=24,32=24,100=9674.40,373=24,7085=7,6947=24,8672=692259671968332156,5387=3,
 *總量* 24
STWamX7     :3132=27,32=27,100=10883.70,373=27,7085=8,6947=27,8672=692259671968332157,
 *總量* 27
STWamX7     :7084=2,3132=29,32=29,100=11689.90,373=29,7085=9,6947=29,8672=692259671968332158,5387=2,
 *總量* 29
STWamX7     :7084=5,3132=34,32=34,100=13705.40,373=34,7085=10,6947=34,8672=692259671968332159,5387=5,
 *總量* 34
STWamX7     :7084=8,3132=42,32=42,100=16930.20,373=42,7085=11,6947=42,8672=692259671968332160,5387=8,
 *總量* 42
STWamX7     :7084=4,3132=46,32=46,100=18542.60,373=46,7085=12,6947=46,8672=692259671968332161,5387=4,
 *總量* 46
STWamX7     :7084=1,3132=47,32=47,100=18945.70,373=47,7085=13,6947=47,8672=692259671968332162,5387=1,
 *總量* 47
STWamX7     :25=376.90,441=376.90,31=20,735=20,4147=2700183,
 賣: 376.90
STWamX7     :22=407.30,436=407.30,
 買: 407.30
STWamX7     :25=390.00,441=390.00,31=17,735=17,
 賣: 390.00
STWamX7     :22=407.20,436=407.20,30=9,730=9,
 買: 407.20
STWamX7     :22=407.10,436=407.10,30=3,730=3,
 買: 407.10
STWamX7     :22=407.00,436=407.00,
 買: 407.00
STWamX7     :22=405.70,436=405.70,30=7,730=7,
 買: 405.70
STWamX7     :22=405.00,436=405.00,30=8,730=8,
 買: 405.00
STWamX7     :25=400.00,441=400.00,31=1,735=1,
 賣: 400.00
STWamX7     :3132=48,32=48,100=19348.80,373=48,7085=14,6947=48,8672=692259671968332163,
 *總量* 48
STWamX7     :22=404.30,436=404.30,30=7,730=7,
 買: 404.30
STWamX7     :22=404.00,436=404.00,
 買: 404.00
STWamX7     :25=400.50,441=400.50,
 賣: 400.50
STWamX7     :25=401.80,441=401.80,31=7,735=7,
 賣: 401.80
STWamX7     :25=401.90,441=401.90,3855=2700184,4147=2700184,
 賣: 401.90
STWamX7     :22=403.80,436=403.80,30=14,730=14,4150=2700184,
 買: 403.80
STWamX7     :25=402.20,441=402.20,31=22,735=22,
 賣: 402.20
STWamX7     :22=403.20,436=403.20,30=8,730=8,
 買: 403.20
STWamX7     :22=403.10,436=403.10,30=13,730=13,
 買: 403.10
STWamX7     :3132=49,32=49,100=19751.90,373=49,7085=15,6947=49,8672=692259671968332164,
 *總量* 49
STWamX7     :204=403.10,59=403.40,57=403.10,735=7,3514=403.40,203=403.10,31=7,3512=403.40,25=403.40,441=403.40,
 賣: 403.40
STWamX7     :7084=6,3132=55,32=55,100=22170.50,373=55,7085=16,6947=55,8672=692259671968332165,5387=6,
 *總量* 55
STWamX7     :7084=1,3132=56,32=56,100=22573.60,373=56,7085=17,6947=56,8672=692259671968332166,5387=1,
 *總量* 56
STWamX7     :7084=6,3132=62,32=62,100=24992.20,373=62,7085=18,6947=62,8672=692259671968332167,5387=6,
 *總量* 62
STWamX7     :7084=1,3132=63,32=63,100=25395.30,373=63,7085=19,6947=63,8672=692259671968332168,5387=1,
 *總量* 63
STWamX7     :7084=7,3132=70,32=70,100=28217.00,373=70,7085=20,6947=70,8672=692259671968332169,5387=7,
 *總量* 70
STWamX7     :7084=1,3132=71,32=71,100=28620.10,373=71,7085=21,6947=71,8672=692259671968332170,5387=1,
 *總量* 71
STWamX7     :7084=7,3132=78,32=78,100=31441.80,373=78,7085=22,6947=78,8672=692259671968332171,5387=7,
 *總量* 78
STWamX7     :7084=5,3132=83,32=83,100=33457.30,373=83,7085=23,6947=83,8672=692259671968332172,5387=5,
 *總量* 83
STWamX7     :7084=1,3132=84,32=84,100=33860.40,373=84,7085=24,6947=84,8672=692259671968332173,5387=1,
 *總量* 84
STWamX7     :19=403.10,6258=2700170,12=403.10,285=00:45,379=00:45:00,32=85,286=00:45,6259=2700170,13=403.10,3854=2700170,3900=692259671968332176,11=0.00,287=00:45,3132=85,77=1,6=403.10,100=34263.50,18=00:45,6260=2700170,56=0.00,4756=1,16=20 NOV 2017,178=1,
 開盤: 403.10 -- 00:45:00 --  *總量* 85 成交: 403.10

STWamX7     :178=2,3900=692259671968332177,3132=87,77=2,32=87,100=35069.70,
 *總量* 87
STWamX7     :6259=2700177,12=403.40,372=403.11,11=0.30,3132=89,77=3,56=0.07,3404=403.11,3854=2700177,3900=692259671968332178,32=89,100=35876.50,6=403.40,14=1,
 *總量* 89 成交: 403.40
STWamX7     :4147=2700233,3855=2700233,3514=403.30,25=403.30,441=403.30,31=2,735=2,
 賣: 403.30
STWamX7     :178=1,3900=692259671968332179,3854=2700336,56=0.00,11=0.00,3132=90,77=4,32=90,100=36279.60,6=403.10,14=2,
 *總量* 90 成交: 403.10


最後比對SGX提供的Tick明細(WEBPXTICK_DT-20171120.zip)
可以發現 08:30:00~ 08:45:00 只有買賣價, 並且有穿價狀態的現象 (因為非交易時段不會成交)
084501才有成交,就是開盤價 403.10
Message Code
B : Bid
A : Ask
T : Traded
Time,Price,Msg_Code,Volume
083000,0000037690,A,00040
083000,0000041100,B,00008
083002,0000037490,A,00006
083003,0000037290,A,00006
083003,0000041500,B,00009
083004,0000037090,A,00006
083005,0000036790,A,00006
083006,0000036590,A,00006
083007,0000036490,A,00006
083008,0000036290,A,00006
083009,0000036280,A,00006
083010,0000036280,A,00006
083012,0000036280,A,00006
083014,0000036280,A,00006
083015,0000036280,A,00006
083016,0000036280,A,00006
083017,0000036280,A,00006
083018,0000036280,A,00006
083020,0000036280,A,00006
083031,0000036280,A,00006
083031,0000041500,B,00009
083033,0000041500,B,00009
083035,0000041500,B,00009
083038,0000036280,A,00006
083040,0000041500,B,00009
083043,0000041500,B,00009
083048,0000036280,A,00006
083055,0000041500,B,00009
083100,0000036280,A,00006
083106,0000036280,A,00006
083107,0000036280,A,00006
083108,0000036280,A,00006
083109,0000036280,A,00006
083110,0000036280,A,00006
083110,0000041500,B,00009
083111,0000036280,A,00006
083113,0000036280,A,00006
083114,0000041500,B,00009
083116,0000036280,A,00006
083117,0000036280,A,00006
083118,0000036280,A,00006
083121,0000041500,B,00009
083123,0000036280,A,00006
083124,0000036280,A,00006
083125,0000036280,A,00006
083126,0000036280,A,00006
083126,0000041500,B,00009
083127,0000036280,A,00006
083128,0000036280,A,00006
083129,0000036280,A,00006
083130,0000036280,A,00003
083130,0000041500,B,00009
083131,0000036280,A,00003
083131,0000041500,B,00009
083132,0000041500,B,00009
083133,0000041500,B,00009
083135,0000041500,B,00009
083141,0000036280,A,00003
083141,0000041500,B,00009
083142,0000041500,B,00009
083145,0000036280,A,00003
083145,0000041500,B,00009
083146,0000041500,B,00009
083148,0000036280,A,00003
083151,0000041500,B,00009
083157,0000036280,A,00003
083157,0000041500,B,00009
083158,0000036280,A,00003
083200,0000041500,B,00009
083201,0000036280,A,00003
083201,0000041500,B,00009
083204,0000036280,A,00003
083210,0000036280,A,00003
083210,0000041500,B,00009
083215,0000041500,B,00009
083217,0000041500,B,00009
083218,0000036280,A,00003
083220,0000041500,B,00009
083229,0000036280,A,00003
083229,0000041500,B,00009
083230,0000036280,A,00003
083233,0000036280,A,00003
083233,0000041500,B,00009
083234,0000036280,A,00003
083235,0000041500,B,00009
083238,0000036280,A,00003
083238,0000041500,B,00009
083239,0000036280,A,00003
083239,0000041500,B,00009
083240,0000036280,A,00003
083241,0000036280,A,00003
083241,0000041500,B,00009
083242,0000036280,A,00003
083243,0000036280,A,00003
083244,0000041500,B,00009
083245,0000036280,A,00003
083246,0000036280,A,00003
083246,0000041500,B,00009
083247,0000036280,A,00003
083248,0000041500,B,00009
083249,0000041500,B,00009
083250,0000041500,B,00009
083251,0000041500,B,00009
083253,0000041500,B,00009
083256,0000041500,B,00009
083257,0000036280,A,00003
083258,0000041500,B,00009
083259,0000041500,B,00009
083301,0000041500,B,00009
083302,0000041500,B,00009
083303,0000041500,B,00009
083304,0000041500,B,00009
083305,0000041500,B,00009
083307,0000041500,B,00009
083308,0000041500,B,00009
083309,0000041500,B,00009
083313,0000041500,B,00009
083314,0000041500,B,00009
083315,0000041500,B,00009
083316,0000041500,B,00009
083317,0000036280,A,00003
083317,0000041500,B,00009
083318,0000036280,A,00003
083318,0000041500,B,00009
083319,0000036280,A,00003
083319,0000041500,B,00009
083320,0000036280,A,00003
083320,0000041500,B,00009
083321,0000036280,A,00003
083321,0000041500,B,00009
083322,0000036280,A,00003
083322,0000041500,B,00009
083323,0000036280,A,00003
083323,0000041500,B,00009
083324,0000036280,A,00003
083325,0000036280,A,00003
083326,0000036280,A,00003
083327,0000036280,A,00003
083327,0000041500,B,00009
083328,0000036280,A,00003
083328,0000041500,B,00009
083329,0000036280,A,00003
083329,0000041500,B,00009
083330,0000036280,A,00003
083330,0000041500,B,00009
083331,0000041500,B,00009
083332,0000041500,B,00009
083333,0000041500,B,00009
083334,0000041500,B,00009
083335,0000041500,B,00009
083344,0000036280,A,00003
083358,0000041500,B,00009
083404,0000041500,B,00009
083417,0000036280,A,00003
083417,0000041500,B,00009
083418,0000036280,A,00003
083418,0000041500,B,00009
083426,0000036280,A,00003
083427,0000036280,A,00003
083433,0000036280,A,00003
083435,0000036280,A,00003
083435,0000041500,B,00009
083436,0000041500,B,00009
083437,0000041500,B,00009
083438,0000041500,B,00009
083439,0000041500,B,00009
083440,0000036280,A,00003
083440,0000041500,B,00009
083442,0000036280,A,00003
083443,0000036280,A,00003
083444,0000036280,A,00003
083445,0000036280,A,00003
083446,0000036280,A,00003
083446,0000041500,B,00009
083447,0000036280,A,00003
083449,0000036280,A,00003
083455,0000036280,A,00003
083500,0000036280,A,00003
083501,0000036280,A,00003
083503,0000041500,B,00009
083504,0000036280,A,00003
083504,0000041500,B,00009
083506,0000036280,A,00003
083507,0000036280,A,00003
083508,0000036280,A,00003
083514,0000036280,A,00003
083522,0000036280,A,00003
083530,0000036280,A,00003
083530,0000041500,B,00009
083531,0000041500,B,00009
083532,0000041500,B,00009
083533,0000041500,B,00009
083536,0000036280,A,00003
083541,0000036280,A,00007
083542,0000036280,A,00007
083554,0000036280,A,00007
083556,0000036280,A,00007
083556,0000041500,B,00009
083557,0000036280,A,00007
083557,0000041500,B,00009
083559,0000036280,A,00007
083600,0000036280,A,00007
083601,0000036280,A,00007
083602,0000036280,A,00007
083606,0000036280,A,00007
083607,0000036280,A,00007
083608,0000036280,A,00007
083609,0000036280,A,00007
083610,0000036280,A,00007
083611,0000036280,A,00007
083612,0000036280,A,00007
083614,0000036280,A,00007
083615,0000036280,A,00007
083618,0000036280,A,00007
083619,0000036280,A,00007
083620,0000036280,A,00007
083624,0000036280,A,00007
083628,0000036280,A,00007
083629,0000036280,A,00007
083630,0000036280,A,00007
083631,0000041500,B,00009
083633,0000036280,A,00007
083647,0000036280,A,00007
083655,0000041500,B,00009
083657,0000036280,A,00008
083701,0000036280,A,00008
083702,0000036280,A,00008
083703,0000036280,A,00008
083706,0000036280,A,00008
083710,0000036280,A,00008
083712,0000036280,A,00008
083717,0000041500,B,00009
083719,0000036280,A,00008
083722,0000041500,B,00009
083725,0000036280,A,00008
083727,0000041500,B,00009
083731,0000036280,A,00008
083733,0000036280,A,00008
083737,0000036280,A,00008
083738,0000041500,B,00009
083745,0000041500,B,00009
083752,0000041500,B,00009
083753,0000041500,B,00009
083759,0000041500,B,00009
083802,0000041500,B,00009
083804,0000036280,A,00008
083805,0000043130,B,00018
083807,0000041500,B,00009
083809,0000041500,B,00009
083812,0000041500,B,00009
083814,0000041500,B,00009
083815,0000036280,A,00008
083817,0000041500,B,00009
083818,0000036280,A,00008
083824,0000041500,B,00009
083839,0000041500,B,00009
083842,0000041500,B,00009
083850,0000041500,B,00009
083851,0000041500,B,00009
083854,0000041500,B,00009
083855,0000041500,B,00009
083856,0000036280,A,00010
083857,0000041500,B,00009
083858,0000036280,A,00010
083859,0000036280,A,00010
083902,0000036280,A,00010
083902,0000041500,B,00009
083903,0000041500,B,00009
083904,0000036280,A,00010
083908,0000041500,B,00009
083911,0000041500,B,00009
083913,0000036280,A,00010
083915,0000036280,A,00010
083917,0000041500,B,00009
083920,0000041500,B,00009
083925,0000041500,B,00009
083934,0000036280,A,00010
083936,0000041500,B,00009
083939,0000036280,A,00010
083939,0000041500,B,00009
083944,0000036280,A,00010
083949,0000036280,A,00010
083949,0000041500,B,00009
084003,0000036280,A,00010
084005,0000036280,A,00010
084005,0000041500,B,00009
084006,0000041500,B,00009
084008,0000041500,B,00009
084009,0000041500,B,00009
084010,0000041500,B,00009
084011,0000041500,B,00009
084014,0000041500,B,00009
084015,0000041500,B,00009
084016,0000041500,B,00009
084019,0000041500,B,00009
084020,0000041500,B,00009
084021,0000041500,B,00009
084023,0000041500,B,00009
084026,0000041500,B,00009
084027,0000041500,B,00009
084028,0000041500,B,00009
084029,0000041500,B,00009
084032,0000041500,B,00009
084033,0000041500,B,00009
084034,0000036280,A,00010
084034,0000041500,B,00009
084035,0000041500,B,00009
084039,0000041500,B,00009
084042,0000041500,B,00009
084046,0000041500,B,00009
084053,0000041500,B,00009
084054,0000041500,B,00009
084056,0000041500,B,00009
084059,0000036280,A,00010
084059,0000041500,B,00009
084104,0000036280,A,00010
084110,0000041500,B,00009
084112,0000036280,A,00008
084149,0000041500,B,00009
084152,0000041500,B,00009
084154,0000041500,B,00009
084159,0000041500,B,00009
084200,0000041500,B,00009
084201,0000041500,B,00009
084202,0000036280,A,00008
084203,0000041500,B,00009
084209,0000041500,B,00009
084211,0000041500,B,00009
084214,0000041500,B,00009
084215,0000041500,B,00009
084216,0000041500,B,00009
084217,0000041500,B,00009
084222,0000041500,B,00009
084223,0000041500,B,00009
084235,0000036280,A,00008
084236,0000036280,A,00008
084237,0000036280,A,00008
084241,0000036280,A,00008
084242,0000036280,A,00008
084243,0000036280,A,00008
084251,0000041500,B,00009
084252,0000041500,B,00009
084253,0000036280,A,00004
084253,0000041500,B,00009
084254,0000036280,A,00009
084257,0000036280,A,00009
084257,0000041500,B,00009
084258,0000041500,B,00009
084301,0000041500,B,00009
084304,0000041500,B,00009
084305,0000041500,B,00009
084313,0000041500,B,00009
084316,0000041500,B,00009
084317,0000036280,A,00009
084318,0000041500,B,00009
084319,0000041500,B,00009
084321,0000041500,B,00009
084324,0000041500,B,00009
084328,0000036280,A,00009
084328,0000041500,B,00009
084330,0000036280,A,00009
084331,0000036280,A,00009
084332,0000036280,A,00009
084334,0000036280,A,00009
084336,0000036280,A,00009
084336,0000041500,B,00009
084337,0000036280,A,00009
084342,0000041500,B,00009
084343,0000036280,A,00009
084344,0000041500,B,00009
084347,0000036280,A,00009
084353,0000036280,A,00009
084356,0000036280,A,00009
084356,0000041500,B,00009
084357,0000036280,A,00009
084400,0000041500,B,00009
084401,0000041500,B,00009
084404,0000036280,A,00009
084405,0000036280,A,00009
084406,0000036280,A,00009
084412,0000041500,B,00009
084416,0000036280,A,00009
084417,0000041500,B,00009
084420,0000041500,B,00009
084421,0000041500,B,00009
084422,0000036280,A,00009
084425,0000036280,A,00009
084426,0000041500,B,00009
084429,0000041500,B,00009
084431,0000036280,A,00009
084431,0000041500,B,00009
084432,0000041500,B,00009
084433,0000036280,A,00009
084434,0000041500,B,00009
084435,0000041500,B,00009
084436,0000041500,B,00009
084437,0000036280,A,00009
084437,0000041500,B,00009
084438,0000041500,B,00009
084439,0000036280,A,00009
084439,0000041500,B,00009
084441,0000041500,B,00009
084443,0000041500,B,00009
084444,0000041500,B,00009
084445,0000041500,B,00009
084447,0000036280,A,00009
084448,0000041500,B,00009
084449,0000041500,B,00009
084451,0000036280,A,00009
084452,0000036280,A,00009
084452,0000041500,B,00009
084453,0000036280,A,00009
084453,0000041500,B,00009
084454,0000036280,A,00009
084454,0000041500,B,00009
084455,0000036280,A,00009
084455,0000041500,B,00009
084456,0000036280,A,00009
084456,0000041500,B,00009
084457,0000041500,B,00009
084458,0000036280,A,00009
084458,0000041500,B,00009
084459,0000041500,B,00009
084500,0000040340,A,00015
084500,0000040320,B,00004
084501,0000040340,A,00021
084501,0000040330,B,00004
084501,0000040310,T,00003  <== 成交價 403.10 (開盤價)
084501,0000040310,T,00001
084501,0000040310,T,00002
084501,0000040310,T,00003
084501,0000040310,T,00003
084501,0000040310,T,00009
084501,0000040310,T,00003




都寫了一些怎樣程式?

張貼者:2017年10月29日 上午8:40Wei-Xiuang Wang   [ 已更新 2017年11月1日 上午6:13 ]


這裡作一個 string 和 strcpy 的簡單比較


程式的執行結果如下:


測試的結果 string 的方式所需費時較 strcpy 多好幾倍, 也就是 string 是比較慢的

往往相同的問題解決的方式很多, 有時候只需要能達到目的即可,
但是如果是需要高頻的處理, 效率就變的很重要...
因此常看到市面的行情相關軟體會有快市時的各種問題可見一般!

大學生解題系統中計算階層為例
解法當然很多, 但是效率有多大的差距可以看得到, 記憶體的用量也會有很大的不同

在簡單問題下或許差異不大, 不過一旦問題開始變複雜, 差距就會越來越大!

現在的APP市場就可以看到, 並非新就是好 而是要穩定然後反應快才能讓人願意使用,
APP評論中總是看到最多的不滿就是
 三部五時更版, 動不動就沒反應當掉, 強迫更版, 把用戶當白老鼠

所以寫程式真的要很小心很用心才行,
越小的地方越是不能忽略而且還要更加以重視才好!


10月最後一個星期日一過,就又看到一堆資訊產品哀鴻遍野...
拜託, 日光節約又不是什麼大問題, 10年如一日 依然沒改善嗎?!


透過Feed-Server/API輕鬆完成機房服務監測

張貼者:2017年9月26日 下午11:35Wei-Xiuang Wang   [ 已更新 2017年9月27日 上午10:49 ]


每次話題總是離不開行情,這裏洩漏一下系統還可以有這樣的玩法!

利用Feed-API回報資訊到Feed-Server上,就像是餵行情的概念一樣,
於Server端就能瞭解各主機負載狀態與行情是否有延遲的狀況

前篇已經介紹過透過Feed-Server/API建立行情系統(AGVS)有多簡單,
現在同樣的透過巧思來監測機房服務狀態,於Server介面就能一覽無遺,
如果利用行情的特性,也能將想要的狀態統一像Tick紀錄一樣保留下來,
或者透過API訂閱的方式重新設計來規劃log/event/message...等的需求

而這邊為了簡化(偷懶)設計也便於說明,
把Feed-API的小程式設計為每一個console只收集一台服務主機的資訊打到Feed-Server上,
由於是IP化的架構, 可以於Feed-Server端跑多個console收集遠端服務主機的狀態,
當然也可以於各服務主機上分別跑console小程式把資訊打回Feed-Sever,
如果是後者,還可以把主機的CPU/記憶體/磁碟空間等...各種資訊也都打回Feed-Server囉!

程式也是都一樣很簡單

收到Tick

                    if (caINSAPPid[0])
                    {
                        char caBuffer[256];
                        char *cpBuf = caBuffer;
                        cpBuf += sprintf(cpBuf,
                            "$%s,3=%u,93=%s,94=%s,95=%02d:%02d:%02d.%03d"
                            , caINSAPPid, uTotalVolume, caMonitorExch, caMonitorSym
                            , spLocalTime->wHour, spLocalTime->wMinute, spLocalTime->wSecond, spLocalTime->wMilliseconds
                        );

                        cpBuf++;//含ZE
                        fnPktEvFeeder_SendPacket('F', caBuffer, (cpBuf - caBuffer), false);
                    }


收到連線數回報

if (caINSAPPid[0])
            {
                int &connOnINSAPP = *(int *)(pkt.data.bpData + 1);
                char caBuffer[128];
                char *cpBuf = caBuffer;
                cpBuf += sprintf(cpBuf, "$%s,92=#%d", caINSAPPid, connOnINSAPP);

                cpBuf++;//含ZE
                fnPktEvFeeder_SendPacket('F', caBuffer, (cpBuf - caBuffer), false);
            }



台灣21:46時由總成交量可以觀察到主機fort04有明顯的延遲狀況!

雖然21:50時行情有跟上,但台灣23:25時主機fort04延遲的狀況又更嚴重!!

主機fort04於23:51後行情才又跟上...



CME MDP3.0的規劃與建置

張貼者:2015年3月2日 下午7:08Wei-Xiuang Wang   [ 已更新 2018年11月28日 上午3:06 ]


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

MDP3.0新的Channel的資料與流量可以參考CME頁面: Data Directly from the Market Data Platform

擷取CME 2018-11-26的資料, 依頻寬使用狀態排序後的內容如下:

Channel Daily Message Count Number of Messages at BW Peak Bandwidth (Mbps) Date/Time of Peak (24Hrs) Protocol Description
311 54,252,560 18,452 120.708 14:14:44 FIXBINARY CME Globex Equity Options
345 27,159,232 15,111 104.435 15:13:05 FIXBINARY CBOT Globex Interest Rate Options
383 63,588,791 23,998 88.566 12:54:50 FIXBINARY NYMEX Globex Crude & Crude Refined Options
317 12,473,761 14,502 69.22 08:34:30 FIXBINARY CME Globex Commodity Options
319 24,625,467 7,178 63.189 14:14:16 FIXBINARY CME Globex Equity Options - excludes E-mini S&P 500
382 93,842,074 34,243 57.435 08:23:01 FIXBINARY NYMEX Globex Crude & Crude Refined Futures
341 15,743,113 17,367 52.503 13:14:29 FIXBINARY CBOT Globex Commodity Options
312 37,041,329 24,368 46.421 13:18:51 FIXBINARY CME Globex Interest Rate Futures
361 13,790,117 9,246 41.069 10:28:11 FIXBINARY COMEX Globex Options
344 22,126,345 24,290 37.85 10:35:17 FIXBINARY CBOT Globex Interest Rate Futures
387 12,442,219 6,760 36.804 11:27:30 FIXBINARY NYMEX Globex Nat Gas & other Non-Crude Energy Options
346 6,839,066 14,823 29.814 09:38:34 FIXBINARY CBOT Globex Commodity Futures II
313 6,795,216 9,524 29.631 14:11:06 FIXBINARY CME Globex Interest Rate Options
321 10,843,792 8,008 27.128 08:02:10 FIXBINARY CME Globex FX Options II
386 33,888,018 15,861 27.038 11:11:06 FIXBINARY NYMEX Globex Nat Gas & other Non-Crude Energy Futures
360 9,480,073 7,442 22.85 11:44:50 FIXBINARY COMEX Globex Futures
315 11,584,605 5,171 17.273 08:02:10 FIXBINARY CME Globex FX Options
316 2,197,607 9,049 16.959 11:18:45 FIXBINARY CME Globex Commodity Futures
318 38,018,944 18,592 14.857 11:12:13 FIXBINARY CME Globex Equity Futures - excludes E-mini S&P 500
340 4,916,531 6,097 13.976 13:01:38 FIXBINARY CBOT Globex Commodity Futures
246 289,355 1,348 13.796 15:42:02 STREAMLINEFB Eris Exchange
201 9,401 3,205 12.795 08:32:27 STREAMLINEFB CME Cleared OTC
320 23,957,777 7,769 9.71 08:02:00 FIXBINARY CME Globex FX Futures II
310 5,889,183 7,422 8.349 14:59:59 FIXBINARY CME Globex Equity Futures
348 1,652,549 2,732 7.345 07:15:39 FIXBINARY CBOT Globex Interest Rate Futures II
343 937,862 883 7.092 09:37:02 FIXBINARY CBOT Globex Equity Index Options
314 12,489,535 5,787 7.002 19:40:41 FIXBINARY CME Globex FX Futures
212 3,407,773 723 5.996 14:47:31 STREAMLINEFB Bloomberg Indexes
210 18,511,901 671 5.677 14:24:01 STREAMLINEFB S&P Indexes
430 1,147,871 2,651 4.739 02:00:45 FIXBINARY BMD Globex Futures
211 11,256,051 469 3.692 10:21:49 STREAMLINEFB Dow Jones Indexes
460 673,762 1,313 3.348 13:01:38 FIXBINARY MGEX Globex Futures
342 4,050,513 3,190 3.272 09:36:11 FIXBINARY CBOT Globex Equity Index Futures
385 9,478 354 1.919 07:29:00 FIXBINARY NYMEX Globex Metals, Softs, & Alternative Market Options
384 721,032 857 1.268 09:12:15 FIXBINARY NYMEX Globex Metals, Softs, & Alternative Market Futures
431 10,576 1,748 1.094 08:31:05 FIXBINARY BMD Globex Options
461 12,227 126 0.907 09:32:18 FIXBINARY MGEX Globex Options
3 268,702 637 0.877 13:32:44 ITC CME Open Outcry (ITC 2.1)
100 435,542 572 0.771 13:38:11 ITC CBOT Open Outcry (ITC 2.1)
440 664,137 594 0.746 04:09:46 FIXBINARY DME Globex Futures
245 48,833 439 0.605 12:47:45 ITC COMEX Open Outcry (ITC 2.1)
450 114,019 50 0.548 14:00:00 FIXBINARY KRX Globex Futures
244 91,731 396 0.545 15:30:43 ITC NYMEX Open Outcry (ITC 2.1)
232 7,541 54 0.355 10:35:02 STREAMLINEFB NYMEX Block Trades
229 2,896 199 0.242 13:46:27 ITC DME Non-Globex
233 3,189 17 0.108 12:48:36 STREAMLINEFB COMEX Block Trades
231 2,901 12 0.081 10:26:12 STREAMLINEFB CBOT Block Trades
213 172,790 6 0.033 18:00:05 STREAMLINEFB CME CF Rates and Indexes
230 2,902 5 0.032 13:22:13 STREAMLINEFB CME Block Trades
380 2,924 15 0.014 17:00:00 FIXBINARY NYMEX Globex Emissions Futures
381 2,889 6 0.006 17:00:00 FIXBINARY NYMEX Globex Emissions Options
441 2,888 6 0.006 17:00:00 FIXBINARY DME Globex Options
234 2,882 1 0.004 02:18:56 STREAMLINEFB DME Block Trades
200 2,880 1 0.001 15:20:11 STREAMLINEFB CME Credit OTC




其他舊的相關文章:
PatsEmu-CME的商品篩選設定方式
CME市場商品分析規劃
CME FAST/Template Decode



多重數據庫( 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相關程式碼內容:




第 1 個 - 第 10 個,共 40 個