void CTraderApi::OnOrder(CSecurityFtdcOrderField *pOrder, bool bFromQry) { if (nullptr == pOrder) return; OrderIDType orderId = { 0 }; sprintf(orderId, "%d:%d:%s", pOrder->FrontID, pOrder->SessionID, pOrder->OrderRef); OrderIDType orderSydId = { 0 }; { // 保存原始订单信息,用于撤单 unordered_map<string, CSecurityFtdcOrderField*>::iterator it = m_id_api_order.find(orderId); if (it == m_id_api_order.end()) { // 找不到此订单,表示是新单 CSecurityFtdcOrderField* pField = new CSecurityFtdcOrderField(); memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField)); m_id_api_order.insert(pair<string, CSecurityFtdcOrderField*>(orderId, pField)); } else { // 找到了订单 // 需要再复制保存最后一次的状态,还是只要第一次的用于撤单即可?记下,这样最后好比较 CSecurityFtdcOrderField* pField = it->second; memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField)); } // 保存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 = new OrderField(); memset(pField, 0, sizeof(OrderField)); strcpy(pField->ID, orderId); strncpy(pField->InstrumentID, pOrder->InstrumentID, sizeof(TSecurityFtdcInstrumentIDType)); strncpy(pField->ExchangeID, pOrder->ExchangeID, sizeof(TSecurityFtdcExchangeIDType)); pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pOrder->CombHedgeFlag[0]); pField->Side = TSecurityFtdcDirectionType_2_OrderSide(pOrder->Direction); pField->Price = atof(pOrder->LimitPrice); pField->StopPx = pOrder->StopPrice; strncpy(pField->Text, pOrder->StatusMsg, sizeof(TSecurityFtdcErrorMsgType)); pField->OpenClose = TSecurityFtdcOffsetFlagType_2_OpenCloseType(pOrder->CombOffsetFlag[0]); pField->Status = CSecurityFtdcOrderField_2_OrderStatus(pOrder); pField->Qty = pOrder->VolumeTotalOriginal; pField->Type = CSecurityFtdcOrderField_2_OrderType(pOrder); pField->TimeInForce = CSecurityFtdcOrderField_2_TimeInForce(pOrder); pField->ExecType = ExecType::ExecNew; strcpy(pField->OrderID, pOrder->OrderSysID); // 添加到map中,用于其它工具的读取,撤单失败时的再通知等 m_id_platform_order.insert(pair<string, OrderField*>(orderId, pField)); } else { pField = it->second; strcpy(pField->ID, orderId); pField->LeavesQty = pOrder->VolumeTotal; pField->Price = atof(pOrder->LimitPrice); pField->Status = CSecurityFtdcOrderField_2_OrderStatus(pOrder); pField->ExecType = CSecurityFtdcOrderField_2_ExecType(pOrder); strcpy(pField->OrderID, pOrder->OrderSysID); strncpy(pField->Text, pOrder->StatusMsg, sizeof(TSecurityFtdcErrorMsgType)); } XRespone(ResponeType::OnRtnOrder, m_msgQueue, this, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); } }
void CTraderApi::OnOrder(CSecurityFtdcOrderField *pOrder, int nRequestID, bool bIsLast) { if (nullptr == pOrder) return; OrderIDType orderId = { 0 }; sprintf(orderId, "%d:%d:%s", pOrder->FrontID, pOrder->SessionID, pOrder->OrderRef); OrderIDType orderSydId = { 0 }; { // 保存原始订单信息,用于撤单 unordered_map<string, CSecurityFtdcOrderField*>::iterator it = m_id_api_order.find(orderId); if (it == m_id_api_order.end()) { // 找不到此订单,表示是新单 CSecurityFtdcOrderField* pField = new CSecurityFtdcOrderField(); memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField)); m_id_api_order.insert(pair<string, CSecurityFtdcOrderField*>(orderId, pField)); } else { // 找到了订单 // 需要再复制保存最后一次的状态,还是只要第一次的用于撤单即可?记下,这样最后好比较 CSecurityFtdcOrderField* pField = it->second; memcpy(pField, pOrder, sizeof(CSecurityFtdcOrderField)); } // 保存SysID用于定义成交回报与订单 sprintf(orderSydId, "%s:%s", pOrder->ExchangeID, pOrder->OrderSysID); m_sysId_orderId.insert(pair<string, string>(orderSydId, orderId)); } { // 从API的订单转换成自己的结构体 if (nRequestID == 0) { 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)); // 开盘时发单信息还没有,所以找不到对应的单子,需要进行Order的恢复 CSecurityFtdcOrderField_2_OrderField_0(orderId, pOrder, pField); // 添加到map中,用于其它工具的读取,撤单失败时的再通知等 m_id_platform_order.insert(pair<string, OrderField*>(orderId, pField)); } else { pField = it->second; strcpy(pField->ID, orderId); strcpy(pField->LocalID, pField->ID); pField->LeavesQty = pOrder->VolumeTotal; pField->Price = atof(pOrder->LimitPrice); pField->Status = CSecurityFtdcOrderField_2_OrderStatus(pOrder); pField->ExecType = CSecurityFtdcOrderField_2_ExecType(pOrder); strcpy(pField->OrderID, pOrder->OrderSysID); strncpy(pField->Text, pOrder->StatusMsg, sizeof(Char256Type)); } m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); } else { OrderField* pField = nullptr; pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField)); // 开盘时发单信息还没有,所以找不到对应的单子,需要进行Order的恢复 CSecurityFtdcOrderField_2_OrderField_0(orderId, pOrder, pField); // 添加到map中,用于其它工具的读取,撤单失败时的再通知等 //m_id_platform_order.insert(pair<string, OrderField*>(orderId, pField)); m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryOrder, m_msgQueue, m_pClass, bIsLast, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); m_msgQueue->delete_block(pField); } } }