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