forked from QuantBox/QuantBox_XAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLevel2UserApi.h
136 lines (107 loc) · 3.39 KB
/
Level2UserApi.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
#pragma once
#include "../include/DFITC_L2/DFITCL2Api.h"
#include "../include/ApiStruct.h"
#ifdef _WIN64
#pragma comment(lib, "../lib/QuantBox_Queue_x64.lib")
#else
#pragma comment(lib, "../include/DFITC_L2/win32/level2Api.lib")
#pragma comment(lib, "../lib/QuantBox_Queue_x86.lib")
#endif
#include <set>
#include <string>
#include <atomic>
#include <mutex>
#include <map>
#include <list>
#include <thread>
using namespace std;
using namespace DFITC_L2;
class CLevel2UserApi :public DFITCL2Spi
{
//请求数据包类型
enum RequestType
{
E_Init,
E_UserLoginField,
};
//请求数据包结构体
struct SRequest
{
RequestType type;
void* pBuf;
};
public:
CLevel2UserApi(void);
virtual ~CLevel2UserApi(void);
void Register(void* pMsgQueue);
void Connect(const string& szPath,
ServerInfoField* pServerInfo,
UserInfoField* pUserInfo);
void Disconnect();
void Subscribe(const string& szInstrumentIDs, const string& szExchageID);
void Unsubscribe(const string& szInstrumentIDs, const string& szExchageID);
void SubscribeAll();
void UnsubscribeAll();
private:
//数据包发送线程
//数据包发送线程
static void ProcessThread(CLevel2UserApi* 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 Subscribe(const set<string>& instrumentIDs, const string& szExchageID);
void Unsubscribe(const set<string>& instrumentIDs, const string& szExchageID);
//登录请求
void ReqUserLogin();
int ReqInit();
virtual void OnConnected();
virtual void OnDisconnected(int nReason);
virtual void OnRspUserLogin(struct ErrorRtnField * pErrorField);
virtual void OnRspSubscribeMarketData(struct ErrorRtnField * pErrorField);
virtual void OnRspUnSubscribeMarketData(struct ErrorRtnField * pErrorField);
virtual void OnRspSubscribeAll(struct ErrorRtnField * pErrorField);
virtual void OnRspUnSubscribeAll(struct ErrorRtnField * pErrorField);
virtual void OnBestAndDeep(MDBestAndDeep * const pQuote);
virtual void OnArbi(MDBestAndDeep * const pQuote);
virtual void OnTenEntrust(MDTenEntrust * const pQuote);
virtual void OnRealtime(MDRealTimePrice * const pQuote);
virtual void OnOrderStatistic(MDOrderStatistic * const pQuote);
virtual void OnMarchPrice(MDMarchPriceQty * const pQuote);
virtual void OnHeartBeatLost() { }
//检查是否出错
bool IsErrorRspInfo_Output(struct ErrorRtnField * pErrorField);//将出错消息送到消息队列
bool IsErrorRspInfo(struct ErrorRtnField * pErrorField); //不输出信息
private:
mutex m_csMapInstrumentIDs;
atomic<long> m_lRequestID; //请求ID,每次请求前自增
set<string> m_setInstrumentIDs;
DFITCL2Api* 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; //已发送请求池
};