forked from QuantBox/QuantBox_XAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTraderApi.h
245 lines (198 loc) · 9.12 KB
/
TraderApi.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#pragma once
#include "../include/CTP/ThostFtdcTraderApi.h"
#include "../include/ApiStruct.h"
//#include "../include/stringHash.h"
#include <set>
#include <list>
#include <map>
#include <string>
#include <mutex>
#include <atomic>
#include <thread>
#include <unordered_map>
using namespace std;
class CTraderApi :
public CThostFtdcTraderSpi
{
//请求数据包类型
enum RequestType
{
E_ReqAuthenticateField,
E_ReqUserLoginField,
E_SettlementInfoConfirmField,
E_QryInstrumentField,
E_InputOrderField,
E_InputOrderActionField,
E_InputQuoteField,
E_InputQuoteActionField,
E_ParkedOrderField,
E_QryTradingAccountField,
E_QryInvestorPositionField,
E_QryInvestorPositionDetailField,
E_QryInstrumentCommissionRateField,
E_QryInstrumentMarginRateField,
E_QryDepthMarketDataField,
E_QrySettlementInfoField,
E_QryOrderField,
E_QryTradeField,
E_QryQuoteField,
};
//请求数据包结构体
struct SRequest
{
RequestType type;
union{
CThostFtdcReqAuthenticateField ReqAuthenticateField;
CThostFtdcReqUserLoginField ReqUserLoginField;
CThostFtdcSettlementInfoConfirmField SettlementInfoConfirmField;
CThostFtdcQryDepthMarketDataField QryDepthMarketDataField;
CThostFtdcQryInstrumentField QryInstrumentField;
CThostFtdcQryInstrumentCommissionRateField QryInstrumentCommissionRateField;
CThostFtdcQryInstrumentMarginRateField QryInstrumentMarginRateField;
CThostFtdcQryInvestorPositionField QryInvestorPositionField;
CThostFtdcQryInvestorPositionDetailField QryInvestorPositionDetailField;
CThostFtdcQryTradingAccountField QryTradingAccountField;
CThostFtdcInputOrderField InputOrderField;
CThostFtdcInputOrderActionField InputOrderActionField;
CThostFtdcInputQuoteField InputQuoteField;
CThostFtdcInputQuoteActionField InputQuoteActionField;
CThostFtdcParkedOrderField ParkedOrderField;
CThostFtdcQrySettlementInfoField QrySettlementInfoField;
CThostFtdcQryOrderField QryOrderField;
CThostFtdcQryTradeField QryTradeField;
CThostFtdcQryQuoteField QryQuoteField;
};
};
public:
CTraderApi(void);
virtual ~CTraderApi(void);
void Register(void* pMsgQueue);
void Connect(const string& szPath,
ServerInfoField* pServerInfo,
UserInfoField* pUserInfo);
void Disconnect();
char* ReqOrderInsert(
int OrderRef,
OrderField* pOrder1,
OrderField* pOrder2);
char* ReqParkedOrderInsert(int OrderRef,
OrderField* pOrder1,
OrderField* pOrder2);
int ReqOrderAction(const string& szId);
int ReqOrderAction(CThostFtdcOrderField *pOrder);
char* ReqQuoteInsert(
int QuoteRef,
QuoteField* pQuote);
int ReqQuoteAction(CThostFtdcQuoteField *pQuote);
int ReqQuoteAction(const string& szId);
void ReqQryTradingAccount();
void ReqQryInvestorPosition(const string& szInstrumentId);
void ReqQryInvestorPositionDetail(const string& szInstrumentId);
void ReqQryInstrument(const string& szInstrumentId, const string& szExchange);
void ReqQryInstrumentCommissionRate(const string& szInstrumentId);
void ReqQryInstrumentMarginRate(const string& szInstrumentId,TThostFtdcHedgeFlagType HedgeFlag = THOST_FTDC_HF_Speculation);
void ReqQryDepthMarketData(const string& szInstrumentId);
void ReqQrySettlementInfo(const string& szTradingDay);
void ReqQryOrder();
void ReqQryTrade();
void ReqQryQuote();
private:
void OnOrder(CThostFtdcOrderField *pOrder);
void OnTrade(CThostFtdcTradeField *pTrade);
void OnQuote(CThostFtdcQuoteField *pQuote);
//数据包发送线程
static void ProcessThread(CTraderApi* lpParam)
{
if (lpParam)
lpParam->RunInThread();
}
void RunInThread();
void StartThread();
void StopThread();
//指定数据包类型,生成对应数据包
SRequest * MakeRequestBuf(RequestType type);
//清除将发送请求包队列
void ReleaseRequestListBuf();
//清除已发送请求包池
void ReleaseRequestMapBuf();
//清除指定请求包池中指定包
void ReleaseRequestMapBuf(int nRequestID);
//添加到已经请求包池
void AddRequestMapBuf(int nRequestID,SRequest* pRequest);
//添加到将发送包队列
void AddToSendQueue(SRequest * pRequest);
void ReqAuthenticate();
void ReqUserLogin();
void ReqSettlementInfoConfirm();
//检查是否出错
bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);//向消息队列输出信息
bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo);//不输出信息
//连接
virtual void OnFrontConnected();
virtual void OnFrontDisconnected(int nReason);
//认证
virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
//下单
virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo);
//撤单
virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo);
//报单回报
virtual void OnRspQryOrder(CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder);
//成交回报
virtual void OnRspQryTrade(CThostFtdcTradeField *pTrade, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRtnTrade(CThostFtdcTradeField *pTrade);
//报价录入
virtual void OnRspQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnErrRtnQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo);
virtual void OnRspQryQuote(CThostFtdcQuoteField *pQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRtnQuote(CThostFtdcQuoteField *pQuote);
//报价撤单
virtual void OnRspQuoteAction(CThostFtdcInputQuoteActionField *pInputQuoteAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnErrRtnQuoteAction(CThostFtdcQuoteActionField *pQuoteAction, CThostFtdcRspInfoField *pRspInfo);
//仓位
virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRspQryInvestorPositionDetail(CThostFtdcInvestorPositionDetailField *pInvestorPositionDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRspQryInvestorPositionCombineDetail(CThostFtdcInvestorPositionCombineDetailField *pInvestorPositionCombineDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
//资金
virtual void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
//合约、手续费
virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, 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 OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
//请求查询投资者结算结果响应
virtual void OnRspQrySettlementInfo(CThostFtdcSettlementInfoField *pSettlementInfo, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
//其它
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRtnInstrumentStatus(CThostFtdcInstrumentStatusField *pInstrumentStatus);
private:
atomic<int> m_lRequestID; //请求ID,得保持自增
CThostFtdcRspUserLoginField m_RspUserLogin; //返回的登录成功响应,目前利用此内成员进行报单所属区分
OrderIDType m_orderInsert_Id;
mutex m_csOrderRef;
int m_nMaxOrderRef; //报单引用,用于区分报单,保持自增
CThostFtdcTraderApi* m_pApi; //交易API
void* m_msgQueue; //消息队列指针
string m_szPath; //生成配置文件的路径
ServerInfoField m_ServerInfo;
UserInfoField m_UserInfo;
int m_nSleep;
volatile bool m_bRunning;
thread* m_hThread;
mutex m_csList;
list<SRequest*> m_reqList; //将发送请求队列
mutex m_csMap;
map<int,SRequest*> m_reqMap; //已发送请求池
unordered_map<string, OrderField*> m_id_platform_order;
unordered_map<string, CThostFtdcOrderField*> m_id_api_order;
unordered_map<string, string> m_sysId_orderId;
unordered_map<string, QuoteField*> m_id_platform_quote;
unordered_map<string, CThostFtdcQuoteField*> m_id_api_quote;
unordered_map<string, string> m_sysId_quoteId;
};