資訊系統/架構/產品‎ > ‎KGQ‎ > ‎GMDS相關文章‎ > ‎GMDS‎ > ‎

Quote-Manager 的簡易應用範例

張貼者:2011年2月27日 下午5:57Wei-Xiuang Wang   [ 已更新 2013年9月3日 上午1:01 ]
提供Quote-Manager針對一般接收程式的設計概念作為參考

1.透過轉碼程式接收固定長度格式的 RAWDATAFORMAT

可以設計結構如下

#pragma pack(push,1)

typedef struct
{
    char FunctionCode[2];
    char SecurityType[3];
    //... 略
    char Ch_Exchange[30];
    char TandemSymbol[10];
} CapitalRawData; //size 721 bytes

typedef struct
{
    union {
        CapitalRawData format;
        char caData[1];//於此與 caData[721] 同義
    } raw;
//基本資料
    char OpenTime1[16];
    char OpenTime2[16];
    char CloseTime1[16];
    char CloseTime2[16];
    int dotNum;
    int ExchangeGroup;
    int SymbolTableIndex;
    void *vpSymbolTableUnit;
    //... 略
} CapitalSymbolMemory;

#pragma pack(pop)

2. 當由GMDS's API收到商品行情時,使用Quote-Manager處理行情訊息

Quote-Manager提供兩個函式
//CreateItemQuoteMemory ==> 產生一個商品所需的記憶體結構對應空間
void * CreateItemQuoteMemory(const char *cpDBName, const char *cpItemName, const void *vpStructData, int iStructSize);
//GetItemQuoteMemory ==> 取得商品記憶體結構對應空間
void * GetItemQuoteMemory(const char *cpDBName, const char *cpItemName);

收到商品行情時, 透過 GetItemQuoteMemory 可以先知道商品是否已經存在於Memory
,如果不存在則可以使用 CreateItemQuoteMemory 建立商品處理之Memory空間,若有初值或預設內容等資料則建立時一併作處理

方式一,所有商品皆自動產建立產生,並開始運作處理
,以收到 'CBOT' 的 'S&P 500' 行情為例

CapitalSymbolMemory *spMemory = GetItemQuoteMemory("CBOT", "S&P 500");
if (!spMemory)
{
    CapitalSymbolMemory sMemory
    memset(&sMemory, 0, sizeof(sMemory));
    //依序由商品表(檔案或DB)取得該Symbol與相關小數位數、開收盤、休息時間、到期日與所屬交易所群組等資料填入 sMemory 結構中(包括RawData format裡有相關欄位的部份)
    spMemory = CreateItemQuoteMemory("CBOT", "S&P 500", &sMemory, sizeof(sMemory));
    //如果 spMemory 不為NULL, 代表該商品已正確保存在Quote-Manager中了
}
if (spMemory)
{
    //將由GMDS's API收到的Tag行情資料,更新到對應的結構當中(包括RawData結構中有對應的部份)
    //原本接收程式想收轉碼程式所獲得的部份, 就是這裏 spMemory->raw.format 直接Feed到目前的接收Queue中,
    //如此不再需要有轉碼程式這一層
    //由於GMDS提供的資訊比原本的轉碼程式多,例如含有到期日,若有來更新可考慮是否要回填DB?
}

方式二,依據商品表僅處理所需商品資訊
倘若習慣先有一商品表, 則程式一開始即透過Quote-Manager的 CreateItemQuoteMemory 函式調用, 先建立好所有商品的基本資料
,以 'CBOT' 的 'S&P 500' 為例

CapitalSymbolMemory sMemory, *spMemory;
memset(&sMemory, 0, sizeof(sMemory));
//依序由商品表(檔案或DB)取得該Symbol與相關小數位數、開收盤、休息時間、到期日與所屬交易所群組等資料填入 sMemory 結構中(包括RawData format裡有相關欄位的部份)
spMemory = CreateItemQuoteMemory("CBOT", "S&P 500", &sMemory, sizeof(sMemory));
//如果 spMemory 不為NULL, 代表該商品已正確保存在Quote-Manager中了

使用商品表的方式,於收到商品行情時, 若 GetItemQuoteMemory 為NULL則可以不處理, 也就是只處理商品表中所列商品
CapitalSymbolMemory *spMemory = GetItemQuoteMemory("CBOT", "S&P 500");
if (spMemory)
{
    //將由GMDS's API收到的Tag行情資料,更新到對應的結構當中(包括RawData結構中有對應的部份)
    //原本接收程式想收轉碼程式所獲得的部份, 就是這裏 spMemory->raw.format 直接Feed到目前的接收Queue中,
    //如此不再需要有轉碼程式這一層
    //由於GMDS提供的資訊比原本的轉碼程式多,例如含有到期日,若有來更新可考慮是否要回填DB?
}
else
{
    //如果有要利用來源資料反建立商品表的部份則可以在這裡設計
    spMemory = GetItemQuoteMemory("CBOT_NEW", "S&P 500");//使用不一樣的DBName,避開現行的商品表列
    if (!spMemory)
    {//這裡是利用 Quote-Manager 使針對新商品的處理只會處理一次
        spMemory = CreateItemQuoteMemory("CBOT", "S&P 500", &sMemory, sizeof(sMemory));
        if (spMemory)
        {
            //對檔案或DB作需要的處置
        }
    }
}


註解