//说明部分 //系统 #include "stdafx.h" #include #include //Boost #define BOOST_PYTHON_STATIC_LIB #include //python封装 #include //python封装 #include //python封装 #include //python封装 #include //python封装 #include //任务队列的线程功能 #include //任务队列的线程功能 #include //任务队列的任务实现 //API #include "SecurityFtdcTraderApi.h" //命名空间 using namespace std; using namespace boost::python; using namespace boost; //常量 #define ONFRONTCONNECTED 1 #define ONFRONTDISCONNECTED 2 #define ONHEARTBEATWARNING 3 #define ONRSPERROR 4 #define ONRSPUSERLOGIN 5 #define ONRSPUSERLOGOUT 6 #define ONRSPORDERINSERT 7 #define ONRSPORDERACTION 8 #define ONRSPUSERPASSWORDUPDATE 9 #define ONRSPTRADINGACCOUNTPASSWORDUPDATE 10 #define ONRSPQRYEXCHANGE 11 #define ONRSPQRYINSTRUMENT 12 #define ONRSPQRYINVESTOR 13 #define ONRSPQRYTRADINGCODE 14 #define ONRSPQRYTRADINGACCOUNT 15 #define ONRSPQRYDEPTHMARKETDATA 16 #define ONRSPQRYBONDINTEREST 17 #define ONRSPQRYMARKETRATIONINFO 18 #define ONRSPQRYINSTRUMENTCOMMISSIONRATE 19 #define ONRSPQRYETFINSTRUMENT 20 #define ONRSPQRYETFBASKET 21 #define ONRSPQRYOFINSTRUMENT 22 #define ONRSPQRYSFINSTRUMENT 23 #define ONRSPQRYORDER 24 #define ONRSPQRYTRADE 25 #define ONRSPQRYINVESTORPOSITION 26 #define ONRTNORDER 27 #define ONRTNTRADE 28 #define ONERRRTNORDERINSERT 29 #define ONERRRTNORDERACTION 30 #define ONRSPFUNDOUTBYLIBER 31 #define ONRTNFUNDOUTBYLIBER 32 #define ONERRRTNFUNDOUTBYLIBER 33 #define ONRTNFUNDINBYBANK 34 #define ONRSPQRYFUNDTRANSFERSERIAL 35 #define ONRSPFUNDINTERTRANSFER 36 #define ONRSPQRYFUNDINTERTRANSFERSERIAL 37 #define ONRTNFUNDINTERTRANSFERSERIAL 38 #define ONERRRTNFUNDINTERTRANSFER 39 ///------------------------------------------------------------------------------------- ///API中的部分组件 ///------------------------------------------------------------------------------------- //GIL全局锁简化获取用, //用于帮助C++线程获得GIL锁,从而防止python崩溃 class PyLock { private: PyGILState_STATE gil_state; public: //在某个函数方法中创建该对象时,获得GIL锁 PyLock() { gil_state = PyGILState_Ensure(); } //在某个函数完成后销毁该对象时,解放GIL锁 ~PyLock() { PyGILState_Release(gil_state); } }; //任务结构体 struct Task { int task_name; //回调函数名称对应的常量 any task_data; //数据结构体 any task_error; //错误结构体 int task_id; //请求id bool task_last; //是否为最后返回 }; ///线程安全的队列 template class ConcurrentQueue { private: queue the_queue; //标准库队列 mutable mutex the_mutex; //boost互斥锁 condition_variable the_condition_variable; //boost条件变量 public: //存入新的任务 void push(Data const& data) { mutex::scoped_lock lock(the_mutex); //获取互斥锁 the_queue.push(data); //向队列中存入数据 lock.unlock(); //释放锁 the_condition_variable.notify_one(); //通知正在阻塞等待的线程 } //检查队列是否为空 bool empty() const { mutex::scoped_lock lock(the_mutex); return the_queue.empty(); } //取出 Data wait_and_pop() { mutex::scoped_lock lock(the_mutex); while (the_queue.empty()) //当队列为空时 { the_condition_variable.wait(lock); //等待条件变量通知 } Data popped_value = the_queue.front(); //获取队列中的最后一个任务 the_queue.pop(); //删除该任务 return popped_value; //返回该任务 } }; //从字典中获取某个建值对应的整数,并赋值到请求结构体对象的值上 void getInt(dict d, string key, int* value); //从字典中获取某个建值对应的浮点数,并赋值到请求结构体对象的值上 void getDouble(dict d, string key, double* value); //从字典中获取某个建值对应的字符串,并赋值到请求结构体对象的值上 void getChar(dict d, string key, char* value); ///------------------------------------------------------------------------------------- ///C++ SPI的回调函数方法实现 ///------------------------------------------------------------------------------------- //API的继承实现 class TdApi : public CSecurityFtdcTraderSpi { private: CSecurityFtdcTraderApi* api; //API对象 thread *task_thread; //工作线程指针(向python中推送数据) ConcurrentQueue task_queue; //任务队列 public: TdApi() { function0 f = boost::bind(&TdApi::processTask, this); thread t(f); this->task_thread = &t; }; ~TdApi() { }; //------------------------------------------------------------------------------------- //API回调函数 //------------------------------------------------------------------------------------- ///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 virtual void OnFrontConnected(); ///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 ///@param nReason 错误原因 /// 0x1001 网络读失败 /// 0x1002 网络写失败 /// 0x2001 接收心跳超时 /// 0x2002 发送心跳失败 /// 0x2003 收到错误报文 virtual void OnFrontDisconnected(int nReason); ///心跳超时警告。当长时间未收到报文时,该方法被调用。 ///@param nTimeLapse 距离上次接收报文的时间 virtual void OnHeartBeatWarning(int nTimeLapse); ///错误应答 virtual void OnRspError(CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///登录请求响应 virtual void OnRspUserLogin(CSecurityFtdcRspUserLoginField *pRspUserLogin, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///登出请求响应 virtual void OnRspUserLogout(CSecurityFtdcUserLogoutField *pUserLogout, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单录入请求响应 virtual void OnRspOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单操作请求响应 virtual void OnRspOrderAction(CSecurityFtdcInputOrderActionField *pInputOrderAction, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///用户口令更新请求响应 virtual void OnRspUserPasswordUpdate(CSecurityFtdcUserPasswordUpdateField *pUserPasswordUpdate, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///资金账户口令更新请求响应 virtual void OnRspTradingAccountPasswordUpdate(CSecurityFtdcTradingAccountPasswordUpdateField *pTradingAccountPasswordUpdate, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询交易所响应 virtual void OnRspQryExchange(CSecurityFtdcExchangeField *pExchange, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询合约响应 virtual void OnRspQryInstrument(CSecurityFtdcInstrumentField *pInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询投资者响应 virtual void OnRspQryInvestor(CSecurityFtdcInvestorField *pInvestor, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询交易编码响应 virtual void OnRspQryTradingCode(CSecurityFtdcTradingCodeField *pTradingCode, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询资金账户响应 virtual void OnRspQryTradingAccount(CSecurityFtdcTradingAccountField *pTradingAccount, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询行情响应 virtual void OnRspQryDepthMarketData(CSecurityFtdcDepthMarketDataField *pDepthMarketData, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询债券利息响应 virtual void OnRspQryBondInterest(CSecurityFtdcBondInterestField *pBondInterest, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询市值配售信息响应 virtual void OnRspQryMarketRationInfo(CSecurityFtdcMarketRationInfoField *pMarketRationInfo, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询合约手续费率响应 virtual void OnRspQryInstrumentCommissionRate(CSecurityFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询ETF合约响应 virtual void OnRspQryETFInstrument(CSecurityFtdcETFInstrumentField *pETFInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询ETF股票篮响应 virtual void OnRspQryETFBasket(CSecurityFtdcETFBasketField *pETFBasket, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询OF合约响应 virtual void OnRspQryOFInstrument(CSecurityFtdcOFInstrumentField *pOFInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询SF合约响应 virtual void OnRspQrySFInstrument(CSecurityFtdcSFInstrumentField *pSFInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询报单响应 virtual void OnRspQryOrder(CSecurityFtdcOrderField *pOrder, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询成交响应 virtual void OnRspQryTrade(CSecurityFtdcTradeField *pTrade, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询投资者持仓响应 virtual void OnRspQryInvestorPosition(CSecurityFtdcInvestorPositionField *pInvestorPosition, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单通知 virtual void OnRtnOrder(CSecurityFtdcOrderField *pOrder); ///成交通知 virtual void OnRtnTrade(CSecurityFtdcTradeField *pTrade); ///报单录入错误回报 virtual void OnErrRtnOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurityFtdcRspInfoField *pRspInfo); ///报单操作错误回报 virtual void OnErrRtnOrderAction(CSecurityFtdcOrderActionField *pOrderAction, CSecurityFtdcRspInfoField *pRspInfo); ///Liber发起出金应答 virtual void OnRspFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFundTransfer, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///Liber发起出金通知 virtual void OnRtnFundOutByLiber(CSecurityFtdcFundTransferField *pFundTransfer); ///Liber发起出金错误回报 virtual void OnErrRtnFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFundTransfer, CSecurityFtdcRspInfoField *pRspInfo); ///银行发起入金通知 virtual void OnRtnFundInByBank(CSecurityFtdcFundTransferField *pFundTransfer); ///资金转账查询应答 virtual void OnRspQryFundTransferSerial(CSecurityFtdcFundTransferField *pFundTransfer, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///资金内转应答 virtual void OnRspFundInterTransfer(CSecurityFtdcFundInterTransferField *pFundInterTransfer, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///资金内转流水查询应答 virtual void OnRspQryFundInterTransferSerial(CSecurityFtdcFundInterTransferSerialField *pFundInterTransferSerial, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///资金内转流水通知 virtual void OnRtnFundInterTransferSerial(CSecurityFtdcFundInterTransferSerialField *pFundInterTransferSerial); ///资金内转错误回报 virtual void OnErrRtnFundInterTransfer(CSecurityFtdcFundInterTransferField *pFundInterTransfer, CSecurityFtdcRspInfoField *pRspInfo); //------------------------------------------------------------------------------------- //task:任务 //------------------------------------------------------------------------------------- void processTask(); void processFrontConnected(Task task); void processFrontDisconnected(Task task); void processHeartBeatWarning(Task task); void processRspError(Task task); void processRspUserLogin(Task task); void processRspUserLogout(Task task); void processRspOrderInsert(Task task); void processRspOrderAction(Task task); void processRspUserPasswordUpdate(Task task); void processRspTradingAccountPasswordUpdate(Task task); void processRspQryExchange(Task task); void processRspQryInstrument(Task task); void processRspQryInvestor(Task task); void processRspQryTradingCode(Task task); void processRspQryTradingAccount(Task task); void processRspQryDepthMarketData(Task task); void processRspQryBondInterest(Task task); void processRspQryMarketRationInfo(Task task); void processRspQryInstrumentCommissionRate(Task task); void processRspQryETFInstrument(Task task); void processRspQryETFBasket(Task task); void processRspQryOFInstrument(Task task); void processRspQrySFInstrument(Task task); void processRspQryOrder(Task task); void processRspQryTrade(Task task); void processRspQryInvestorPosition(Task task); void processRtnOrder(Task task); void processRtnTrade(Task task); void processErrRtnOrderInsert(Task task); void processErrRtnOrderAction(Task task); void processRspFundOutByLiber(Task task); void processRtnFundOutByLiber(Task task); void processErrRtnFundOutByLiber(Task task); void processRtnFundInByBank(Task task); void processRspQryFundTransferSerial(Task task); void processRspFundInterTransfer(Task task); void processRspQryFundInterTransferSerial(Task task); void processRtnFundInterTransferSerial(Task task); void processErrRtnFundInterTransfer(Task task); //------------------------------------------------------------------------------------- //data:回调函数的数据字典 //error:回调函数的错误字典 //id:请求id //last:是否为最后返回 //i:整数 //------------------------------------------------------------------------------------- virtual void onFrontConnected(){}; virtual void onFrontDisconnected(int i){}; virtual void onHeartBeatWarning(int i){}; virtual void onRspError(dict error, int id, bool last) {}; virtual void onRspUserLogin(dict data, dict error, int id, bool last) {}; virtual void onRspUserLogout(dict data, dict error, int id, bool last) {}; virtual void onRspOrderInsert(dict data, dict error, int id, bool last) {}; virtual void onRspOrderAction(dict data, dict error, int id, bool last) {}; virtual void onRspUserPasswordUpdate(dict data, dict error, int id, bool last) {}; virtual void onRspTradingAccountPasswordUpdate(dict data, dict error, int id, bool last) {}; virtual void onRspQryExchange(dict data, dict error, int id, bool last) {}; virtual void onRspQryInstrument(dict data, dict error, int id, bool last) {}; virtual void onRspQryInvestor(dict data, dict error, int id, bool last) {}; virtual void onRspQryTradingCode(dict data, dict error, int id, bool last) {}; virtual void onRspQryTradingAccount(dict data, dict error, int id, bool last) {}; virtual void onRspQryDepthMarketData(dict data, dict error, int id, bool last) {}; virtual void onRspQryBondInterest(dict data, dict error, int id, bool last) {}; virtual void onRspQryMarketRationInfo(dict data, dict error, int id, bool last) {}; virtual void onRspQryInstrumentCommissionRate(dict data, dict error, int id, bool last) {}; virtual void onRspQryETFInstrument(dict data, dict error, int id, bool last) {}; virtual void onRspQryETFBasket(dict data, dict error, int id, bool last) {}; virtual void onRspQryOFInstrument(dict data, dict error, int id, bool last) {}; virtual void onRspQrySFInstrument(dict data, dict error, int id, bool last) {}; virtual void onRspQryOrder(dict data, dict error, int id, bool last) {}; virtual void onRspQryTrade(dict data, dict error, int id, bool last) {}; virtual void onRspQryInvestorPosition(dict data, dict error, int id, bool last) {}; virtual void onRtnOrder(dict data) {}; virtual void onRtnTrade(dict data) {}; virtual void onErrRtnOrderInsert(dict data, dict error) {}; virtual void onErrRtnOrderAction(dict data, dict error) {}; virtual void onRspFundOutByLiber(dict data, dict error, int id, bool last) {}; virtual void onRtnFundOutByLiber(dict data) {}; virtual void onErrRtnFundOutByLiber(dict data, dict error) {}; virtual void onRtnFundInByBank(dict data) {}; virtual void onRspQryFundTransferSerial(dict data, dict error, int id, bool last) {}; virtual void onRspFundInterTransfer(dict data, dict error, int id, bool last) {}; virtual void onRspQryFundInterTransferSerial(dict data, dict error, int id, bool last) {}; virtual void onRtnFundInterTransferSerial(dict data) {}; virtual void onErrRtnFundInterTransfer(dict data, dict error) {}; //------------------------------------------------------------------------------------- //req:主动函数的请求字典 //------------------------------------------------------------------------------------- void createFtdcTraderApi(string pszFlowPath = ""); void release(); void init(); int join(); int exit(); string getTradingDay(); void registerFront(string pszFrontAddress); void subscribePrivateTopic(int nType); void subscribePublicTopic(int nType); int reqUserLogin(dict req, int nRequestID); int reqUserLogout(dict req, int nRequestID); int reqOrderInsert(dict req, int nRequestID); int reqOrderAction(dict req, int nRequestID); int reqUserPasswordUpdate(dict req, int nRequestID); int reqTradingAccountPasswordUpdate(dict req, int nRequestID); int reqQryExchange(dict req, int nRequestID); int reqQryInstrument(dict req, int nRequestID); int reqQryInvestor(dict req, int nRequestID); int reqQryTradingCode(dict req, int nRequestID); int reqQryTradingAccount(dict req, int nRequestID); int reqQryDepthMarketData(dict req, int nRequestID); int reqQryBondInterest(dict req, int nRequestID); int reqQryMarketRationInfo(dict req, int nRequestID); int reqQryInstrumentCommissionRate(dict req, int nRequestID); int reqQryETFInstrument(dict req, int nRequestID); int reqQryETFBasket(dict req, int nRequestID); int reqQryOFInstrument(dict req, int nRequestID); int reqQrySFInstrument(dict req, int nRequestID); int reqQryOrder(dict req, int nRequestID); int reqQryTrade(dict req, int nRequestID); int reqQryInvestorPosition(dict req, int nRequestID); int reqFundOutByLiber(dict req, int nRequestID); int reqQryFundTransferSerial(dict req, int nRequestID); int reqFundInterTransfer(dict req, int nRequestID); int reqQryFundInterTransferSerial(dict req, int nRequestID); };