Quote-Manager 的簡易應用範例

張貼日期:Feb 28, 2011 1:57:24 AM

提供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作需要的處置

        }

    }

}