///报单通知 void CTraderSpi::OnRtnOrder(CThostFtdcOrderField *pOrder) { std::cout << "--->>> " << "OnRtnOrder" << std::endl; if (IsMyOrder(pOrder)) { if (IsTradingOrder(pOrder)) ReqOrderAction(pOrder); else if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled) std::cout << "--->>> 撤单成功" << std::endl; } }
UINT IfEntry(LPVOID pParam){ IfInData * data = (IfInData*)pParam; CThostFtdcInputOrderField req; memset(&req, 0, sizeof(req)); ///经纪公司代码 strcpy(req.BrokerID, BROKER_ID); ///投资者代码 strcpy(req.InvestorID, INVESTOR_ID); ///合约代码 strcpy(req.InstrumentID, INSTRUMENT_ID); ///报单引用 //strcpy(req.OrderRef, ORDER_REF); sprintf(req.OrderRef,"%d",data->orf); ///用户代码 // TThostFtdcUserIDType UserID; ///报单价格条件: 限价 req.OrderPriceType = THOST_FTDC_OPT_LimitPrice; ///买卖方向: if(data->isbuy){ req.Direction = THOST_FTDC_D_Buy; } else{ req.Direction = THOST_FTDC_D_Sell; } ///组合开平标志: 开仓 if(!data->isflat){ req.CombOffsetFlag[0] = THOST_FTDC_OF_Open; } else{ req.CombOffsetFlag[0] = THOST_FTDC_OF_Close; } ///组合投机套保标志 req.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation; ///价格 ::EnterCriticalSection(&g_IfPrice); if(!data->isbuy){ req.LimitPrice = ifBid1 - 150.0; #ifdef _debug req.LimitPrice = ifAsk1 + 3; #endif } else{ req.LimitPrice = ifAsk1 + 150.0; #ifdef _debug req.LimitPrice = ifBid1 - 3; #endif } ::LeaveCriticalSection(&g_IfPrice); ///数量: 1 req.VolumeTotalOriginal = data->numif; ///有效期类型: 当日有效 req.TimeCondition = THOST_FTDC_TC_GFD; ///GTD日期 // TThostFtdcDateType GTDDate; ///成交量类型: 任何数量 req.VolumeCondition = THOST_FTDC_VC_AV; ///最小成交量: 1 req.MinVolume = 1; ///触发条件: 立即 req.ContingentCondition = THOST_FTDC_CC_Immediately; ///止损价 // TThostFtdcPriceType StopPrice; ///强平原因: 非强平 req.ForceCloseReason = THOST_FTDC_FCC_NotForceClose; ///自动挂起标志: 否 req.IsAutoSuspend = 0; ///业务单元 // TThostFtdcBusinessUnitType BusinessUnit; ///请求编号 // TThostFtdcRequestIDType RequestID; ///用户强评标志: 否 req.UserForceClose = 0; std::vector<CThostFtdcOrderField> orderRes; std::map<CString,std::vector<CThostFtdcOrderField>>::iterator iOrderRtn; std::map<CString,std::vector<CThostFtdcTradeField>>::iterator iTradeRtn; std::vector<CThostFtdcOrderField>::iterator iOrderRtnVec; std::vector<CThostFtdcTradeField>::iterator iTradeRtnVec; CThostFtdcInputOrderActionField reqNew = {'0','0',0,'0',0,0,0,'0','0','0','0',0,0,'0','0'};//命令动作新的修改 CThostFtdcOrderField orderOld; CString thisSysId;//系统编号,作为已成交合约的识别码 CString thisRef(req.OrderRef); double valueTraded = 0;//成交总价值 bool isBreakIn = false;//是否因为cancel命令提前终止消息循环 int volumeTraded = 0; int endVolumeThisTrade = 0; SYSTEMTIME sys; while(true){ GetLocalTime(&sys); if(sys.wHour == 9 && sys.wMinute <= 14){ //9:15前不下单,等待 continue; } else{ break; } } ::EnterCriticalSection(&REQUEST_ID_IF); int iResult = pUserApi->ReqOrderInsert(&req, ++iRequestID); endVolumeThisTrade = req.VolumeTotalOriginal; ::LeaveCriticalSection(&REQUEST_ID_IF); int lastpos = -1;//命令返回消息队列已经处理的位置 while(true){ //消息返回处理 int size = 0; SwitchToThread(); ::EnterCriticalSection(&ifDealRtn); iOrderRtn = ifOrderRtn.find(thisRef); if(iOrderRtn != ifOrderRtn.end() && iOrderRtn->second.size() != 0){//证明里边已经有了消息 //if(iOrderRtn->second.size() != 0){ size = iOrderRtn->second.size(); for(int k = 0/*lastpos + 1*/;k < size;k++){ iOrderRtnVec = iOrderRtn->second.begin() + k; orderOld = *iOrderRtnVec;//获取返回的报单命令,状态会不停变化,取到队列末尾,取最新的命令 thisSysId = iOrderRtnVec->OrderSysID;//获取报单编号 TRACE("报单引用=%s,报单编号=%s\r\n",iOrderRtnVec->OrderRef,thisSysId); /* //不管什么原因,均表示已经traded if(iOrderRtnVec->VolumeTraded == iOrderRtnVec->VolumeTotalOriginal){ TRACE("%s\r\n","已经成交,但是从OrderRtn返回"); ::EnterCriticalSection(&avgPriceOfIf); valueTraded = valueTraded + iOrderRtnVec->VolumeTraded * iOrderRtnVec->LimitPrice; avgpIf avg(data->numif,valueTraded / data->numif); avgPriceIf.push_back(avg); ::LeaveCriticalSection(&avgPriceOfIf); //删除键值 ifOrderRtn.erase(iOrderRtn); TRACE("准备脱离ifDealRtn临界区\r\n"); ::LeaveCriticalSection(&ifDealRtn); delete (IfInData*)pParam; return 0; } */ //如果取消,重新下单 if(iOrderRtnVec->OrderStatus == THOST_FTDC_OST_Canceled){ endVolumeThisTrade = endVolumeThisTrade - (iOrderRtnVec->VolumeTotalOriginal - iOrderRtnVec->VolumeTraded); //删除键值 //ifOrderRtn.erase(iOrderRtn); /* isBreakIn = true; break;//终止内循环 */ } } /* if(isBreakIn){ isBreakIn = false; lastpos = -1;//重新设置 ::LeaveCriticalSection(&ifDealRtn); continue; } */ //lastpos = size - 1; //iOrderRtn->second.clear();//清空就可以从0头开始检索 ::LeaveCriticalSection(&ifDealRtn); //} } else{ //还没生成消息队列,表示指令还未生效,返回继续搜索队列 ::LeaveCriticalSection(&ifDealRtn); TRACE("%s\r\n","还没生成消息队列,返回"); continue; } //成交返回处理 ::EnterCriticalSection(&ifDealRtn); if(endVolumeThisTrade == 0){ return 0; } else{ iTradeRtn = ifTradeRtn.find(thisSysId); //证明已经有成交信息返回 if(iTradeRtn != ifTradeRtn.end()){ for(iTradeRtnVec = iTradeRtn->second.begin();iTradeRtnVec != iTradeRtn->second.end();iTradeRtnVec++){ TRACE("%s报单编号是%s\r\n","成交,从TradeRtn返回,",iTradeRtn->second.begin()->OrderSysID); ::EnterCriticalSection(&avgPriceOfIf); valueTraded = valueTraded + iTradeRtnVec->Price * iTradeRtnVec->Volume; volumeTraded = volumeTraded + iTradeRtnVec->Volume; if(volumeTraded == data->numif){//全部成交 avgpIf avg(volumeTraded,valueTraded / volumeTraded); avgPriceIf.push_back(avg); ::LeaveCriticalSection(&avgPriceOfIf); //删除键值 ifTradeRtn.erase(iTradeRtn); ifOrderRtn.erase(iOrderRtn); ::LeaveCriticalSection(&ifDealRtn); return 0; } ::LeaveCriticalSection(&avgPriceOfIf); } iTradeRtn->second.clear();//将成交数组清空 } } ::LeaveCriticalSection(&ifDealRtn); if(volumeTraded == endVolumeThisTrade && endVolumeThisTrade < data->numif){//本次成交结束,但是还没有全部成交,需要重新下单 TRACE("%s\r\n","重新下单"); ::EnterCriticalSection(&g_IfPrice); if(req.Direction == THOST_FTDC_D_Buy){//BUY req.LimitPrice = ifBid1; #ifdef _debug req.LimitPrice = ifBid1; #endif } else{//SELL req.LimitPrice = ifAsk1; #ifdef _debug req.LimitPrice = ifAsk1; #endif } ::LeaveCriticalSection(&g_IfPrice); req.VolumeTotalOriginal = data->numif - endVolumeThisTrade; endVolumeThisTrade = data->numif;//重新设置 ::EnterCriticalSection(&ODREF); iNextOrderRef++; TThostFtdcOrderRefType orderRefNew; sprintf(orderRefNew,"%d", iNextOrderRef); ::LeaveCriticalSection(&ODREF); strcpy(req.OrderRef,orderRefNew); thisRef = CString(orderRefNew); ::EnterCriticalSection(&REQUEST_ID_IF); int iResult = pUserApi->ReqOrderInsert(&req, ++iRequestID); ::LeaveCriticalSection(&REQUEST_ID_IF); } //如果价格发生不利变化,取消订单 UpdateTrade.Lock(INFINITE);//等待同步事件击发 ::EnterCriticalSection(&g_IfPrice); if((req.Direction == THOST_FTDC_D_Buy && req.LimitPrice < ifBid1) ||//买 (req.Direction == THOST_FTDC_D_Sell && req.LimitPrice > ifAsk1)){//卖 if (IsTradingOrder(&orderOld)){ TRACE("%s\r\n","改单动作,删除"); ReqOrderAction(&orderOld,reqNew); } } ::LeaveCriticalSection(&g_IfPrice); } delete (IfInData*)pParam; return iResult; }