void CTraderApi::OnTrade(CUstpFtdcTradeField *pTrade) { if (nullptr == pTrade) return; TradeField* pField = (TradeField*)m_msgQueue->new_block(sizeof(TradeField)); strcpy(pField->InstrumentID, pTrade->InstrumentID); strcpy(pField->ExchangeID, pTrade->ExchangeID); pField->Side = TUstpFtdcDirectionType_2_OrderSide(pTrade->Direction); pField->Qty = pTrade->TradeVolume; pField->Price = pTrade->TradePrice; pField->OpenClose = TUstpFtdcOffsetFlagType_2_OpenCloseType(pTrade->OffsetFlag); pField->HedgeFlag = TUstpFtdcHedgeFlagType_2_HedgeFlagType(pTrade->HedgeFlag); pField->Commission = 0;//TODO收续费以后要计算出来 pField->Time = GetTime(pTrade->TradeTime); strcpy(pField->TradeID, pTrade->TradeID); //OrderIDType orderSysId = { 0 }; //sprintf(orderSysId, "%s:%s", pTrade->ExchangeID, pTrade->OrderSysID); //hash_map<string, string>::iterator it = m_sysId_orderId.find(orderSysId); //if (it == m_sysId_orderId.end()) //{ // // 此成交找不到对应的报单 // assert(false); //} //else //{ // 找到对应的报单 //strcpy(pField->ID, it->second.c_str()); //strcpy(pField->ID, pTrade->UserOrderLocalID); sprintf(pField->ID, "%s:%s", m_RspUserLogin__.SessionID, pTrade->UserOrderLocalID); m_msgQueue->Input_Copy(ResponeType::OnRtnTrade, m_msgQueue, m_pClass, 0, 0, pField, sizeof(TradeField), nullptr, 0, nullptr, 0); unordered_map<string, OrderField*>::iterator it2 = m_id_platform_order.find(pField->ID); if (it2 == m_id_platform_order.end()) { // 此成交找不到对应的报单 //assert(false); } else { // 更新订单的状态 // 是否要通知接口 } //} }
void CTraderApi::OnOrder(CUstpFtdcOrderField *pOrder) { if (nullptr == pOrder) return; OrderIDType orderId = { 0 }; sprintf(orderId, "%s:%s", m_RspUserLogin__.SessionID, pOrder->UserOrderLocalID); //OrderIDType orderSydId = { 0 }; { // 保存原始订单信息,用于撤单 unordered_map<string, CUstpFtdcOrderField*>::iterator it = m_id_api_order.find(orderId); if (it == m_id_api_order.end()) { // 找不到此订单,表示是新单 CUstpFtdcOrderField* pField = new CUstpFtdcOrderField(); memcpy(pField, pOrder, sizeof(CUstpFtdcOrderField)); m_id_api_order.insert(pair<string, CUstpFtdcOrderField*>(orderId, pField)); } else { // 找到了订单 // 需要再复制保存最后一次的状态,还是只要第一次的用于撤单即可?记下,这样最后好比较 CUstpFtdcOrderField* pField = it->second; memcpy(pField, pOrder, sizeof(CUstpFtdcOrderField)); } //// 保存SysID用于定义成交回报与订单 //sprintf(orderSydId, "%s:%s", pOrder->ExchangeID, pOrder->OrderSysID); //m_sysId_orderId.insert(pair<string, string>(orderSydId, orderId)); } { // 从API的订单转换成自己的结构体 OrderField* pField = nullptr; unordered_map<string, OrderField*>::iterator it = m_id_platform_order.find(orderId); if (it == m_id_platform_order.end()) { // 开盘时发单信息还没有,所以找不到对应的单子,需要进行Order的恢复 pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField)); strcpy(pField->ID, orderId); strcpy(pField->InstrumentID, pOrder->InstrumentID); strcpy(pField->ExchangeID, pOrder->ExchangeID); pField->HedgeFlag = TUstpFtdcHedgeFlagType_2_HedgeFlagType(pOrder->HedgeFlag); pField->Side = TUstpFtdcDirectionType_2_OrderSide(pOrder->Direction); pField->Price = pOrder->LimitPrice; pField->StopPx = pOrder->StopPrice; //strcpy(pField->Text, pOrder->StatusMsg); pField->OpenClose = TUstpFtdcOffsetFlagType_2_OpenCloseType(pOrder->OffsetFlag); pField->Status = CUstpFtdcOrderField_2_OrderStatus(pOrder); pField->Qty = pOrder->Volume; pField->Type = CUstpFtdcOrderField_2_OrderType(pOrder); pField->TimeInForce = CUstpFtdcOrderField_2_TimeInForce(pOrder); pField->ExecType = ExecType::ExecNew; strcpy(pField->OrderID, pOrder->OrderSysID); strcat(pField->Text, "OnRtnOrder"); // 添加到map中,用于其它工具的读取,撤单失败时的再通知等 m_id_platform_order.insert(pair<string, OrderField*>(orderId, pField)); } else { pField = it->second; strcpy(pField->ID, orderId); pField->LeavesQty = pOrder->VolumeRemain; pField->Price = pOrder->LimitPrice; pField->Status = CUstpFtdcOrderField_2_OrderStatus(pOrder); pField->ExecType = CUstpFtdcOrderField_2_ExecType(pOrder); strcpy(pField->OrderID, pOrder->OrderSysID); strcat(pField->Text, "OnRtnOrder"); } m_msgQueue->Input_Copy(ResponeType::OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); } }
void CTraderApi::OnQuote(CUstpFtdcRtnQuoteField *pQuote) { if (nullptr == pQuote) return; OrderIDType quoteId = { 0 }; sprintf(quoteId, "%s:%s", m_RspUserLogin__.SessionID, pQuote->UserQuoteLocalID); OrderIDType orderSydId = { 0 }; { // 保存原始订单信息,用于撤单 unordered_map<string, CUstpFtdcRtnQuoteField*>::iterator it = m_id_api_quote.find(quoteId); if (it == m_id_api_quote.end()) { // 找不到此订单,表示是新单 CUstpFtdcRtnQuoteField* pField = new CUstpFtdcRtnQuoteField(); memcpy(pField, pQuote, sizeof(CUstpFtdcRtnQuoteField)); m_id_api_quote.insert(pair<string, CUstpFtdcRtnQuoteField*>(quoteId, pField)); } else { // 找到了订单 // 需要再复制保存最后一次的状态,还是只要第一次的用于撤单即可?记下,这样最后好比较 CUstpFtdcRtnQuoteField* pField = it->second; memcpy(pField, pQuote, sizeof(CUstpFtdcRtnQuoteField)); } // 这个地方是否要进行其它处理? // 保存SysID用于定义成交回报与订单 //sprintf(orderSydId, "%s:%s", pQuote->ExchangeID, pQuote->QuoteSysID); //m_sysId_quoteId.insert(pair<string, string>(orderSydId, quoteId)); } { // 从API的订单转换成自己的结构体 QuoteField* pField = nullptr; unordered_map<string, QuoteField*>::iterator it = m_id_platform_quote.find(quoteId); if (it == m_id_platform_quote.end()) { // 开盘时发单信息还没有,所以找不到对应的单子,需要进行Order的恢复 pField = (QuoteField*)m_msgQueue->new_block(sizeof(QuoteField)); strcpy(pField->InstrumentID, pQuote->InstrumentID); strcpy(pField->ExchangeID, pQuote->ExchangeID); pField->AskQty = pQuote->AskVolume; pField->AskPrice = pQuote->AskPrice; pField->AskOpenClose = TUstpFtdcOffsetFlagType_2_OpenCloseType(pQuote->AskOffsetFlag); pField->AskHedgeFlag = TUstpFtdcHedgeFlagType_2_HedgeFlagType(pQuote->AskHedgeFlag); pField->BidQty = pQuote->BidVolume; pField->BidPrice = pQuote->BidPrice; pField->BidOpenClose = TUstpFtdcOffsetFlagType_2_OpenCloseType(pQuote->BidOffsetFlag); pField->BidHedgeFlag = TUstpFtdcHedgeFlagType_2_HedgeFlagType(pQuote->BidHedgeFlag); strcpy(pField->ID, quoteId); strcpy(pField->AskOrderID, pQuote->AskOrderSysID); strcpy(pField->BidOrderID, pQuote->BidOrderSysID); //strncpy(pField->Text, pQuote->, sizeof(ErrorMsgType)); //pField->ExecType = ExecType::ExecNew; pField->Status = CUstpFtdcRtnQuoteField_2_OrderStatus(pQuote); pField->ExecType = ExecType::ExecNew; // 添加到map中,用于其它工具的读取,撤单失败时的再通知等 m_id_platform_quote.insert(pair<string, QuoteField*>(quoteId, pField)); } else { pField = it->second; strcpy(pField->ID, quoteId); strcpy(pField->AskOrderID, pQuote->AskOrderSysID); strcpy(pField->BidOrderID, pQuote->BidOrderSysID); pField->Status = CUstpFtdcRtnQuoteField_2_OrderStatus(pQuote); pField->ExecType = CUstpFtdcRtnQuoteField_2_ExecType(pQuote); } m_msgQueue->Input_Copy(ResponeType::OnRtnQuote, m_msgQueue, m_pClass, 0, 0, pField, sizeof(QuoteField), nullptr, 0, nullptr, 0); } }