@@ -27,29 +27,28 @@ void __stdcall CTraderApi::OnReadPushData(ETX_APP_FUNCNO FuncNO, void* pEtxPushD
2727// 客户端实现推送回调函数
2828void 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
5554void * __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}
0 commit comments