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