void CTraderApi::OnTrade(TradeField *pTrade) { PositionIDType positionId = { 0 }; GetPositionID(positionId, pTrade->ExchangeID, pTrade->Symbol, (PositionSide)TradeField_2_PositionSide(pTrade)); PositionField* pField = nullptr; unordered_map<string, PositionField*>::iterator it = m_id_platform_position.find(positionId); if (it == m_id_platform_position.end()) { pField = (PositionField*)m_msgQueue->new_block(sizeof(PositionField)); strcpy(pField->Symbol, pTrade->InstrumentID); strcpy(pField->InstrumentID, pTrade->InstrumentID); strcpy(pField->ExchangeID, pTrade->ExchangeID); strcpy(pField->AccountID, pTrade->AccountID); pField->Side = (PositionSide)TradeField_2_PositionSide(pTrade); pField->HedgeFlag = pTrade->HedgeFlag; m_id_platform_position.insert(pair<string, PositionField*>(positionId, pField)); } else { pField = it->second; } if (pTrade->OpenClose == OpenCloseType::OpenCloseType_Open) { pField->Position += pTrade->Qty; pField->TodayPosition += pTrade->Qty; } else { pField->Position -= pTrade->Qty; if (pTrade->OpenClose == OpenCloseType::OpenCloseType_CloseToday) { pField->TodayPosition -= pTrade->Qty; } else { pField->HistoryPosition -= pTrade->Qty; // 如果昨天的被减成负数,从今天开始继续减 if (pField->HistoryPosition < 0) { pField->TodayPosition += pField->HistoryPosition; pField->HistoryPosition = 0; } } // 计算错误,直接重新查询 if (pField->Position < 0 || pField->TodayPosition < 0 || pField->HistoryPosition < 0) { //ReqQryInvestorPosition("", ""); ReqQueryField body = { 0 }; ReqQuery(QueryType::QueryType_ReqQryInvestorPosition, &body); return; } } m_msgQueue->Input_Copy(ResponseType::ResponseType_OnRspQryInvestorPosition, m_msgQueue, m_pClass, false, 0, pField, sizeof(PositionField), nullptr, 0, nullptr, 0); }
void CTraderApi::OnTrade(TradeField *pTrade, bool bFromQry) { PositionIDType positionId = { 0 }; sprintf(positionId, "%s:%s:%d:%d", pTrade->InstrumentID, pTrade->ExchangeID, TradeField_2_PositionSide(pTrade), pTrade->HedgeFlag); PositionField* pField = nullptr; unordered_map<string, PositionField*>::iterator it = m_id_platform_position.find(positionId); if (it == m_id_platform_position.end()) { pField = new PositionField(); memset(pField, 0, sizeof(PositionField)); strcpy(pField->InstrumentID, pTrade->InstrumentID); strcpy(pField->ExchangeID, pTrade->ExchangeID); pField->Side = TradeField_2_PositionSide(pTrade); pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pTrade->HedgeFlag); m_id_platform_position.insert(pair<string, PositionField*>(positionId, pField)); } else { pField = it->second; } if (pTrade->Side == OrderSide::Buy) { pField->Position += pTrade->Qty; pField->TdPosition += pTrade->Qty; } else { pField->Position -= pTrade->Qty; if (pTrade->OpenClose == OpenCloseType::CloseToday) { pField->TdPosition -= pTrade->Qty; } else { pField->YdPosition -= pTrade->Qty; // 如果昨天的被减成负数,从今天开始继续减 if (pField->YdPosition<0) { pField->TdPosition += pField->YdPosition; pField->YdPosition = 0; } } // 计算错误,直接重新查询 if (pField->Position < 0 || pField->TdPosition < 0 || pField->YdPosition < 0) { ReqQryInvestorPosition("", ""); return; } } XRespone(ResponeType::OnRspQryInvestorPosition, m_msgQueue, this, false, 0, pField, sizeof(PositionField), nullptr, 0, nullptr, 0); }
void CTraderApi::OnTrade(TradeField *pTrade) { PositionIDType positionId = { 0 }; sprintf(positionId, "%s:%s:%d:%d", pTrade->InstrumentID, pTrade->ExchangeID, TradeField_2_PositionSide(pTrade), pTrade->HedgeFlag); PositionField* pField = nullptr; unordered_map<string, PositionField*>::iterator it = m_id_platform_position.find(positionId); if (it == m_id_platform_position.end()) { pField = (PositionField*)m_msgQueue->new_block(sizeof(PositionField)); sprintf(pField->Symbol, "%s.%s", pTrade->InstrumentID, pTrade->ExchangeID); strcpy(pField->InstrumentID, pTrade->InstrumentID); strcpy(pField->ExchangeID, pTrade->ExchangeID); pField->Side = TradeField_2_PositionSide(pTrade); pField->HedgeFlag = TSecurityFtdcHedgeFlagType_2_HedgeFlagType(pTrade->HedgeFlag); m_id_platform_position.insert(pair<string, PositionField*>(positionId, pField)); } else { pField = it->second; } if (pTrade->Side == OrderSide::OrderSide_Buy) { pField->Position += pTrade->Qty; pField->TodayPosition += pTrade->Qty; } else { pField->Position -= pTrade->Qty; if (pTrade->OpenClose == OpenCloseType::OpenCloseType_CloseToday) { pField->TodayPosition -= pTrade->Qty; } else { pField->HistoryPosition -= pTrade->Qty; // 如果昨天的被减成负数,从今天开始继续减 if (pField->HistoryPosition<0) { pField->TodayPosition += pField->HistoryPosition; pField->HistoryPosition = 0; } } // 计算错误,直接重新查询 //if (pField->Position < 0 || pField->TdPosition < 0 || pField->YdPosition < 0) //{ // ReqQryInvestorPosition("", ""); // return; //} } m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryInvestorPosition, m_msgQueue, m_pClass, false, 0, pField, sizeof(PositionField), nullptr, 0, nullptr, 0); }