Skip to content

Commit e384668

Browse files
committed
添加股票现货
1 parent 173514b commit e384668

4 files changed

Lines changed: 179 additions & 42 deletions

File tree

QuantBox.XAPI/Callback/BaseApi.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -258,17 +258,10 @@ private void _OnConnectionStatus(double double1, IntPtr ptr1, int size1)
258258
IsConnected = (ConnectionStatus.Done == status);
259259

260260
RspUserLoginField obj = default(RspUserLoginField);
261-
262-
switch(status)
261+
if(size1>0)
263262
{
264-
case ConnectionStatus.Logined:
265-
case ConnectionStatus.Disconnected:
266-
case ConnectionStatus.Doing:
267-
obj = PInvokeUtility.GetObjectFromIntPtr<RspUserLoginField>(ptr1);
268-
UserLoginField = obj;
269-
break;
270-
default:
271-
break;
263+
obj = PInvokeUtility.GetObjectFromIntPtr<RspUserLoginField>(ptr1);
264+
UserLoginField = obj;
272265
}
273266

274267
if (OnConnectionStatus_ != null)

QuantBox.XAPI/Extensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,18 @@ public static string ToFormattedString([In]this QuoteField field)
151151
Enum<OpenCloseType>.ToString(field.AskOpenClose), Enum<HedgeFlagType>.ToString(field.AskHedgeFlag), Enum<OpenCloseType>.ToString(field.BidOpenClose), Enum<HedgeFlagType>.ToString(field.BidHedgeFlag));
152152
}
153153

154-
public static string ToFormattedString([In]this RspUserLoginField field)
154+
public static string ToFormattedStringLong([In]this RspUserLoginField field)
155155
{
156156
return string.Format("[TradingDay={0};LoginTime={1};SessionID={2};ErrorID={3};ErrorMsg={4}]",
157157
field.TradingDay,field.LoginTime,field.SessionID,field.ErrorID,field.ErrorMsg());
158158
}
159159

160+
public static string ToFormattedStringShort([In]this RspUserLoginField field)
161+
{
162+
return string.Format("[ErrorID={0};ErrorMsg={1}]",
163+
field.ErrorID, field.ErrorMsg());
164+
}
165+
160166
public static string ToFormattedString([In]this QuoteRequestField field)
161167
{
162168
return string.Format("[TradingDay={0};InstrumentID={1};ExchangeID={2};QuoteID={3};QuoteTime={4}]",

QuantBox_KingstarStock_Trade/TraderApi.cpp

Lines changed: 162 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,28 @@ void __stdcall CTraderApi::OnReadPushData(ETX_APP_FUNCNO FuncNO, void* pEtxPushD
2727
//客户端实现推送回调函数
2828
void CTraderApi::_OnReadPushData(ETX_APP_FUNCNO FuncNO, void* pEtxPushData)
2929
{
30-
char szmsg[2048] = { 0 };
31-
32-
PST16203PushData pCJData = NULL;
33-
PST16204PushData pCDFDData = NULL;
34-
35-
if (ETX_16203 == FuncNO)
30+
switch (FuncNO)
31+
{
32+
case ETX_16203:
33+
OnPST16203PushData((PST16203PushData)pEtxPushData);
34+
break;
35+
case ETX_16204:
36+
OnPST16204PushData((PST16204PushData)pEtxPushData);
37+
break;
38+
default:
3639
{
37-
pCJData = (PST16203PushData)pEtxPushData;
40+
char szmsg[128] = { 0 };
41+
sprintf(szmsg, "无法识别的推送数据[%d]", FuncNO);
3842

39-
//cout << pCJData->cust_no << " " << pCJData->order_no << endl;
43+
ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField));
4044

45+
pField->ErrorID = FuncNO;
46+
strcpy(pField->ErrorMsg, szmsg);
47+
48+
m_msgQueue->Input_NoCopy(ResponeType::OnRtnError, m_msgQueue, this, true, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0);
4149
}
42-
else if (ETX_16204 == FuncNO)
43-
{
44-
//cout << pCDFDData->cust_no << " " << pCDFDData->order_no << endl;
45-
}
46-
else
47-
{
48-
sprintf(szmsg, "无法识别的推送数据[%d]", FuncNO);
49-
printf(szmsg);
50+
break;
5051
}
51-
52-
//ProcessThread(nullptr);
5352
}
5453

5554
void* __stdcall Query(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
@@ -94,8 +93,12 @@ int CTraderApi::_Init()
9493
{
9594
//网关地址与代理信息由客户自行配置(根据实际情况配置,无则不配置)
9695
//配置网关信息
96+
97+
char szPost[20] = { 0 };
98+
_itoa(m_ServerInfo.Port, szPost, 10);
99+
97100
SPX_API_SetParam(MAINSERVER_IP, m_ServerInfo.Address, &m_err_msg);
98-
SPX_API_SetParam(MAINSERVER_PORT, "8085", &m_err_msg);
101+
SPX_API_SetParam(MAINSERVER_PORT, szPost, &m_err_msg);
99102
//SPX_API_SetParam(BACKSERVER_IP, "127.0.0.1", &m_err_msg);
100103
//SPX_API_SetParam(BACKSERVER_PORT, "17990", &m_err_msg);
101104
//配置代理信息
@@ -108,14 +111,14 @@ int CTraderApi::_Init()
108111

109112
STInitPara init_para;
110113
init_para.pOnReadPushData = OnReadPushData;
111-
init_para.bWriteLog = true;
114+
init_para.bWriteLog = false;//这个有可能导致要用管理员权限才能读写目录
112115
init_para.emLogLevel = LL_INFO;
113116
init_para.nTimeOut = 60000;
114117

115-
m_msgQueue->Input_Copy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Uninitialized, 0, nullptr, 0, nullptr, 0, nullptr, 0);
118+
m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Uninitialized, 0, nullptr, 0, nullptr, 0, nullptr, 0);
116119

117120
bool bRet = SPX_API_Initialize(&init_para, &m_err_msg);
118-
//IsErrorRspInfo(&m_err_msg, 0, true);
121+
119122
if (!bRet)
120123
{
121124
RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
@@ -129,8 +132,31 @@ int CTraderApi::_Init()
129132
return 0;
130133
}
131134

135+
if (m_err_msg.error_no != 0)
136+
{
137+
RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
138+
139+
pField->ErrorID = m_err_msg.error_no;
140+
strcpy(pField->ErrorMsg, m_err_msg.msg);
141+
142+
m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Initialized, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
143+
}
144+
else
145+
{
146+
m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Initialized, 0, nullptr, 0, nullptr, 0, nullptr, 0);
147+
}
148+
132149
m_pApi = SPX_API_CreateHandle(&m_err_msg);
133-
IsErrorRspInfo(&m_err_msg, 0, true);
150+
if (m_pApi == nullptr)
151+
{
152+
RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
153+
154+
pField->ErrorID = m_err_msg.error_no;
155+
strcpy(pField->ErrorMsg, m_err_msg.msg);
156+
157+
m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
158+
return 0;
159+
}
134160

135161
ReqUserLogin();
136162

@@ -152,6 +178,7 @@ int CTraderApi::_ReqUserLogin(char type, void* pApi1, void* pApi2, double double
152178
{
153179
int row_num = 0;
154180
STTraderLoginRsp *p_login_rsp = nullptr;
181+
155182
bool bRet = SPX_API_Login(m_pApi, (STTraderLogin*)ptr1, &p_login_rsp, &row_num, &m_err_msg);
156183

157184
if (bRet && m_err_msg.error_no == 0)
@@ -168,10 +195,17 @@ int CTraderApi::_ReqUserLogin(char type, void* pApi1, void* pApi2, double double
168195
}
169196
}
170197
}
198+
else
199+
{
200+
RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField));
171201

202+
pField->ErrorID = m_err_msg.error_no;
203+
strcpy(pField->ErrorMsg, m_err_msg.msg);
204+
205+
m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
206+
return 0;
207+
}
172208

173-
//m_msgQueue->Input(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Logining, 0, nullptr, 0, nullptr, 0, nullptr, 0);
174-
//return m_pApi->ReqUserLogin((CThostFtdcReqUserLoginField*)ptr1, ++m_lRequestID);
175209
return 0;
176210
}
177211

@@ -281,4 +315,107 @@ void CTraderApi::Disconnect()
281315
delete m_msgQueue;
282316
m_msgQueue = nullptr;
283317
}
318+
}
319+
320+
char* CTraderApi::ReqOrderInsert(
321+
int OrderRef,
322+
OrderField* pOrder,int count)
323+
{
324+
if (count < 1)
325+
return nullptr;
326+
327+
STOrder order;
328+
order.sec_code;
329+
order.bs;
330+
order.market_order_flag;
331+
order.price;
332+
order.order_vol;
333+
order.order_prop;
334+
335+
return nullptr;
336+
}
337+
338+
void BuildOrder(OrderField* pIn, PSTOrder pOut)
339+
{
340+
341+
}
342+
343+
void CTraderApi::OnPST16203PushData(PST16203PushData pEtxPushData)
344+
{
345+
OrderIDType orderId = { 0 };
346+
//sprintf(orderId, "%d:%d:%s", pEtxPushData->batch_no, pOrder->SessionID, pOrder->OrderRef);
347+
//OrderIDType orderSydId = { 0 };
348+
349+
//{
350+
// // 保存原始订单信息,用于撤单
351+
352+
// unordered_map<string, CThostFtdcOrderField*>::iterator it = m_id_api_order.find(orderId);
353+
// if (it == m_id_api_order.end())
354+
// {
355+
// // 找不到此订单,表示是新单
356+
// CThostFtdcOrderField* pField = new CThostFtdcOrderField();
357+
// memcpy(pField, pOrder, sizeof(CThostFtdcOrderField));
358+
// m_id_api_order.insert(pair<string, CThostFtdcOrderField*>(orderId, pField));
359+
// }
360+
// else
361+
// {
362+
// // 找到了订单
363+
// // 需要再复制保存最后一次的状态,还是只要第一次的用于撤单即可?记下,这样最后好比较
364+
// CThostFtdcOrderField* pField = it->second;
365+
// memcpy(pField, pOrder, sizeof(CThostFtdcOrderField));
366+
// }
367+
368+
// // 保存SysID用于定义成交回报与订单
369+
// sprintf(orderSydId, "%s:%s", pOrder->ExchangeID, pOrder->OrderSysID);
370+
// m_sysId_orderId.insert(pair<string, string>(orderSydId, orderId));
371+
//}
372+
373+
//{
374+
// // 从API的订单转换成自己的结构体
375+
376+
// OrderField* pField = nullptr;
377+
// unordered_map<string, OrderField*>::iterator it = m_id_platform_order.find(orderId);
378+
// if (it == m_id_platform_order.end())
379+
// {
380+
// // 开盘时发单信息还没有,所以找不到对应的单子,需要进行Order的恢复
381+
// pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
382+
// strcpy(pField->ID, orderId);
383+
// strcpy(pField->InstrumentID, pOrder->InstrumentID);
384+
// strcpy(pField->ExchangeID, pOrder->ExchangeID);
385+
// pField->HedgeFlag = TThostFtdcHedgeFlagType_2_HedgeFlagType(pOrder->CombHedgeFlag[0]);
386+
// pField->Side = TThostFtdcDirectionType_2_OrderSide(pOrder->Direction);
387+
// pField->Price = pOrder->LimitPrice;
388+
// pField->StopPx = pOrder->StopPrice;
389+
// strncpy(pField->Text, pOrder->StatusMsg, sizeof(ErrorMsgType));
390+
// pField->OpenClose = TThostFtdcOffsetFlagType_2_OpenCloseType(pOrder->CombOffsetFlag[0]);
391+
// pField->Status = CThostFtdcOrderField_2_OrderStatus(pOrder);
392+
// pField->Qty = pOrder->VolumeTotalOriginal;
393+
// pField->Type = CThostFtdcOrderField_2_OrderType(pOrder);
394+
// pField->TimeInForce = CThostFtdcOrderField_2_TimeInForce(pOrder);
395+
// pField->ExecType = ExecType::ExecNew;
396+
// strcpy(pField->OrderID, pOrder->OrderSysID);
397+
398+
399+
// // 添加到map中,用于其它工具的读取,撤单失败时的再通知等
400+
// m_id_platform_order.insert(pair<string, OrderField*>(orderId, pField));
401+
// }
402+
// else
403+
// {
404+
// pField = it->second;
405+
// strcpy(pField->ID, orderId);
406+
// pField->LeavesQty = pOrder->VolumeTotal;
407+
// pField->Price = pOrder->LimitPrice;
408+
// pField->Status = CThostFtdcOrderField_2_OrderStatus(pOrder);
409+
// pField->ExecType = CThostFtdcOrderField_2_ExecType(pOrder);
410+
// strcpy(pField->OrderID, pOrder->OrderSysID);
411+
// strncpy(pField->Text, pOrder->StatusMsg, sizeof(ErrorMsgType));
412+
// }
413+
414+
// m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, this, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
415+
//}
416+
}
417+
418+
void CTraderApi::OnPST16204PushData(PST16204PushData pEtxPushData)
419+
{
420+
284421
}

QuantBox_KingstarStock_Trade/TraderApi.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,9 @@ class CTraderApi
6666
UserInfoField* pUserInfo);
6767
void Disconnect();
6868

69-
//char* ReqOrderInsert(
70-
// int OrderRef,
71-
// OrderField* pOrder1,
72-
// OrderField* pOrder2);
69+
char* ReqOrderInsert(
70+
int OrderRef,
71+
OrderField* pOrder, int count);
7372

7473
//char* ReqParkedOrderInsert(int OrderRef,
7574
// OrderField* pOrder1,
@@ -113,6 +112,8 @@ class CTraderApi
113112
void ReqUserLogin();
114113
int _ReqUserLogin(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
115114

115+
void OnPST16203PushData(PST16203PushData pEtxPushData);
116+
void OnPST16204PushData(PST16204PushData pEtxPushData);
116117

117118
//friend void* Send(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
118119

@@ -231,9 +232,9 @@ class CTraderApi
231232

232233
int m_nSleep;
233234

234-
//unordered_map<string, OrderField*> m_id_platform_order;
235+
unordered_map<string, OrderField*> m_id_platform_order;
235236
//unordered_map<string, CThostFtdcOrderField*> m_id_api_order;
236-
//unordered_map<string, string> m_sysId_orderId;
237+
unordered_map<string, string> m_sysId_orderId;
237238

238239
//unordered_map<string, QuoteField*> m_id_platform_quote;
239240
//unordered_map<string, CThostFtdcQuoteField*> m_id_api_quote;

0 commit comments

Comments
 (0)