int CTraderApi::ReqOrderInsert( OrderField* pOrder, int count, OrderIDType* pInOut) { int OrderRef = -1; if (nullptr == m_pApi) return 0; CUstpFtdcInputOrderField body = {0}; strcpy(body.BrokerID, m_RspUserInvestor.BrokerID); strcpy(body.InvestorID, m_RspUserInvestor.InvestorID); strcpy(body.UserID, m_RspUserInvestor.UserID); strcpy(body.ExchangeID, "CFFEX"); body.MinVolume = 1; body.ForceCloseReason = USTP_FTDC_FCR_NotForceClose; body.IsAutoSuspend = 0; //body.UserForceClose = 0; //body.IsSwapOrder = 0; //合约 strncpy(body.InstrumentID, pOrder->InstrumentID, sizeof(TUstpFtdcInstrumentIDType)); //买卖 body.Direction = OrderSide_2_TUstpFtdcDirectionType(pOrder->Side); //开平 body.OffsetFlag = OpenCloseType_2_TUstpFtdcOffsetFlagType(pOrder->OpenClose); //投保 body.HedgeFlag = HedgeFlagType_2_TUstpFtdcHedgeFlagType(pOrder->HedgeFlag); //数量 body.Volume = (int)pOrder->Qty; // 对于套利单,是用第一个参数的价格,还是用两个参数的价格差呢? body.LimitPrice = pOrder->Price; body.StopPrice = pOrder->StopPx; // 市价与限价 switch (pOrder->Type) { case Market: case Stop: case MarketOnClose: case TrailingStop: body.OrderPriceType = USTP_FTDC_OPT_AnyPrice; body.TimeCondition = USTP_FTDC_TC_IOC; break; case Limit: case StopLimit: case TrailingStopLimit: default: body.OrderPriceType = USTP_FTDC_OPT_LimitPrice; body.TimeCondition = USTP_FTDC_TC_GFD; break; } // IOC与FOK switch (pOrder->TimeInForce) { case IOC: body.TimeCondition = USTP_FTDC_TC_IOC; body.VolumeCondition = USTP_FTDC_VC_AV; break; case FOK: body.TimeCondition = USTP_FTDC_TC_IOC; body.VolumeCondition = USTP_FTDC_VC_CV; //body.MinVolume = body.VolumeTotalOriginal; // 这个地方必须加吗? break; default: body.VolumeCondition = USTP_FTDC_VC_AV; break; } long long nRet = 0; { //可能报单太快,m_nMaxOrderRef还没有改变就提交了 lock_guard<mutex> cl(m_csOrderRef); if (OrderRef < 0) { nRet = m_nMaxOrderRef; ++m_nMaxOrderRef; } else { nRet = OrderRef; } sprintf(body.UserOrderLocalID, "%012lld", nRet); //不保存到队列,而是直接发送 int n = m_pApi->ReqOrderInsert(&body, ++m_lRequestID); if (n < 0) { nRet = n; sprintf(m_orderInsert_Id, "%d", nRet); } else { // 用于各种情况下找到原订单,用于进行响应的通知 sprintf(m_orderInsert_Id, "%s:%012lld", m_RspUserLogin__.SessionID, nRet); OrderField* pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField)); memcpy(pField, pOrder, sizeof(OrderField)); strcpy(pField->ID, m_orderInsert_Id); m_id_platform_order.insert(pair<string, OrderField*>(m_orderInsert_Id, pField)); } strncpy((char*)pInOut, m_orderInsert_Id, sizeof(OrderIDType)); } return nRet; }
char* CTraderApi::ReqQuoteInsert( int QuoteRef, QuoteField* pQuote) { if (nullptr == m_pApi) return 0; CUstpFtdcInputQuoteField body = {0}; strcpy(body.BrokerID, m_RspUserInvestor.BrokerID); strcpy(body.InvestorID, m_RspUserInvestor.InvestorID); strcpy(body.UserID, m_RspUserInvestor.UserID); //合约,目前只从订单1中取 strncpy(body.InstrumentID, pQuote->InstrumentID, sizeof(TUstpFtdcInstrumentIDType)); //开平 body.AskOffsetFlag = OpenCloseType_2_TUstpFtdcOffsetFlagType(pQuote->AskOpenClose); body.BidOffsetFlag = OpenCloseType_2_TUstpFtdcOffsetFlagType(pQuote->BidOpenClose); //投保 body.AskHedgeFlag = HedgeFlagType_2_TUstpFtdcHedgeFlagType(pQuote->AskHedgeFlag); body.BidHedgeFlag = HedgeFlagType_2_TUstpFtdcHedgeFlagType(pQuote->BidHedgeFlag); //价格 body.AskPrice = pQuote->AskPrice; body.BidPrice = pQuote->BidPrice; //数量 body.AskVolume = (int)pQuote->AskQty; body.BidVolume = (int)pQuote->BidQty; long long nRet = 0; { //可能报单太快,m_nMaxOrderRef还没有改变就提交了 lock_guard<mutex> cl(m_csOrderRef); if (QuoteRef < 0) { nRet = m_nMaxOrderRef; sprintf(body.UserQuoteLocalID, "%012lld", m_nMaxOrderRef); sprintf(body.AskUserOrderLocalID, "%012lld", m_nMaxOrderRef); sprintf(body.BidUserOrderLocalID, "%012lld", ++m_nMaxOrderRef); ++m_nMaxOrderRef; } else { nRet = QuoteRef; sprintf(body.UserQuoteLocalID, "%012lld", QuoteRef); sprintf(body.AskUserOrderLocalID, "%012lld", QuoteRef); sprintf(body.BidUserOrderLocalID, "%012lld", ++QuoteRef); ++QuoteRef; } //不保存到队列,而是直接发送 int n = m_pApi->ReqQuoteInsert(&body, ++m_lRequestID); if (n < 0) { nRet = n; return nullptr; } else { // 用于各种情况下找到原订单,用于进行响应的通知 sprintf(m_orderInsert_Id, "%s:%012lld", m_RspUserLogin__.SessionID, nRet); QuoteField* pField = (QuoteField*)m_msgQueue->new_block(sizeof(QuoteField)); memcpy(pField, pQuote, sizeof(QuoteField)); strcpy(pField->ID, m_orderInsert_Id); strcpy(pField->AskID, m_orderInsert_Id); sprintf(pField->BidID, "%s:%012lld", m_RspUserLogin__.SessionID, nRet + 1); m_id_platform_quote.insert(pair<string, QuoteField*>(m_orderInsert_Id, pField)); } } return m_orderInsert_Id; }