vnpy/vn.femas/vnfemastd/vnfemastd/vnfemastd.h
2016-07-02 11:12:56 +08:00

500 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//说明部分
/*
由于CTP API中和资金转账相关的函数太多
同时也已经有大量的客户端支持这些功能,
因此在这个Python封装中暂时选择只支持交易功能
*/
//系统
#include "stdafx.h"
#include <string>
#include <queue>
//Boost
#define BOOST_PYTHON_STATIC_LIB
#include <boost/python/module.hpp> //python封装
#include <boost/python/def.hpp> //python封装
#include <boost/python/dict.hpp> //python封装
#include <boost/python/object.hpp> //python封装
#include <boost/python.hpp> //python封装
#include <boost/thread.hpp> //任务队列的线程功能
#include <boost/bind.hpp> //任务队列的线程功能
#include <boost/any.hpp> //任务队列的任务实现
//API
#include "USTPFtdcTraderApi.h"
//命名空间
using namespace std;
using namespace boost::python;
using namespace boost;
//常量
#define ONFRONTCONNECTED 1
#define ONFRONTDISCONNECTED 2
#define ONHEARTBEATWARNING 3
#define ONPACKAGESTART 4
#define ONPACKAGEEND 5
#define ONRSPERROR 6
#define ONRSPUSERLOGIN 7
#define ONRSPUSERLOGOUT 8
#define ONRSPUSERPASSWORDUPDATE 9
#define ONRSPORDERINSERT 10
#define ONRSPORDERACTION 11
#define ONRTNFLOWMESSAGECANCEL 12
#define ONRTNTRADE 13
#define ONRTNORDER 14
#define ONERRRTNORDERINSERT 15
#define ONERRRTNORDERACTION 16
#define ONRTNINSTRUMENTSTATUS 17
#define ONRTNINVESTORACCOUNTDEPOSIT 18
#define ONRSPQRYORDER 19
#define ONRSPQRYTRADE 20
#define ONRSPQRYUSERINVESTOR 21
#define ONRSPQRYTRADINGCODE 22
#define ONRSPQRYINVESTORACCOUNT 23
#define ONRSPQRYINSTRUMENT 24
#define ONRSPQRYEXCHANGE 25
#define ONRSPQRYINVESTORPOSITION 26
#define ONRSPSUBSCRIBETOPIC 27
#define ONRSPQRYCOMPLIANCEPARAM 28
#define ONRSPQRYTOPIC 29
#define ONRSPQRYINVESTORFEE 30
#define ONRSPQRYINVESTORMARGIN 31
///-------------------------------------------------------------------------------------
///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<typename Data>
class ConcurrentQueue
{
private:
queue<Data> 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 CUstpFtdcTraderSpi
{
private:
CUstpFtdcTraderApi* api; //API对象
thread *task_thread; //工作线程指针向python中推送数据
ConcurrentQueue<Task> task_queue; //任务队列
public:
TdApi()
{
function0<void> 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);
///报文回调开始通知。当API收到一个报文后首先调用本方法然后是各数据域的回调最后是报文回调结束通知。
///@param nTopicID 主题代码(如私有流、公共流、行情流等)
///@param nSequenceNo 报文序号
virtual void OnPackageStart(int nTopicID, int nSequenceNo);
///报文回调结束通知。当API收到一个报文后首先调用报文回调开始通知然后是各数据域的回调最后调用本方法。
///@param nTopicID 主题代码(如私有流、公共流、行情流等)
///@param nSequenceNo 报文序号
virtual void OnPackageEnd(int nTopicID, int nSequenceNo);
///错误应答
virtual void OnRspError(CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///风控前置系统用户登录应答
virtual void OnRspUserLogin(CUstpFtdcRspUserLoginField *pRspUserLogin, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///用户退出应答
virtual void OnRspUserLogout(CUstpFtdcRspUserLogoutField *pRspUserLogout, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///用户密码修改应答
virtual void OnRspUserPasswordUpdate(CUstpFtdcUserPasswordUpdateField *pUserPasswordUpdate, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///报单录入应答
virtual void OnRspOrderInsert(CUstpFtdcInputOrderField *pInputOrder, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///报单操作应答
virtual void OnRspOrderAction(CUstpFtdcOrderActionField *pOrderAction, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///数据流回退通知
virtual void OnRtnFlowMessageCancel(CUstpFtdcFlowMessageCancelField *pFlowMessageCancel);
///成交回报
virtual void OnRtnTrade(CUstpFtdcTradeField *pTrade);
///报单回报
virtual void OnRtnOrder(CUstpFtdcOrderField *pOrder);
///报单录入错误回报
virtual void OnErrRtnOrderInsert(CUstpFtdcInputOrderField *pInputOrder, CUstpFtdcRspInfoField *pRspInfo);
///报单操作错误回报
virtual void OnErrRtnOrderAction(CUstpFtdcOrderActionField *pOrderAction, CUstpFtdcRspInfoField *pRspInfo);
///合约交易状态通知
virtual void OnRtnInstrumentStatus(CUstpFtdcInstrumentStatusField *pInstrumentStatus);
///账户出入金回报
virtual void OnRtnInvestorAccountDeposit(CUstpFtdcInvestorAccountDepositResField *pInvestorAccountDepositRes);
///报单查询应答
virtual void OnRspQryOrder(CUstpFtdcOrderField *pOrder, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///成交单查询应答
virtual void OnRspQryTrade(CUstpFtdcTradeField *pTrade, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///可用投资者账户查询应答
virtual void OnRspQryUserInvestor(CUstpFtdcRspUserInvestorField *pRspUserInvestor, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///交易编码查询应答
virtual void OnRspQryTradingCode(CUstpFtdcRspTradingCodeField *pRspTradingCode, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///投资者资金账户查询应答
virtual void OnRspQryInvestorAccount(CUstpFtdcRspInvestorAccountField *pRspInvestorAccount, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///合约查询应答
virtual void OnRspQryInstrument(CUstpFtdcRspInstrumentField *pRspInstrument, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///交易所查询应答
virtual void OnRspQryExchange(CUstpFtdcRspExchangeField *pRspExchange, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///投资者持仓查询应答
virtual void OnRspQryInvestorPosition(CUstpFtdcRspInvestorPositionField *pRspInvestorPosition, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///订阅主题应答
virtual void OnRspSubscribeTopic(CUstpFtdcDisseminationField *pDissemination, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///合规参数查询应答
virtual void OnRspQryComplianceParam(CUstpFtdcRspComplianceParamField *pRspComplianceParam, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///主题查询应答
virtual void OnRspQryTopic(CUstpFtdcDisseminationField *pDissemination, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///投资者手续费率查询应答
virtual void OnRspQryInvestorFee(CUstpFtdcInvestorFeeField *pInvestorFee, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
///投资者保证金率查询应答
virtual void OnRspQryInvestorMargin(CUstpFtdcInvestorMarginField *pInvestorMargin, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
//-------------------------------------------------------------------------------------
//task任务
//-------------------------------------------------------------------------------------
void processTask();
void processFrontConnected(Task task);
void processFrontDisconnected(Task task);
void processHeartBeatWarning(Task task);
//void processPackageStart(Task task);
//void processPackageEnd(Task task);
void processRspError(Task task);
void processRspUserLogin(Task task);
void processRspUserLogout(Task task);
void processRspUserPasswordUpdate(Task task);
void processRspOrderInsert(Task task);
void processRspOrderAction(Task task);
void processRtnFlowMessageCancel(Task task);
void processRtnTrade(Task task);
void processRtnOrder(Task task);
void processErrRtnOrderInsert(Task task);
void processErrRtnOrderAction(Task task);
void processRtnInstrumentStatus(Task task);
void processRtnInvestorAccountDeposit(Task task);
void processRspQryOrder(Task task);
void processRspQryTrade(Task task);
void processRspQryUserInvestor(Task task);
void processRspQryTradingCode(Task task);
void processRspQryInvestorAccount(Task task);
void processRspQryInstrument(Task task);
void processRspQryExchange(Task task);
void processRspQryInvestorPosition(Task task);
void processRspSubscribeTopic(Task task);
void processRspQryComplianceParam(Task task);
void processRspQryTopic(Task task);
void processRspQryInvestorFee(Task task);
void processRspQryInvestorMargin(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 onRspUserPasswordUpdate(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 onRtnFlowMessageCancel(dict data) {};
virtual void onRtnTrade(dict data) {};
virtual void onRtnOrder(dict data) {};
virtual void onErrRtnOrderInsert(dict data, dict error) {};
virtual void onErrRtnOrderAction(dict data, dict error) {};
virtual void onRtnInstrumentStatus(dict data) {};
virtual void onRtnInvestorAccountDeposit(dict data) {};
virtual void onRspQryOrder(dict data, dict error, int id, bool last) {};
virtual void onRspQryTrade(dict data, dict error, int id, bool last) {};
virtual void onRspQryUserInvestor(dict data, dict error, int id, bool last) {};
virtual void onRspQryTradingCode(dict data, dict error, int id, bool last) {};
virtual void onRspQryInvestorAccount(dict data, dict error, int id, bool last) {};
virtual void onRspQryInstrument(dict data, dict error, int id, bool last) {};
virtual void onRspQryExchange(dict data, dict error, int id, bool last) {};
virtual void onRspQryInvestorPosition(dict data, dict error, int id, bool last) {};
virtual void onRspSubscribeTopic(dict data, dict error, int id, bool last) {};
virtual void onRspQryComplianceParam(dict data, dict error, int id, bool last) {};
virtual void onRspQryTopic(dict data, dict error, int id, bool last) {};
virtual void onRspQryInvestorFee(dict data, dict error, int id, bool last) {};
virtual void onRspQryInvestorMargin(dict data, dict error, int id, bool last) {};
//-------------------------------------------------------------------------------------
//req:主动函数的请求字典
//-------------------------------------------------------------------------------------
void createFtdcTraderApi(string pszFlowPath = "");
void release();
void init();
int join();
int exit();
string getTradingDay();
void registerFront(string pszFrontAddress);
void registerNameServer(string pszNsAddress);
int registerCertificateFile(string pszCertFileName, string pszKeyFileName, string pszCaFileName, string pszKeyFilePassword);
void subscribePrivateTopic(int nType);
void subscribePublicTopic(int nType);
void subscribeUserTopic(int nType);
void setHeartbeatTimeout(int timeout);
int openRequestLog(string pszReqLogFileName);
int openResponseLog(string pszReqLogFileName);
int reqUserLogin(dict req, int nRequestID);
int reqUserLogout(dict req, int nRequestID);
int reqUserPasswordUpdate(dict req, int nRequestID);
int reqOrderInsert(dict req, int nRequestID);
int reqOrderAction(dict req, int nRequestID);
int reqQryOrder(dict req, int nRequestID);
int reqQryTrade(dict req, int nRequestID);
int reqQryUserInvestor(dict req, int nRequestID);
int reqQryTradingCode(dict req, int nRequestID);
int reqQryInvestorAccount(dict req, int nRequestID);
int reqQryInstrument(dict req, int nRequestID);
int reqQryExchange(dict req, int nRequestID);
int reqQryInvestorPosition(dict req, int nRequestID);
int reqSubscribeTopic(dict req, int nRequestID);
int reqQryComplianceParam(dict req, int nRequestID);
int reqQryTopic(dict req, int nRequestID);
int reqQryInvestorFee(dict req, int nRequestID);
int reqQryInvestorMargin(dict req, int nRequestID);
};