概述
詳細
本文檔不介紹CTP的具體流程,具體流程請參考上海期貨交易所文檔(下載).
一、概述
1.CTP是上期技術,提供的國內期貨行情和交易的接口,自推出以來,各大券商均架設了CTP技術的接入,引入策略算法便可以初步形成一個自動交易的系統,這也就吸引了很多對自動交易,策略交易感興趣的各路高人來使用。
2.CTP難點在於,一個庫提供了行情和交易兩套接口,各自均有一套業務流程,而且兩者在業務上還存在部分業務關聯,也就是說還要處理兩套之間的業務同步問題,沒有一些C++基礎的人很難開發好用的CTP庫。
3.本Demo目標是,在Windows環境下做兩個程序:

一個封裝CTP行情和交易接口成一個庫,盡可能在高內聚低耦合的情況下,保持代碼清晰,通俗盡可能讓;
一個執行程序很容易的去調用這個庫,這里沒有使用MFC或QT,直接采用控制台程序,很清晰的展示使用庫。
二、准備環境
1.開發工具:visual studio 2015或以上版本(下載)
本Demo采用Visual studio 2015 專業版 update 3
Windows7 64位
2.下載上期CTP庫(下載)
綜合交易平台API下載,下載列表中的windows下64位庫(最新(2015-05-15)),解壓如下:

3.申請模擬賬號(申請)
主頁右上角,注冊賬號,例子中方便開箱即用,會使用我自己申請好的,請自行換成自己的帳號。
三、程序介紹
1.先看下Demo的運行效果。

2.程序目錄結構
①Show all files模式下,VS工程目錄結構如下圖:

共兩個項目,CTPSample和CTPServer,CTPSample為封裝交易所CTP的動態庫,CTPServer為使用庫的UI程序。
②代碼目錄結構
bin64
-----CTP CTP產生的共享文件
-----Log 日志文件
config.cfg 配置文件
build
CTPServer.sln 存放工程文件
Src
------CTPSample DLL代碼
------CTPServer UI代碼
------Framwork 框架代碼,避免復雜,不做公開(這里主要提供日志,數據定義,可自己替換)
說明:confg.cfg主要保存了CTP的地址(其他均為非本Demo演示的主要功能):
[info]
CTPFront.trade1 = tcp://180.168.146.187:10030
CTPFront.quote1 = tcp://180.168.146.187:10031
CTPFront.trade2 = tcp://180.168.146.187:10001
CTPFront.quote2 = tcp://180.168.146.187:10011
CTPFront.trade3 = tcp://218.202.237.33:10002
CTPFront.quote3 = tcp://ctp1-md11.citicsf.com:41213
3.模塊介紹
CTPSample模塊
CTPBase.h 動態庫的導出定義
MyCTPQuote.h/MyCTPQuote.CPP 交易的封裝
MyCTPQuote.h/MyCTPQuote.cpp 行情的封裝
CTPServer模塊
TradeManager.h/TradeManager.cpp UI主邏輯
CTPServer.cpp main啟動
四、程序解析
1. CTPSample模塊之MyCTPQuote.h
//定義一個管理器,管理行情接受
class CTPSAMPLE_EXPORT MyCTPQuote
{
//嵌入行情回報類
class MyRecv : public CThostFtdcMdSpi
{
public:
MyRecv():m_Parent(nullptr) {};
~MyRecv() {};
void Bind(MyCTPQuote *Parent) { m_Parent = Parent; }
public:
///當客戶端與交易后台建立起通信連接時(還未登錄前),該方法被調用。
virtual void OnFrontConnected() { m_Parent->OnFrontConnected(); }
///當客戶端與交易后台通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
///@param nReason 錯誤原因
/// 0x1001 網絡讀失敗
/// 0x1002 網絡寫失敗
/// 0x2001 接收心跳超時
/// 0x2002 發送心跳失敗
/// 0x2003 收到錯誤報文
virtual void OnFrontDisconnected(int nReason) { m_Parent->OnFrontDisconnected(nReason); }
///心跳超時警告。當長時間未收到報文時,該方法被調用。
///@param nTimeLapse 距離上次接收報文的時間
virtual void OnHeartBeatWarning(int nTimeLapse) { m_Parent->OnHeartBeatWarning(nTimeLapse); }
///登錄請求響應
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUserLogin(pRspUserLogin, pRspInfo, nRequestID, bIsLast); }
///登出請求響應
virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUserLogout(pUserLogout, pRspInfo, nRequestID, bIsLast); }
///錯誤應答
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspError(pRspInfo, nRequestID, bIsLast); }
///訂閱行情應答
virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspSubMarketData(pSpecificInstrument, pRspInfo, nRequestID, bIsLast); }
///取消訂閱行情應答
virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUnSubMarketData(pSpecificInstrument, pRspInfo, nRequestID, bIsLast); }
///訂閱詢價應答
virtual void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspSubForQuoteRsp(pSpecificInstrument, pRspInfo, nRequestID, bIsLast); }
///取消訂閱詢價應答
virtual void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUnSubForQuoteRsp(pSpecificInstrument, pRspInfo, nRequestID, bIsLast); }
///深度行情通知
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) { m_Parent->OnRtnDepthMarketData(pDepthMarketData); }
///詢價通知
virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) { m_Parent->OnRtnForQuoteRsp(pForQuoteRsp); }
public:
MyCTPQuote *m_Parent;
};
//thread
public:
MyCTPQuote( );
~MyCTPQuote();
void setMainWidget(void *widget);
// 訂閱廣播報文
void Subscribe(CPacketReceiver *pPacketReceiver);
// 取消廣播報文訂閱
void Unsubscribe(CPacketReceiver *pPacketReceiver);
static MyCTPQuote *Instance();
void Init(const char *User, const char *pswd, const char *broker, const char *pszAddress);
void FinishQryInstrument();
void setLog(const string& str);
bool m_bLoginSuccessed;
public:
///////////////////////////////////////請求類函數,提供主要邏輯,供外部使用////////////////////////////////////////////////////////////////////////////
///用戶登錄請求
int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID)
{
return m_reqApi->ReqUserLogin(pReqUserLoginField, nRequestID );
}
///登出請求
int ReqUserLogout(CThostFtdcUserLogoutField *pUserLogout, int nRequestID) { return m_reqApi->ReqUserLogout(pUserLogout, nRequestID); }
///獲取當前交易日
///@retrun 獲取到的交易日
///@remark 只有登錄成功后,才能得到正確的交易日
const char *GetTradingDay() { return m_reqApi->GetTradingDay(); }
///訂閱行情。
///@param ppInstrumentID 合約ID
///@param nCount 要訂閱/退訂行情的合約個數
///@remark
int SubscribeMarketData(char *ppInstrumentID[], int nCount) { return m_reqApi->SubscribeMarketData(ppInstrumentID, nCount); }
///退訂行情。
///@param ppInstrumentID 合約ID
///@param nCount 要訂閱/退訂行情的合約個數
///@remark
int UnSubscribeMarketData(char *ppInstrumentID[], int nCount) { return m_reqApi->UnSubscribeMarketData(ppInstrumentID, nCount); }
public:
///////////////////////////////////////回報類函數,收到數據,更新本地行情信息////////////////////////////////////////////////////////////////////////////
///當客戶端與交易后台建立起通信連接時(還未登錄前),該方法被調用。
void OnFrontConnected();
///當客戶端與交易后台通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
///@param nReason 錯誤原因
/// 0x1001 網絡讀失敗
/// 0x1002 網絡寫失敗
/// 0x2001 接收心跳超時
/// 0x2002 發送心跳失敗
/// 0x2003 收到錯誤報文
void OnFrontDisconnected(int nReason);
///心跳超時警告。當長時間未收到報文時,該方法被調用。
///@param nTimeLapse 距離上次接收報文的時間
void OnHeartBeatWarning(int nTimeLapse);
///登錄請求響應
void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///登出請求響應
void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///錯誤應答
void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///訂閱行情應答
void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///取消訂閱行情應答
void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///訂閱詢價應答
void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///取消訂閱詢價應答
void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///深度行情通知
void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);
///詢價通知
void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp);
private:
CThostFtdcMdApi* m_reqApi;
MyRecv *m_RecvSpi;
map<string /*InstrumentID*/, CThostFtdcInstrumentField> m_mapInstrument;//合約ID,合約信息
map<string /*InstrumentID*/,CThostFtdcDepthMarketDataField /*Quotation*/> m_mapInstrumentQuote;//保存 合約ID-最新行情 對,合約ID唯一。
vector<string /*InstrumentID*/> m_vecInstrumentId;//合約ID
int requestID;
string m_TradingDay;
int m_session ;
int m_frontId ;
string OrderRef ;
mutex m_mutex;
///用戶登錄信息
CThostFtdcReqUserLoginField *m_userLoginInfo;
bool m_bQryInstrumentOK;
//用於給上層訂閱
typedef vector<CPacketReceiver*> VPKTRECEIVER;
VPKTRECEIVER m_vPketReceiver;
};
主要功能點:
①模塊管理:
CTP的行情模塊分兩塊,一個是同步查詢API(CThostFtdcMdApi),一個是異步回報API(CThostFtdcMdSpi),這里定義了一個包裝類,來管理這兩類API,即
MyRecv來封裝CThostFtdcMdSpi,CThostFtdcMdApi直接使用。
②給UI回報接口
本模塊提供給上層的接口,定義了一個虛基類:
class CPacketReceiver
{
public:
virtual void Receive(CBroadcastPacket &pkt) = 0;
};
這里運用到actor模式,接受UI訂閱:
typedef vector<CPacketReceiver*> VPKTRECEIVER;
VPKTRECEIVER m_vPketReceiver;
③數據保存
數據收集,定義幾個map
map<string /*InstrumentID*/, CThostFtdcInstrumentField> m_mapInstrument;//合約ID,合約信息 map<string /*InstrumentID*/,CThostFtdcDepthMarketDataField /*Quotation*/> m_mapInstrumentQuote;//保存 合約ID-最新行情 對,合約ID唯一。 vector<string /*InstrumentID*/> m_vecInstrumentId;//合約ID
2. CTPSample模塊之MyCTPTrade.h
//定義一個管理器,管理行情接受
class CTPSAMPLE_EXPORT MyCTPTrade
{
//嵌入行情回報類
class MyRecv : public CThostFtdcTraderSpi
{
public:
MyRecv():m_Parent(nullptr), m_nRequestId(0){};
~MyRecv() {};
void Bind(MyCTPTrade *Parent) { m_Parent = Parent; }
public:
///當客戶端與交易后台建立起通信連接時(還未登錄前),該方法被調用。
virtual void OnFrontConnected() { m_Parent->OnFrontConnected(); }
///當客戶端與交易后台通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
///@param nReason 錯誤原因
/// 0x1001 網絡讀失敗
/// 0x1002 網絡寫失敗
/// 0x2001 接收心跳超時
/// 0x2002 發送心跳失敗
/// 0x2003 收到錯誤報文
virtual void OnFrontDisconnected(int nReason) { m_Parent->OnFrontDisconnected(nReason); }
///客戶端認證響應
virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspAuthenticate(pRspAuthenticateField,pRspInfo, nRequestID, bIsLast); }
///心跳超時警告。當長時間未收到報文時,該方法被調用。
///@param nTimeLapse 距離上次接收報文的時間
virtual void OnHeartBeatWarning(int nTimeLapse) { m_Parent->OnHeartBeatWarning(nTimeLapse); }
///登錄請求響應
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUserLogin(pRspUserLogin, pRspInfo, nRequestID, bIsLast); }
///登出請求響應
virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{ m_Parent->OnRspUserLogout(pUserLogout, pRspInfo, nRequestID, bIsLast); }
///錯誤應答
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {m_Parent->OnRspError(pRspInfo, nRequestID, bIsLast);}
/*
///用戶口令更新請求響應
virtual void OnRspUserPasswordUpdate(CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///資金賬戶口令更新請求響應
virtual void OnRspTradingAccountPasswordUpdate(CThostFtdcTradingAccountPasswordUpdateField *pTradingAccountPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///報單錄入請求響應
virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///預埋單錄入請求響應
virtual void OnRspParkedOrderInsert(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///預埋撤單錄入請求響應
virtual void OnRspParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///報單操作請求響應
virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///查詢最大報單數量響應
virtual void OnRspQueryMaxOrderVolume(CThostFtdcQueryMaxOrderVolumeField *pQueryMaxOrderVolume, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///投資者結算結果確認響應
virtual void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///刪除預埋單響應
virtual void OnRspRemoveParkedOrder(CThostFtdcRemoveParkedOrderField *pRemoveParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///刪除預埋撤單響應
virtual void OnRspRemoveParkedOrderAction(CThostFtdcRemoveParkedOrderActionField *pRemoveParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///執行宣告錄入請求響應
virtual void OnRspExecOrderInsert(CThostFtdcInputExecOrderField *pInputExecOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///執行宣告操作請求響應
virtual void OnRspExecOrderAction(CThostFtdcInputExecOrderActionField *pInputExecOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///詢價錄入請求響應
virtual void OnRspForQuoteInsert(CThostFtdcInputForQuoteField *pInputForQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///報價錄入請求響應
virtual void OnRspQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///報價操作請求響應
virtual void OnRspQuoteAction(CThostFtdcInputQuoteActionField *pInputQuoteAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///批量報單操作請求響應
virtual void OnRspBatchOrderAction(CThostFtdcInputBatchOrderActionField *pInputBatchOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///期權自對沖錄入請求響應
virtual void OnRspOptionSelfCloseInsert(CThostFtdcInputOptionSelfCloseField *pInputOptionSelfClose, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///期權自對沖操作請求響應
virtual void OnRspOptionSelfCloseAction(CThostFtdcInputOptionSelfCloseActionField *pInputOptionSelfCloseAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///申請組合錄入請求響應
virtual void OnRspCombActionInsert(CThostFtdcInputCombActionField *pInputCombAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢報單響應
virtual void OnRspQryOrder(CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢成交響應
virtual void OnRspQryTrade(CThostFtdcTradeField *pTrade, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者持倉響應
virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢資金賬戶響應
virtual void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者響應
virtual void OnRspQryInvestor(CThostFtdcInvestorField *pInvestor, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢交易編碼響應
virtual void OnRspQryTradingCode(CThostFtdcTradingCodeField *pTradingCode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢合約保證金率響應
virtual void OnRspQryInstrumentMarginRate(CThostFtdcInstrumentMarginRateField *pInstrumentMarginRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢合約手續費率響應
virtual void OnRspQryInstrumentCommissionRate(CThostFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢交易所響應
virtual void OnRspQryExchange(CThostFtdcExchangeField *pExchange, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢產品響應
virtual void OnRspQryProduct(CThostFtdcProductField *pProduct, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
*/
///請求查詢合約響應
virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
m_Parent->OnRspQryInstrument(pInstrument, pRspInfo, nRequestID, bIsLast);
};
/*
///請求查詢行情響應
virtual void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者結算結果響應
virtual void OnRspQrySettlementInfo(CThostFtdcSettlementInfoField *pSettlementInfo, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢轉帳銀行響應
virtual void OnRspQryTransferBank(CThostFtdcTransferBankField *pTransferBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者持倉明細響應
virtual void OnRspQryInvestorPositionDetail(CThostFtdcInvestorPositionDetailField *pInvestorPositionDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢客戶通知響應
virtual void OnRspQryNotice(CThostFtdcNoticeField *pNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢結算信息確認響應
virtual void OnRspQrySettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者持倉明細響應
virtual void OnRspQryInvestorPositionCombineDetail(CThostFtdcInvestorPositionCombineDetailField *pInvestorPositionCombineDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///查詢保證金監管系統經紀公司資金賬戶密鑰響應
virtual void OnRspQryCFMMCTradingAccountKey(CThostFtdcCFMMCTradingAccountKeyField *pCFMMCTradingAccountKey, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢倉單折抵信息響應
virtual void OnRspQryEWarrantOffset(CThostFtdcEWarrantOffsetField *pEWarrantOffset, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資者品種/跨品種保證金響應
virtual void OnRspQryInvestorProductGroupMargin(CThostFtdcInvestorProductGroupMarginField *pInvestorProductGroupMargin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢交易所保證金率響應
virtual void OnRspQryExchangeMarginRate(CThostFtdcExchangeMarginRateField *pExchangeMarginRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢交易所調整保證金率響應
virtual void OnRspQryExchangeMarginRateAdjust(CThostFtdcExchangeMarginRateAdjustField *pExchangeMarginRateAdjust, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢匯率響應
virtual void OnRspQryExchangeRate(CThostFtdcExchangeRateField *pExchangeRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢二級代理操作員銀期權限響應
virtual void OnRspQrySecAgentACIDMap(CThostFtdcSecAgentACIDMapField *pSecAgentACIDMap, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢產品報價匯率
virtual void OnRspQryProductExchRate(CThostFtdcProductExchRateField *pProductExchRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢產品組
virtual void OnRspQryProductGroup(CThostFtdcProductGroupField *pProductGroup, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢做市商合約手續費率響應
virtual void OnRspQryMMInstrumentCommissionRate(CThostFtdcMMInstrumentCommissionRateField *pMMInstrumentCommissionRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢做市商期權合約手續費響應
virtual void OnRspQryMMOptionInstrCommRate(CThostFtdcMMOptionInstrCommRateField *pMMOptionInstrCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢報單手續費響應
virtual void OnRspQryInstrumentOrderCommRate(CThostFtdcInstrumentOrderCommRateField *pInstrumentOrderCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢資金賬戶響應
virtual void OnRspQrySecAgentTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢二級代理商資金校驗模式響應
virtual void OnRspQrySecAgentCheckMode(CThostFtdcSecAgentCheckModeField *pSecAgentCheckMode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢期權交易成本響應
virtual void OnRspQryOptionInstrTradeCost(CThostFtdcOptionInstrTradeCostField *pOptionInstrTradeCost, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢期權合約手續費響應
virtual void OnRspQryOptionInstrCommRate(CThostFtdcOptionInstrCommRateField *pOptionInstrCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢執行宣告響應
virtual void OnRspQryExecOrder(CThostFtdcExecOrderField *pExecOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢詢價響應
virtual void OnRspQryForQuote(CThostFtdcForQuoteField *pForQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢報價響應
virtual void OnRspQryQuote(CThostFtdcQuoteField *pQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢期權自對沖響應
virtual void OnRspQryOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢投資單元響應
virtual void OnRspQryInvestUnit(CThostFtdcInvestUnitField *pInvestUnit, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢組合合約安全系數響應
virtual void OnRspQryCombInstrumentGuard(CThostFtdcCombInstrumentGuardField *pCombInstrumentGuard, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢申請組合響應
virtual void OnRspQryCombAction(CThostFtdcCombActionField *pCombAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢轉帳流水響應
virtual void OnRspQryTransferSerial(CThostFtdcTransferSerialField *pTransferSerial, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢銀期簽約關系響應
virtual void OnRspQryAccountregister(CThostFtdcAccountregisterField *pAccountregister, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///報單通知
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder) {};
///成交通知
virtual void OnRtnTrade(CThostFtdcTradeField *pTrade) {};
///報單錄入錯誤回報
virtual void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo) {};
///報單操作錯誤回報
virtual void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo) {};
///合約交易狀態通知
virtual void OnRtnInstrumentStatus(CThostFtdcInstrumentStatusField *pInstrumentStatus) {};
///交易所公告通知
virtual void OnRtnBulletin(CThostFtdcBulletinField *pBulletin) {};
///交易通知
virtual void OnRtnTradingNotice(CThostFtdcTradingNoticeInfoField *pTradingNoticeInfo) {};
///提示條件單校驗錯誤
virtual void OnRtnErrorConditionalOrder(CThostFtdcErrorConditionalOrderField *pErrorConditionalOrder) {};
///執行宣告通知
virtual void OnRtnExecOrder(CThostFtdcExecOrderField *pExecOrder) {};
///執行宣告錄入錯誤回報
virtual void OnErrRtnExecOrderInsert(CThostFtdcInputExecOrderField *pInputExecOrder, CThostFtdcRspInfoField *pRspInfo) {};
///執行宣告操作錯誤回報
virtual void OnErrRtnExecOrderAction(CThostFtdcExecOrderActionField *pExecOrderAction, CThostFtdcRspInfoField *pRspInfo) {};
///詢價錄入錯誤回報
virtual void OnErrRtnForQuoteInsert(CThostFtdcInputForQuoteField *pInputForQuote, CThostFtdcRspInfoField *pRspInfo) {};
///報價通知
virtual void OnRtnQuote(CThostFtdcQuoteField *pQuote) {};
///報價錄入錯誤回報
virtual void OnErrRtnQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo) {};
///報價操作錯誤回報
virtual void OnErrRtnQuoteAction(CThostFtdcQuoteActionField *pQuoteAction, CThostFtdcRspInfoField *pRspInfo) {};
///詢價通知
virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) {};
///保證金監控中心用戶令牌
virtual void OnRtnCFMMCTradingAccountToken(CThostFtdcCFMMCTradingAccountTokenField *pCFMMCTradingAccountToken) {};
///批量報單操作錯誤回報
virtual void OnErrRtnBatchOrderAction(CThostFtdcBatchOrderActionField *pBatchOrderAction, CThostFtdcRspInfoField *pRspInfo) {};
///期權自對沖通知
virtual void OnRtnOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose) {};
///期權自對沖錄入錯誤回報
virtual void OnErrRtnOptionSelfCloseInsert(CThostFtdcInputOptionSelfCloseField *pInputOptionSelfClose, CThostFtdcRspInfoField *pRspInfo) {};
///期權自對沖操作錯誤回報
virtual void OnErrRtnOptionSelfCloseAction(CThostFtdcOptionSelfCloseActionField *pOptionSelfCloseAction, CThostFtdcRspInfoField *pRspInfo) {};
///申請組合通知
virtual void OnRtnCombAction(CThostFtdcCombActionField *pCombAction) {};
///申請組合錄入錯誤回報
virtual void OnErrRtnCombActionInsert(CThostFtdcInputCombActionField *pInputCombAction, CThostFtdcRspInfoField *pRspInfo) {};
///請求查詢簽約銀行響應
virtual void OnRspQryContractBank(CThostFtdcContractBankField *pContractBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢預埋單響應
virtual void OnRspQryParkedOrder(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢預埋撤單響應
virtual void OnRspQryParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢交易通知響應
virtual void OnRspQryTradingNotice(CThostFtdcTradingNoticeField *pTradingNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢經紀公司交易參數響應
virtual void OnRspQryBrokerTradingParams(CThostFtdcBrokerTradingParamsField *pBrokerTradingParams, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢經紀公司交易算法響應
virtual void OnRspQryBrokerTradingAlgos(CThostFtdcBrokerTradingAlgosField *pBrokerTradingAlgos, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///請求查詢監控中心用戶令牌
virtual void OnRspQueryCFMMCTradingAccountToken(CThostFtdcQueryCFMMCTradingAccountTokenField *pQueryCFMMCTradingAccountToken, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///銀行發起銀行資金轉期貨通知
virtual void OnRtnFromBankToFutureByBank(CThostFtdcRspTransferField *pRspTransfer) {};
///銀行發起期貨資金轉銀行通知
virtual void OnRtnFromFutureToBankByBank(CThostFtdcRspTransferField *pRspTransfer) {};
///銀行發起沖正銀行轉期貨通知
virtual void OnRtnRepealFromBankToFutureByBank(CThostFtdcRspRepealField *pRspRepeal) {};
///銀行發起沖正期貨轉銀行通知
virtual void OnRtnRepealFromFutureToBankByBank(CThostFtdcRspRepealField *pRspRepeal) {}; ///期貨發起銀行資金轉期貨通知
virtual void OnRtnFromBankToFutureByFuture(CThostFtdcRspTransferField *pRspTransfer) {};
///期貨發起期貨資金轉銀行通知
virtual void OnRtnFromFutureToBankByFuture(CThostFtdcRspTransferField *pRspTransfer) {};
///系統運行時期貨端手工發起沖正銀行轉期貨請求,銀行處理完畢后報盤發回的通知
virtual void OnRtnRepealFromBankToFutureByFutureManual(CThostFtdcRspRepealField *pRspRepeal) {};
///系統運行時期貨端手工發起沖正期貨轉銀行請求,銀行處理完畢后報盤發回的通知
virtual void OnRtnRepealFromFutureToBankByFutureManual(CThostFtdcRspRepealField *pRspRepeal) {};
///期貨發起查詢銀行余額通知
virtual void OnRtnQueryBankBalanceByFuture(CThostFtdcNotifyQueryAccountField *pNotifyQueryAccount) {};
///期貨發起銀行資金轉期貨錯誤回報
virtual void OnErrRtnBankToFutureByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo) {};
///期貨發起期貨資金轉銀行錯誤回報
virtual void OnErrRtnFutureToBankByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo) {};
///系統運行時期貨端手工發起沖正銀行轉期貨錯誤回報
virtual void OnErrRtnRepealBankToFutureByFutureManual(CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo) {};
///系統運行時期貨端手工發起沖正期貨轉銀行錯誤回報
virtual void OnErrRtnRepealFutureToBankByFutureManual(CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo) {};
///期貨發起查詢銀行余額錯誤回報
virtual void OnErrRtnQueryBankBalanceByFuture(CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo) {};
///期貨發起沖正銀行轉期貨請求,銀行處理完畢后報盤發回的通知
virtual void OnRtnRepealFromBankToFutureByFuture(CThostFtdcRspRepealField *pRspRepeal) {};
///期貨發起沖正期貨轉銀行請求,銀行處理完畢后報盤發回的通知
virtual void OnRtnRepealFromFutureToBankByFuture(CThostFtdcRspRepealField *pRspRepeal) {};
///期貨發起銀行資金轉期貨應答
virtual void OnRspFromBankToFutureByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///期貨發起期貨資金轉銀行應答
virtual void OnRspFromFutureToBankByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///期貨發起查詢銀行余額應答
virtual void OnRspQueryBankAccountMoneyByFuture(CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///銀行發起銀期開戶通知
virtual void OnRtnOpenAccountByBank(CThostFtdcOpenAccountField *pOpenAccount) {};
///銀行發起銀期銷戶通知
virtual void OnRtnCancelAccountByBank(CThostFtdcCancelAccountField *pCancelAccount) {};
///銀行發起變更銀行賬號通知
virtual void OnRtnChangeAccountByBank(CThostFtdcChangeAccountField *pChangeAccount) {};
*/
public:
//保證唯一
int m_nRequestId;
int GetRequestId() {return ++m_nRequestId; }
MyCTPTrade *m_Parent;
};
//thread
public:
MyCTPTrade();
~MyCTPTrade();
static MyCTPTrade *Instance();
void setMainWidget(void *widget);
void Init(const char *User, const char *pswd, const char *broker, const char *pszAddress);
map<string, CThostFtdcInstrumentField>& GetMapInstrument();
void setLog(const string& str);
bool m_bLoginSuccessed;
public:
///////////////////////////////////////請求類函數,提供主要邏輯,供外部使用////////////////////////////////////////////////////////////////////////////
///用戶登錄請求
int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID)
{
return m_reqApi->ReqUserLogin(pReqUserLoginField, nRequestID );
}
///登出請求
int ReqUserLogout(CThostFtdcUserLogoutField *pUserLogout, int nRequestID) { return m_reqApi->ReqUserLogout(pUserLogout, nRequestID); }
public:
///////////////////////////////////////回報類函數,收到數據,更新本地行情信息////////////////////////////////////////////////////////////////////////////
///當客戶端與交易后台建立起通信連接時(還未登錄前),該方法被調用。
void OnFrontConnected();
///當客戶端與交易后台通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
///@param nReason 錯誤原因
/// 0x1001 網絡讀失敗
/// 0x1002 網絡寫失敗
/// 0x2001 接收心跳超時
/// 0x2002 發送心跳失敗
/// 0x2003 收到錯誤報文
void OnFrontDisconnected(int nReason);
///心跳超時警告。當長時間未收到報文時,該方法被調用。
///@param nTimeLapse 距離上次接收報文的時間
void OnHeartBeatWarning(int nTimeLapse);
void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///登錄請求響應
void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///登出請求響應
void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
public:
atomic
<bool>
m_bQryIns;// 是否正在查詢合約,如果正在查詢,行情服務就不自己主動去訂閱行情,因為查詢合約完成后,會有訂閱行情的動作
atomic
<bool>
m_bQryInsOK;// 是否查詢合約成功,成功訂閱行情的動作
private:
CThostFtdcTraderApi* m_reqApi;
MyRecv *m_RecvSpi;
//vector
<string /*InstrumentID*/>
m_vecInstrumentId;//合約ID
//int requestID;
string m_TradingDay;
int m_session ;
int m_frontId ;
string m_serverOrderRef ;
int m_nOrderRef;
///用戶登錄信息
CThostFtdcReqUserLoginField *m_userLoginInfo;
mutex m_getInstru;
void *mainHandle;
// 保存合約
map<string, CThostFtdcInstrumentField> m_mapInstrument;//合約ID,合約信息
map<wstring, map<wstring, map<wstring, CThostFtdcInstrumentField>>> m_mapInstrument2;//交易所,板塊,合約信息
CConfigImpl* m_pConfig;
};
①模塊管理:
與CTP提供的行情庫類似,這里定義了API和封裝的回報API,如下:
CThostFtdcTraderApi* m_reqApi; MyRecv *m_RecvSpi;
②與UI通信
由於交易API用的比較頻繁,而回報主要在初始化階段和數據更新,沒有定義回報接口,定義的是全局單例模式,直接共上層使用。
③數據管理
// 保存合約 map<string, CThostFtdcInstrumentField> m_mapInstrument;//合約ID,合約信息 map<wstring, map<wstring, map<wstring, CThostFtdcInstrumentField>>> m_mapInstrument2;//交易所,板塊,合約信息
3.程序注意點
①UI初始化:
調用TradeManager::InitCTP啟動CTP模塊,主模塊會訂閱注冊:
MyCTPQuote::Instance()->Subscribe(this);
②交易模塊與行情模塊通信
當交易模塊登陸成功后(通能說原子操作,來判斷多條件滿足),來調用行情的完成函數,已便行情模塊來進行行情合約訂閱
int Qry = atomic_exchange(&MyCTPTrade::Instance()->m_bQryIns, false); int QryOK = atomic_exchange(&MyCTPTrade::Instance()->m_bQryInsOK, true); if(!Qry && QryOK) FinishQryInstrument();
③行情回報
收到行情回報,會調用下函數:
void MyCTPQuote::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
並組織結構,向訂閱派發:
CBroadcastPacket pack;
///深度行情通知
///每秒兩次行情
void MyCTPQuote::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
{
if (pDepthMarketData->OpenPrice >= LDBL_MAX)
pDepthMarketData->OpenPrice = 0;
if (pDepthMarketData->HighestPrice >= LDBL_MAX)
pDepthMarketData->HighestPrice = 0;
if (pDepthMarketData->LowestPrice >= LDBL_MAX)
pDepthMarketData->LowestPrice = 0;
if (pDepthMarketData->ClosePrice >= LDBL_MAX)
pDepthMarketData->ClosePrice = 0;
if (pDepthMarketData->PreClosePrice >= LDBL_MAX)
pDepthMarketData->PreClosePrice = 0;
string str = "Quote SDK 接收行情信息:InstrumentID:";
str += pDepthMarketData->InstrumentID ;
str += " TradingDay:"; str += pDepthMarketData->TradingDay;
str += " LastPrice:"; str += to_string(pDepthMarketData->LastPrice);
str += " Volume:"; str += to_string(pDepthMarketData->Volume);
str += " OpenPrice:"; str += to_string(pDepthMarketData->OpenPrice);
str += " HighestPrice:"; str += to_string(pDepthMarketData->HighestPrice);
str += " LowestPrice:"; str += to_string(pDepthMarketData->LowestPrice);
str += " ClosePrice:"; str += to_string(pDepthMarketData->ClosePrice);
str += " PreClosePrice:"; str += to_string(pDepthMarketData->PreClosePrice);
str += " UpdateTime:"; str += pDepthMarketData->UpdateTime;
CRLog(E_APPINFO, str.c_str());
//本地保存
//轉發到界面
//CThostFtdcDepthMarketDataField DepthMarketData;
//memcpy_s(&DepthMarketData, sizeof(DepthMarketData) ,pDepthMarketData , sizeof(CThostFtdcDepthMarketDataField));
//m_mapInstrumentQuote[pDepthMarketData->InstrumentID] = DepthMarketData;
m_mapInstrumentQuote[pDepthMarketData->InstrumentID] = *pDepthMarketData;
pack.SetParameter("InstrumentId", pDepthMarketData->InstrumentID);
pack.SetParameter("TradingDay", pDepthMarketData->TradingDay);
pack.SetParameter("OpenPrice", pDepthMarketData->OpenPrice);
pack.SetParameter("HighestPrice", pDepthMarketData->HighestPrice);
pack.SetParameter("LowestPrice", pDepthMarketData->LowestPrice);
pack.SetParameter("ClosePrice", pDepthMarketData->ClosePrice);
pack.SetParameter("PreClosePrice", pDepthMarketData->PreClosePrice);
pack.SetParameter("UpperLimitPrice", pDepthMarketData->UpperLimitPrice);
pack.SetParameter("LowerLimitPrice", pDepthMarketData->LowerLimitPrice);
pack.SetParameter("AskPrice1", pDepthMarketData->AskPrice1);
pack.SetParameter("AskVolume1", pDepthMarketData->AskVolume1);
pack.SetParameter("BidPrice1", pDepthMarketData->BidPrice1);
pack.SetParameter("BidVolume1", pDepthMarketData->BidVolume1);
pack.SetParameter("LastPrice", pDepthMarketData->LastPrice);
pack.SetParameter("Volume", pDepthMarketData->Volume);
//給上層轉發
// 廣播報文
for (VPKTRECEIVER::iterator it = m_vPketReceiver.begin(); it < m_vPketReceiver.end(); it++)
{
(*it)->Receive(pack);
}
}
④界面處理回報數據
收到數據可以按照自己的邏輯處理,本Demo進行了寫共享隊列。
QUOTATION quo = { 0 };
void TradeManager::Receive(CBroadcastPacket &pkt)
{
unsigned int nLen = 0;
const char* pcBuf = pkt.Encode(nLen);
//分發給相應隊列處理
quo.Decode(pcBuf, nLen);
int uiCount = 0;
string sXQueName, sTmp;
for (vector< CXQueueIo<QUOTATION>* >::iterator it = m_vecQueueIo.begin(); it != m_vecQueueIo.end(); ++it)
{
uiCount++;
if (0 != *it)
{
(*it)->Enque(quo);
sXQueName = "XQUE" + strutils::ToString<unsigned int>(uiCount);
sXQueName += ".XQUE_NAME";
if (0 == m_pConfig->GetProperty(sXQueName, sTmp))
sXQueName = sTmp;
CRLog(E_APPINFO, "共享隊列XQueue[%s]寫完成", sXQueName.c_str());
}
}//end for
}
4.注意
內嵌Framwork所生成的動態庫為本Demo提供日志和共享內存隊列以及行情數據定義,可以自行定義替換,不存在bug,不影響演示,代碼由於版權問題,暫不能公開,若有需要,請聯系作者。
注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權
