void CTraderApi::OnRspQryUserInvestor(CUstpFtdcRspUserInvestorField *pRspUserInvestor, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField)); if (!IsErrorRspInfo(pRspInfo) && pRspUserInvestor) { memcpy(&m_RspUserInvestor, pRspUserInvestor, sizeof(CUstpFtdcRspUserInvestorField)); m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::Done, 0, nullptr, 0, nullptr, 0, nullptr, 0); if (m_ServerInfo.PrivateTopicResumeType > ResumeType::Restart && (m_ServerInfo.PrivateTopicResumeType<ResumeType::Undefined)) { ReqQryOrder(); //ReqQryTrade(); //ReqQryQuote(); } } else { pField->ErrorID = pRspInfo->ErrorID; strncpy(pField->ErrorMsg, pRspInfo->ErrorMsg, sizeof(ErrorMsgType)); m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0); } }
void CSingleUser::CheckThenQueryOrder(time_t _now) { if (_now > m_QueryOrderTime) { double _queryTime = QUERY_TIME_MAX; m_QueryOrderTime = time(nullptr) + _queryTime; OutputQueryTime(m_QueryOrderTime, _queryTime, "QueryOrder"); ReqQryOrder(); } }
void CctpTrade::OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { if (_OnRspQryPosition) { PositionField f; memset(&f, 0, sizeof(PositionField)); if (pInvestorPosition) { switch (pInvestorPosition->HedgeFlag) { case THOST_FTDC_HF_Speculation: f.Hedge = Speculation; break; case THOST_FTDC_HF_Arbitrage: f.Hedge = Arbitrage; break; case THOST_FTDC_HF_Hedge: f.Hedge = Hedge; break; } switch (pInvestorPosition->PosiDirection) { case THOST_FTDC_PD_Long: f.Direction = Buy; break; default: f.Direction = Sell; break; } strcpy_s(f.InstrumentID, sizeof(f.InstrumentID), pInvestorPosition->InstrumentID); //f.Margin = pInvestorPosition->UseMargin; f.Price = pInvestorPosition->Position == 0 ? 0 : (pInvestorPosition->PositionCost / _id_instrument[pInvestorPosition->InstrumentID].VolumeMultiple / pInvestorPosition->Position); f.Position = pInvestorPosition->Position; f.TdPosition = pInvestorPosition->TodayPosition; f.YdPosition = f.Position - f.TdPosition; //pInvestorPosition->YdPosition; 平仓后不知如何计算 } ((DefOnRspQryPosition)_OnRspQryPosition)(&f, bIsLast); } if (bIsLast && !_started) { Sleep(1100); if (_session == 0) return; ReqQryOrder(); } }
void CTraderApi::OnRspUserLogin(CSecurityFtdcRspUserLoginField *pRspUserLogin, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { RspUserLoginField* pField = (RspUserLoginField*)m_msgQueue->new_block(sizeof(RspUserLoginField)); if (!IsErrorRspInfo(pRspInfo) &&pRspUserLogin) { pField->TradingDay = GetDate(pRspUserLogin->TradingDay); pField->LoginTime = GetTime(pRspUserLogin->LoginTime); sprintf(pField->SessionID, "%d:%d", pRspUserLogin->FrontID, pRspUserLogin->SessionID); m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Logined, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0); // 记下登录信息,可能会用到 memcpy(&m_RspUserLogin,pRspUserLogin,sizeof(CSecurityFtdcRspUserLoginField)); m_nMaxOrderRef = atol(pRspUserLogin->MaxOrderRef); // 自己发单时ID从1开始,不能从0开始 m_nMaxOrderRef = m_nMaxOrderRef>1 ? m_nMaxOrderRef : 1; //ReqSettlementInfoConfirm(); ReqQryInvestor(); m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Done, 0, nullptr, 0, nullptr, 0, nullptr, 0); if (m_ServerInfo.PrivateTopicResumeType > ResumeType::Restart && (m_ServerInfo.PrivateTopicResumeType<ResumeType::Undefined)) { ReqQryOrder(); //ReqQryTrade(); //ReqQryQuote(); } } else { pField->ErrorID = pRspInfo->ErrorID; strncpy(pField->ErrorMsg, pRspInfo->ErrorMsg, sizeof(ErrorMsgType)); m_msgQueue->Input_NoCopy(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0); } }