上海期货交易所CTP行情和交易接入

概述

CTP的接入Demo

详细

 

本文档不介绍CTP的具体流程,具体流程请参考上海期货交易所文档(下载).

一、概述

 

1.CTP是上期技术,提供的国内期货行情和交易的接口,自推出以来,各大券商均架设了CTP技术的接入,引入策略算法便可以初步形成一个自动交易的系统,这也就吸引了很多对自动交易,策略交易感兴趣的各路高人来使用。

2.CTP难点在于,一个库提供了行情和交易两套接口,各自均有一套业务流程,而且两者在业务上还存在部分业务关联,也就是说还要处理两套之间的业务同步问题,没有一些C++基础的人很难开发好用的CTP库。

3.本Demo目标是,在Windows环境下做两个程序:

image.png

一个封装CTP行情和交易接口成一个库,尽可能在高内聚低耦合的情况下,保持代码清晰,通俗尽可能让;

一个执行程序很容易的去调用这个库,这里没有使用MFC或QT,直接采用控制台程序,很清晰的展示使用库。

 

二、准备环境

1.开发工具:visual studio 2015或以上版本(下载

本Demo采用Visual studio 2015 专业版 update 3

Windows7 64位

2.下载上期CTP库(下载

综合交易平台API下载,下载列表中的windows下64位库(最新(2015-05-15)),解压如下:

image.png

 

3.申请模拟账号(申请)

主页右上角,注册账号,例子中方便开箱即用,会使用我自己申请好的,请自行换成自己的帐号。

三、程序介绍

1.先看下Demo的运行效果。

image.png

 

2.程序目录结构

 

①Show all files模式下,VS工程目录结构如下图:

image.png

共两个项目,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

 

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
//定义一个管理器,管理行情接受
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回报接口

本模块提供给上层的接口,定义了一个虚基类:

1
2
3
4
5
6
7
8
9
class  CPacketReceiver
{
public:
    virtual void Receive(CBroadcastPacket &pkt) = 0;
};
 
这里运用到actor模式,接受UI订阅:
typedef vector<CPacketReceiver*> VPKTRECEIVER;
    VPKTRECEIVER            m_vPketReceiver;

③数据保存

数据收集,定义几个map

1
2
3
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

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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
//定义一个管理器,管理行情接受
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,如下:

1
2
CThostFtdcTraderApi* m_reqApi;
MyRecv         *m_RecvSpi;

②与UI通信

由于交易API用的比较频繁,而回报主要在初始化阶段和数据更新,没有定义回报接口,定义的是全局单例模式,直接共上层使用。

 

③数据管理

1
2
3
// 保存合约
map<string, CThostFtdcInstrumentField>                    m_mapInstrument;//合约ID,合约信息
map<wstring, map<wstring, map<wstring, CThostFtdcInstrumentField>>>   m_mapInstrument2;//交易所,板块,合约信息

 

3.程序注意点

①UI初始化:

调用TradeManager::InitCTP启动CTP模块,主模块会订阅注册:

1
MyCTPQuote::Instance()->Subscribe(this);

②交易模块与行情模块通信

当交易模块登陆成功后(通能说原子操作,来判断多条件满足),来调用行情的完成函数,已便行情模块来进行行情合约订阅

1
2
3
4
5
int Qry   = atomic_exchange(&MyCTPTrade::Instance()->m_bQryIns, false);
int QryOK = atomic_exchange(&MyCTPTrade::Instance()->m_bQryInsOK, true);
 
if(!Qry && QryOK)
    FinishQryInstrument();

③行情回报

收到行情回报,会调用下函数:

1
void MyCTPQuote::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)

并组织结构,向订阅派发:

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
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进行了写共享队列。

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
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大师发表,拒绝转载,转载需要作者授权

 

posted on   demo例子集  阅读(39890)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示